diff --git a/src/d_player.h b/src/d_player.h index 463b4ca7..80bf47f1 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -306,7 +306,8 @@ typedef enum // 0x4 = 3 Red Shells orbiting, 0x8 = Triple Red Shell in inventory k_lightning, // 0x1 = Lightning in inventory k_kitchensink, // 0x1 = Sink in inventory - k_balloon, // Number of balloons left + k_balloon, // Battle mode, number of balloons left + k_comebackhits, // Battle mode, number of times hit in comeback mode NUMKARTSTUFF } kartstufftype_t; diff --git a/src/g_game.c b/src/g_game.c index dbda2fe9..7fbba166 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 = 15*TICRATE; +INT32 comebacktime = 10*TICRATE; INT32 gameovertics = 15*TICRATE; @@ -2194,6 +2194,7 @@ void G_PlayerReborn(INT32 player) INT32 starpostwp; INT32 offroad; INT32 balloon; + INT32 comebackhits; score = players[player].score; lives = players[player].lives; @@ -2249,6 +2250,7 @@ void G_PlayerReborn(INT32 player) starpostwp = players[player].kartstuff[k_starpostwp]; offroad = players[player].kartstuff[k_offroad]; balloon = players[player].kartstuff[k_balloon]; + comebackhits = players[player].kartstuff[k_comebackhits]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2305,7 +2307,8 @@ void G_PlayerReborn(INT32 player) p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; p->kartstuff[k_balloon] = balloon; - p->kartstuff[k_comebacktimer] = comebacktime; + p->kartstuff[k_comebackhits] = comebackhits; + p->kartstuff[k_comebacktimer] = comebacktime * (comebackhits+1); // Don't do anything immediately p->pflags |= PF_USEDOWN; diff --git a/src/info.c b/src/info.c index f532187d..79433ecd 100644 --- a/src/info.c +++ b/src/info.c @@ -2881,7 +2881,7 @@ state_t states[NUMSTATES] = {SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE - {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB + {SPR_PBOM, 0, -1, {NULL}, 1, 0, S_NULL}, // S_PLAYERBOMB #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/k_kart.c b/src/k_kart.c index 744abf22..ba27a307 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1301,13 +1301,8 @@ 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 - else if (player->speed == 0) + 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); @@ -1434,6 +1429,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; + if (player->kartstuff[k_comebackhits] > 5) + player->kartstuff[k_comebackhits] = 5; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -1600,7 +1598,10 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) break; } - k_speed += player->kartspeed*3; // 153 - 177 + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + k_speed += 3; // 153 + else + k_speed += player->kartspeed*3; // 153 - 177 finalspeed = FixedMul(FixedMul(k_speed<<14, g_cc), player->mo->scale); @@ -1613,8 +1614,11 @@ static fixed_t K_GetKartAccel(player_t *player) { fixed_t k_accel = 32; // 36; - //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 - k_accel += 4 * (9 - player->kartspeed); // 32 - 64 + if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) + { + //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 + k_accel += 4 * (9 - player->kartspeed); // 32 - 64 + } return FixedMul(k_accel, K_GetKartBoostPower(player, false)); } @@ -1671,7 +1675,6 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1681,16 +1684,17 @@ void K_SpinPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + if (player->kartstuff[k_spinouttype] <= 0) { if (player->kartstuff[k_spinouttype] == 0) @@ -1731,7 +1735,6 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1741,16 +1744,17 @@ void K_SquishPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_squishedtimer] = 1*TICRATE; player->powers[pw_flashing] = flashingtics; @@ -1780,7 +1784,6 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1790,16 +1793,17 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; @@ -2509,9 +2513,16 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) static void K_KartDrift(player_t *player, boolean onground) { + fixed_t dsone; + fixed_t dstwo; + // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - fixed_t dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); - fixed_t dstwo = dsone*2; + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + dsone = 26*4 + 2; + else + dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); + + dstwo = dsone*2; // Drifting is actually straffing + automatic turning. // Holding the Jump button will enable drifting. @@ -3287,23 +3298,38 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (player->kartstuff[k_bootimer] == 0) { - 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->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_SHADOW; - player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; - } + if (!(player->mo->tracer)) + player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); + + P_SetTarget(&player->mo->tracer->target, player->mo); + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + player->mo->tracer->color = player->mo->color; + + if (player->kartstuff[k_comebacktimer] > 0) + { + if (leveltime & 1) + player->mo->tracer->flags2 |= MF2_DONTDRAW; else - player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + + player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } - else if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) - player->mo->flags2 &= ~MF2_DONTDRAW; + else + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + } + else if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) + { + player->mo->flags2 &= ~MF2_SHADOW; + if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) + P_RemoveMobj(player->mo->tracer); } } @@ -3381,6 +3407,11 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; +// Quick thing for testing comeback in splitscreen +#if 0 + return; +#endif + if (!(multiplayer || netgame)) return; @@ -4236,10 +4267,13 @@ static void K_drawKartSpeedometer(void) fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; + fixed_t range = RING_DIST/4; angle_t diff; + range *= (K_GetKartCC()/50); + dist = abs(R_PointToDist2(px, py, mx, my)); - if (dist > RING_DIST/4) + if (dist > range) return -320; diff = R_PointToAngle2(px, py, mx, my) - ang; diff --git a/src/p_map.c b/src/p_map.c index 0a2903c1..846d1cd1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1621,34 +1621,41 @@ static boolean PIT_CheckThing(mobj_t *thing) { thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; + if (tmthing->player->kartstuff[k_balloon] > 0) { if (tmthing->player->kartstuff[k_balloon] == 1) K_StealBalloon(thing->player, tmthing->player); - thing->player->kartstuff[k_comebacktimer] = comebacktime; + K_ExplodePlayer(tmthing->player, thing); + + thing->player->kartstuff[k_comebackhits]++; + thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); return true; } else if (thing->player->kartstuff[k_balloon] > 0) { if (thing->player->kartstuff[k_balloon] == 1) K_StealBalloon(tmthing->player, thing->player); - tmthing->player->kartstuff[k_comebacktimer] = comebacktime; - K_ExplodePlayer(thing->player, thing); + + K_ExplodePlayer(thing->player, tmthing); + + tmthing->player->kartstuff[k_comebackhits]++; + tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); return true; } - } - else - { - if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + else if (thing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_balloon] <= 0) { - K_StealBalloon(thing->player, tmthing->player); - K_SpinPlayer(tmthing->player, thing); - } - else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) - { - K_StealBalloon(tmthing->player, thing->player); + K_KartBouncing(tmthing, thing, false); + K_SpinPlayer(thing->player, tmthing); + K_SpinPlayer(tmthing->player, thing); + + thing->player->kartstuff[k_comebackhits]++; + thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); + tmthing->player->kartstuff[k_comebackhits]++; + tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); + return true; } } } @@ -1660,6 +1667,17 @@ static boolean PIT_CheckThing(mobj_t *thing) else K_KartBouncing(tmthing, thing, false); + if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(thing->player, tmthing->player); + K_SpinPlayer(tmthing->player, thing); + } + else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(tmthing->player, thing->player); + K_SpinPlayer(thing->player, tmthing); + } + thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; return true; diff --git a/src/p_mobj.c b/src/p_mobj.c index 241b1581..2aa44891 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6456,8 +6456,16 @@ void P_MobjThinker(mobj_t *mobj) //{ SRB2kart mobs case MT_DRIFT: { - fixed_t dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); - fixed_t dstwo = dsone*2; + fixed_t dsone; + fixed_t dstwo; + + if (gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0) + dsone = 26*4 + 2 + (9 - mobj->target->player->kartweight); + else + dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); + + dstwo = dsone*2; + if ((mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) && (mobj->type == MT_DRIFT && mobj->target->player->kartstuff[k_driftcharge] >= dsone)) { @@ -6696,6 +6704,7 @@ void P_MobjThinker(mobj_t *mobj) if ((splitscreen || !netgame) || gametype == GT_RACE || mobj->target->player == &players[displayplayer] + || mobj->target->player->kartstuff[k_balloon] <= 0 || (mobj->target->player->mo->flags2 & MF2_DONTDRAW)) mobj->flags2 |= MF2_DONTDRAW; else diff --git a/src/p_user.c b/src/p_user.c index 00d01e15..02d545ae 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8694,7 +8694,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } // Make player translucent if camera is too close (only in single player). - if (!(multiplayer || netgame) && !splitscreen) + /*if (!(multiplayer || netgame) && !splitscreen) { fixed_t vx = 0, vy = 0; if (player->awayviewtics) { @@ -8713,7 +8713,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall player->mo->flags2 &= ~MF2_SHADOW; } else - player->mo->flags2 &= ~MF2_SHADOW; + player->mo->flags2 &= ~MF2_SHADOW;*/ /* if (!resetcalled && (player->pflags & PF_NIGHTSMODE && player->exiting)) {