diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 6de3b348..f25203fb 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -163,7 +163,7 @@ typedef struct UINT16 powers[NUMPOWERS]; INT32 kartstuff[NUMKARTSTUFF]; // SRB2kart - UINT8 collide[MAXPLAYERS]; // SRB2kart + angle_t frameangle; // SRB2kart // Score is resynched in the confirm resync packet INT32 health; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1e586d79..8f583f20 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -317,7 +317,7 @@ consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t speedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; diff --git a/src/d_player.h b/src/d_player.h index 7cb28aa9..463b4ca7 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -370,7 +370,6 @@ typedef struct player_s // SRB2kart stuff INT32 kartstuff[NUMKARTSTUFF]; - angle_t frameangle; // for the player add the ability to have the sprite only face other angles // Bit flags. diff --git a/src/g_game.c b/src/g_game.c index 6637a77d..845bbac1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -205,7 +205,7 @@ INT32 bootime = 7*TICRATE; INT32 boostealtime = TICRATE/2; INT32 mushroomtime = TICRATE + (TICRATE/3); INT32 itemtime = 8*TICRATE; -INT32 comebacktime = 5*TICRATE; +INT32 comebacktime = 15*TICRATE; INT32 gameovertics = 15*TICRATE; diff --git a/src/k_kart.c b/src/k_kart.c index cfc43601..088936d5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1092,6 +1092,17 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) momdifx = mobj1->momx - mobj2->momx; momdify = mobj1->momy - mobj2->momy; + + // if the speed difference is less than this let's assume they're going proportionately faster from each other + if (P_AproxDistance(momdifx, momdify) < 25*FRACUNIT/2) + { + fixed_t momdiflength = P_AproxDistance(momdifx, momdify); + fixed_t normalisedx = FixedDiv(momdifx, momdiflength); + fixed_t normalisedy = FixedDiv(momdify, momdiflength); + momdifx = FixedMul(25*FRACUNIT/2, normalisedx); + momdify = FixedMul(25*FRACUNIT/2, normalisedy); + } + distx = mobj1->x - mobj2->x; disty = mobj1->y - mobj2->y; dot = FixedMul(momdifx, distx) + FixedMul(momdify, disty); @@ -1276,8 +1287,13 @@ void K_LakituChecker(player_t *player) void K_KartMoveAnimation(player_t *player) { ticcmd_t *cmd = &player->cmd; + // Battle Mode bomb overrides everything else + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + { + P_SetPlayerMobjState(player->mo, S_PLAYERBOMB); + } // Standing frames - S_KART_STND1 S_KART_STND1_L S_KART_STND1_R - if (player->speed == 0) + else if (player->speed == 0) { if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) P_SetPlayerMobjState(player->mo, S_KART_STND1_R); @@ -1633,7 +1649,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) return; - if (source && source->player && !source->player->kartstuff[k_sounds]) + if (source && source != player->mo && source->player && !source->player->kartstuff[k_sounds]) { S_StartSound(source, sfx_hitem); source->player->kartstuff[k_sounds] = 50; @@ -1840,7 +1856,8 @@ void K_StealBalloon(player_t *player, player_t *victim) return; } -void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit) +// source is the mobj that originally threw the bomb that exploded etc. +void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source) { mobj_t *mobj; mobj_t *ghost = NULL; @@ -1920,6 +1937,7 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 mobj->flags |= MF_NOCLIPTHING; mobj->flags &= ~MF_SPECIAL; + P_SetTarget(&mobj->target, source); } } @@ -1999,7 +2017,7 @@ void K_SpawnDriftTrail(player_t *player) for (i = 0; i < 2; i++) { - if (player->kartstuff[k_bootimer] != 0 || (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0)) + if (player->kartstuff[k_bootimer] != 0 || (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer])) continue; newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale)); @@ -3249,31 +3267,26 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (player->kartstuff[k_bootimer] == 0) { - player->mo->flags2 &= ~MF2_DONTDRAW; + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb + { + K_StripItems(player); + if (player->kartstuff[k_comebacktimer] > 0) + { + if (leveltime & 1) + player->mo->flags2 |= MF2_DONTDRAW; + else + player->mo->flags2 &= ~MF2_DONTDRAW; + + player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; + } + else + player->mo->flags2 &= ~MF2_DONTDRAW; + } + else if (player->kartstuff[k_balloon] > 0) + player->mo->flags2 &= ~MF2_DONTDRAW; } } - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb - { - K_StripItems(player); - player->mo->flags2 |= MF2_DONTDRAW; - - if (player->kartstuff[k_comebacktimer]) - player->powers[pw_flashing] = 2; - - if (!(player->mo->tracer)) - player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); - - P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); - P_SetTarget(&player->mo->tracer, player->mo); - player->mo->tracer->color = player->mo->color; - } - else if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) - { - player->mo->flags2 &= ~MF2_DONTDRAW; - P_RemoveMobj(player->mo->tracer); - } - if (player->kartstuff[k_growshrinktimer] > 1) player->powers[pw_flashing] = 2; diff --git a/src/k_kart.h b/src/k_kart.h index 92055e5f..f7be4204 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -16,14 +16,14 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); UINT8 K_GetKartCC(void); -void K_KartMoveAnimation(player_t *player); void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); +void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); void K_StealBalloon(player_t *player, player_t *victim); -void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit); +void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); diff --git a/src/p_enemy.c b/src/p_enemy.c index 2a0be039..e7bf5b07 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8252,7 +8252,7 @@ void A_BobombExplode(mobj_t *actor) type = (mobjtype_t)locvar1; for (d = 0; d < 16; d++) - K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), false, false); // 32 <-> 64 + K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), false, false, actor->target); // 32 <-> 64 P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOMBEXPLOSIONSOUND); diff --git a/src/p_inter.c b/src/p_inter.c index a75c4e53..acda04be 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3130,7 +3130,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { // Just need to do this now! Being thrown upwards is done by the explosion. P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); - P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); + mobj_t *blueexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); + P_SetTarget(&blueexplode->target, source); return true; } else if (damage == 65 && player->kartstuff[k_position] > 1) diff --git a/src/p_mobj.c b/src/p_mobj.c index b11ca79b..241b1581 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6544,7 +6544,6 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { - fixed_t HEIGHT; fixed_t radius; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) @@ -6563,18 +6562,6 @@ void P_MobjThinker(mobj_t *mobj) else mobj->angle = (mobj->target->angle + ANGLE_180); - // If the player is on the ceiling, then flip your items as well. - if (mobj->target->eflags & MFE_VERTICALFLIP) - { - mobj->eflags |= MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 2; - } - else - { - mobj->eflags &= ~MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 5; - } - // Shrink your items if the player shrunk too. mobj->scale = mobj->target->scale; @@ -6701,23 +6688,19 @@ void P_MobjThinker(mobj_t *mobj) case MT_PLAYERARROW: if (mobj->target && mobj->target->health && mobj->target->player && mobj->target->player->mo - && mobj->target->player->health && mobj->target->player->playerstate != PST_DEAD - && !(gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0)) + && mobj->target->player->health && mobj->target->player->playerstate != PST_DEAD) { fixed_t scale = mobj->target->scale; mobj->color = mobj->target->color; - if (mobj->target->player == &players[displayplayer]) + if ((splitscreen || !netgame) + || gametype == GT_RACE + || mobj->target->player == &players[displayplayer] + || (mobj->target->player->mo->flags2 & MF2_DONTDRAW)) mobj->flags2 |= MF2_DONTDRAW; else mobj->flags2 &= ~MF2_DONTDRAW; - if ((splitscreen || !netgame) - || gametype == GT_RACE - || mobj->target->player->kartstuff[k_bootimer] - || (mobj->target->player->kartstuff[k_balloon] <= 0 && mobj->target->player->kartstuff[k_comebacktimer])) - mobj->flags2 |= MF2_DONTDRAW; - P_UnsetThingPosition(mobj); mobj->x = mobj->target->x; mobj->y = mobj->target->y; diff --git a/src/p_user.c b/src/p_user.c index e56ee5f3..00d01e15 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1010,6 +1010,9 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) if (player->bot) player = &players[consoleplayer]; + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + return; + // NiGHTS does it different! if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->typeoflevel & TOL_NIGHTS) { @@ -9459,7 +9462,7 @@ void P_PlayerThink(player_t *player) { // SRB2kart - fixes boo not flashing when it should. Mega doesn't flash either. Flashing is local. if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) - && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0) + && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_comebacktimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0) { if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < flashingtics && (leveltime & 1)) player->mo->flags2 |= MF2_DONTDRAW;