From 16e1569af1ef5ae24b34e4529757348ba430cb6d Mon Sep 17 00:00:00 2001 From: SeventhSentinel Date: Sun, 24 Jun 2018 22:15:22 -0400 Subject: [PATCH] Lakitu murder & countdown improvements (I'm not SevenethSentienel! I just don't feel like logging out!) --- src/d_netcmd.c | 2 +- src/d_player.h | 6 +- src/dehacked.c | 11 +- src/doomstat.h | 1 + src/g_game.c | 7 +- src/info.c | 17 ++- src/info.h | 9 +- src/k_kart.c | 304 ++++++++++++++----------------------------------- src/k_kart.h | 2 +- src/p_enemy.c | 2 +- src/p_mobj.c | 6 +- src/p_setup.c | 2 +- src/p_spec.c | 2 +- src/p_user.c | 27 +++-- src/st_stuff.c | 8 +- 15 files changed, 142 insertions(+), 264 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 412de131..ab5852ed 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1157,7 +1157,7 @@ UINT8 CanChangeSkin(INT32 playernum) return true; // Can change skin during initial countdown. - if (leveltime < 4*TICRATE) + if (leveltime < starttime) return true; if (G_TagGametype()) diff --git a/src/d_player.h b/src/d_player.h index bf4e91bf..cb60ee6f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -274,10 +274,10 @@ typedef enum k_nextcheck, // Next checkpoint distance; for p_user.c (was "pw_ncd") k_waypoint, // Waypoints. k_starpostwp, // Temporarily stores player waypoint for... some reason. Used when respawning and finishing. - k_lakitu, // Timer for Lakitu to carry and drop the player + k_respawn, // Timer for the DEZ laser respawn effect k_throwdir, // Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir") - k_lapanimation, // Used to make a swoopy lap lakitu, maybe other effects in the future + //k_lapanimation, // Used to make a swoopy lap lakitu, maybe other effects in the future k_cardanimation, // Used to determine the position of some full-screen Battle Mode graphics k_voices, // Used to stop the player saying more voices than it should k_tauntvoices, // Used to specifically stop taunt voice spam @@ -289,7 +289,7 @@ typedef enum k_driftend, // Drift has ended, used to adjust character angle after drift k_driftcharge, // Charge your drift so you can release a burst of speed k_driftboost, // Boost you get from drifting - k_boostcharge, // Charge-up for boosting at the start of the race, or when Lakitu drops you + k_boostcharge, // Charge-up for boosting at the start of the race, or when dropping from respawn k_jmp, // In Mario Kart, letting go of the jump button stops the drift k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed k_pogospring, // Pogo spring bounce effect diff --git a/src/dehacked.c b/src/dehacked.c index 299ec4b3..7b53d593 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6437,9 +6437,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_BATTLEBALLOON2", "S_BATTLEBALLOON3", - // Lakitu - "S_LAKITU1", - "S_LAKITU2", + // DEZ respawn laser + "S_DEZLASER", // Pokey "S_POKEY1", @@ -7165,7 +7164,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_BATTLEBALLOON", // Battle Mode balloon - "MT_LAKITU", + "MT_DEZLASER", "MT_POKEY", // Huh, thought this was a default asset for some reason, guess not. @@ -7565,10 +7564,10 @@ static const char *const KARTSTUFF_LIST[] = { "NEXTCHECK", "WAYPOINT", "STARPOSTWP", - "LAKITU", + "RESPAWN", "THROWDIR", - "LAPANIMATION", + //"LAPANIMATION", "CARDANIMATION", "VOICES", "TAUNTVOICES", diff --git a/src/doomstat.h b/src/doomstat.h index cf87ad97..33ce04c9 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -409,6 +409,7 @@ extern UINT16 spacetimetics; extern UINT16 extralifetics; // SRB2kart +extern tic_t starttime; extern INT32 hyudorotime; extern INT32 stealtime; extern INT32 sneakertime; diff --git a/src/g_game.c b/src/g_game.c index 0e1648c8..c73db542 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -207,6 +207,7 @@ UINT16 spacetimetics = 11*TICRATE + (TICRATE/2); UINT16 extralifetics = 4*TICRATE; // SRB2kart +tic_t starttime = 6*TICRATE + (3*TICRATE/4); INT32 hyudorotime = 7*TICRATE; INT32 stealtime = TICRATE/2; INT32 sneakertime = TICRATE + (TICRATE/3); @@ -1507,7 +1508,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // SRB2kart - no additional angle if not moving if (((player->mo && player->speed > 0) // Moving - || (leveltime > 140 && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn + || (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn || (player->spectator || objectplacing)) // Not a physical player && !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout lang += (cmd->angleturn<<16); @@ -2435,8 +2436,8 @@ void G_PlayerReborn(INT32 player) P_RestoreMusic(p); - if (leveltime > 157 && !p->spectator) - p->kartstuff[k_lakitu] = 48; // Lakitu Spawner + if (leveltime > (starttime + (TICRATE/2)) && !p->spectator) + p->kartstuff[k_respawn] = 48; // Respawn effect if (gametype == GT_COOP) P_FindEmerald(); // scan for emeralds to hunt for diff --git a/src/info.c b/src/info.c index aa7267f6..642aaa44 100644 --- a/src/info.c +++ b/src/info.c @@ -57,7 +57,7 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","KFRE","KINV","KINF","DRIF","DUST","FITM", "BANA","GSHE","JAWZ","SSMN","KRBM","BLIG","LIGH","SINK","SITR","KBLN", - "LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", + "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO","ITEM","ITMI", "ITMN","PBOM" }; @@ -2763,8 +2763,7 @@ state_t states[NUMSTATES] = {SPR_KBLN, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 {SPR_KBLN, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 - {SPR_LAKI, 0, 64, {NULL}, 1, 0, S_LAKITU2}, // S_LAKITU1 - {SPR_LAKI, 1, 35, {NULL}, 0, 0, S_NULL}, // S_LAKITU2 + {SPR_DEZL, 0|FF_FULLBRIGHT, 8, {NULL}, 0, 0, S_NULL}, // S_DEZLASER {SPR_POKE, 0, 2, {A_MoveAbsolute}, 0, 2, S_POKEY2}, // S_POKEY1 {SPR_POKE, 1, 2, {A_MoveAbsolute}, 0, 2, S_POKEY3}, // S_POKEY2 @@ -15075,9 +15074,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_LAKITU + { // MT_DEZLASER -1, // doomednum - S_LAKITU1, // spawnstate + S_DEZLASER, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound @@ -15092,13 +15091,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 64*FRACUNIT, // radius - 57*FRACUNIT, // height - 0, // display offset + 42*FRACUNIT, // radius + 8*FRACUNIT, // height + 1, // display offset 16, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY, // flags + MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/info.h b/src/info.h index ed1c53a7..519b55e1 100644 --- a/src/info.h +++ b/src/info.h @@ -600,7 +600,7 @@ typedef enum sprite SPR_SITR, // Kitchen Sink Trail SPR_KBLN, // Battle Mode Balloon - SPR_LAKI, // Lakitu + SPR_DEZL, // DEZ Laser respawn // Additional Kart Objects SPR_POKE, // Pokey @@ -3279,9 +3279,8 @@ typedef enum state S_BATTLEBALLOON2, S_BATTLEBALLOON3, - // Lakitu - S_LAKITU1, - S_LAKITU2, + // DEZ Laser respawn + S_DEZLASER, // Pokey S_POKEY1, @@ -4024,7 +4023,7 @@ typedef enum mobj_type MT_BATTLEBALLOON, // Battle Mode balloons - MT_LAKITU, + MT_DEZLASER, MT_POKEY, // Huh, thought this was a default asset for some reason, guess not. diff --git a/src/k_kart.c b/src/k_kart.c index 7b1ced80..0ab13627 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -919,8 +919,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) || (mobj2->player && mobj2->player->playerstate != PST_LIVE)) return; - if ((mobj1->player && mobj1->player->kartstuff[k_lakitu]) - || (mobj2->player && mobj2->player->kartstuff[k_lakitu])) + if ((mobj1->player && mobj1->player->kartstuff[k_respawn]) + || (mobj2->player && mobj2->player->kartstuff[k_respawn])) return; // Don't bump if you've recently bumped @@ -1100,51 +1100,45 @@ static void K_UpdateOffroad(player_t *player) player->kartstuff[k_offroad] = 0; } -/** \brief Calculates the lakitu timer and drop-boosting +/** \brief Calculates the respawn timer and drop-boosting \param player player object passed from K_KartPlayerThink \return void */ -void K_LakituChecker(player_t *player) +void K_RespawnChecker(player_t *player) { ticcmd_t *cmd = &player->cmd; - /*if (player->kartstuff[k_lakitu] == 44) + if (player->kartstuff[k_respawn] > 3) { - mobj_t *mo; - angle_t newangle; - fixed_t newx; - fixed_t newy; - fixed_t newz; - newangle = player->mo->angle; - newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 0); - newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 0); - if (player->mo->eflags & MFE_VERTICALFLIP) - newz = player->mo->z - 128*(mapheaderinfo[gamemap-1]->mobj_scale); - else - newz = player->mo->z + 64*(mapheaderinfo[gamemap-1]->mobj_scale); - mo = P_SpawnMobj(newx, newy, newz, MT_LAKITU); - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - mo->eflags |= MFE_VERTICALFLIP; - mo->angle = newangle+ANGLE_180; - P_SetTarget(&mo->target, player->mo); - } - }*/ - - if (player->kartstuff[k_lakitu] > 3) - { - player->kartstuff[k_lakitu]--; + player->kartstuff[k_respawn]--; player->mo->momz = 0; player->powers[pw_flashing] = 2; player->powers[pw_nocontrol] = 2; - if (leveltime % 15 == 0) - S_StartSound(player->mo, sfx_lkt3); + if (leveltime % 8 == 0) + { + mobj_t *mo; + fixed_t newz; + + S_StartSound(player->mo, sfx_s3kcas); + + if (player->mo->eflags & MFE_VERTICALFLIP) + newz = player->mo->z + player->mo->height; + else + newz = player->mo->z; + mo = P_SpawnMobj(player->mo->x, player->mo->y, newz, MT_DEZLASER); + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + P_SetTarget(&mo->target, player->mo); + mo->momz = (8*FRACUNIT)*P_MobjFlip(player->mo); + } + } } - // That's enough pointless fishing for now. - if (player->kartstuff[k_lakitu] > 0 && player->kartstuff[k_lakitu] <= 3) + + if (player->kartstuff[k_respawn] > 0 && player->kartstuff[k_respawn] <= 3) { if (!P_IsObjectOnGround(player->mo)) { @@ -1154,12 +1148,12 @@ void K_LakituChecker(player_t *player) if (cmd->buttons & BT_ACCELERATE) { player->powers[pw_flashing] = 0; - player->kartstuff[k_lakitu] = 0; + player->kartstuff[k_respawn] = 0; } } else { - player->kartstuff[k_lakitu]--; + player->kartstuff[k_respawn]--; // Quick! You only have three tics to boost! if (cmd->buttons & BT_ACCELERATE) K_DoSneaker(player, true); @@ -1240,7 +1234,7 @@ static void K_PlayOvertakeSound(mobj_t *source) return; // 4 seconds from before race begins, 10 seconds afterwards - if (leveltime < 14*TICRATE) + if (leveltime < starttime+(10*TICRATE)) return; S_StartSound(source, sfx_slow); @@ -2552,8 +2546,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_deathsentence]--; } - if (player->kartstuff[k_lapanimation]) - player->kartstuff[k_lapanimation]--; + /*if (player->kartstuff[k_lapanimation]) + player->kartstuff[k_lapanimation]--;*/ if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) { @@ -2606,9 +2600,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) else player->kartstuff[k_jmp] = 0; - // Lakitu Checker - if (player->kartstuff[k_lakitu]) - K_LakituChecker(player); + // Respawn Checker + if (player->kartstuff[k_respawn]) + K_RespawnChecker(player); // Roulette Code K_KartItemRoulette(player, cmd); @@ -2639,7 +2633,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_smkinv); // Plays the music after the starting countdown. - if (P_IsLocalPlayer(player) && leveltime == 158) + if (P_IsLocalPlayer(player) && leveltime == (starttime + (TICRATE/2))) S_ChangeMusicInternal(mapmusname, true); } @@ -2960,7 +2954,7 @@ static void K_KartUpdatePosition(player_t *player) } } - if (leveltime < 4*TICRATE || oldposition == 0) + if (leveltime < starttime || oldposition == 0) oldposition = position; if (oldposition != position) // Changed places? @@ -3493,7 +3487,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Quick Turning // You can't turn your kart when you're not moving. // So now it's time to burn some rubber! - if (player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE && cmd->driftturn != 0) + if (player->speed < 2 && leveltime > starttime && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE && cmd->driftturn != 0) { if (leveltime % 20 == 0) S_StartSound(player->mo, sfx_mkslid); @@ -3513,22 +3507,24 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->momy = 0; } - // Play the stop light's sounds - if ((leveltime == (TICRATE-4)*2) || (leveltime == (TICRATE-2)*3)) - S_StartSound(NULL, sfx_lkt1); - if (leveltime == (TICRATE)*4) - S_StartSound(NULL, sfx_lkt2); + // Play the starting countdown sounds + if ((leveltime == starttime-(3*TICRATE)) || (leveltime == starttime-(2*TICRATE)) || (leveltime == starttime-TICRATE)) + S_StartSound(NULL, sfx_s3ka7); + if (leveltime == starttime) + S_StartSound(NULL, sfx_s3kad); + // Start charging once you're given the opportunity. - if (leveltime >= 70 && leveltime <= 140 && cmd->buttons & BT_ACCELERATE) + if (leveltime >= starttime-(2*TICRATE) && leveltime <= starttime && cmd->buttons & BT_ACCELERATE) player->kartstuff[k_boostcharge]++; - if (leveltime >= 70 && leveltime <= 140 && !(cmd->buttons & BT_ACCELERATE)) + if (leveltime >= starttime-(2*TICRATE) && leveltime <= starttime && !(cmd->buttons & BT_ACCELERATE)) player->kartstuff[k_boostcharge] = 0; + // Increase your size while charging your engine. - if (leveltime < 150) + if (leveltime < starttime+10) player->mo->destscale = (mapheaderinfo[gamemap-1]->mobj_scale) + (player->kartstuff[k_boostcharge]*131); // Determine the outcome of your charge. - if (leveltime > 140 && player->kartstuff[k_boostcharge]) + if (leveltime > starttime && player->kartstuff[k_boostcharge]) { // Get an instant boost! if (player->kartstuff[k_boostcharge] >= 35 && player->kartstuff[k_boostcharge] <= 50) @@ -3602,7 +3598,6 @@ void K_CheckBalloons(void) //{ SRB2kart HUD Code -#define NUMLAKIFRAMES 13 #define NUMPOSNUMS 10 #define NUMPOSFRAMES 7 // White, three blues, three reds @@ -3620,8 +3615,7 @@ static patch_t *kp_karmasticker; static patch_t *kp_splitkarmabomb; static patch_t *kp_timeoutsticker; -static patch_t *kp_lakitustart[NUMLAKIFRAMES]; -static patch_t *kp_lakitulaps[17]; +static patch_t *kp_startcountdown[8]; static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; static patch_t *kp_winnernum[NUMPOSFRAMES]; @@ -3687,39 +3681,15 @@ void K_LoadKartHUDGraphics(void) kp_splitkarmabomb = W_CachePatchName("K_SPTKRM", PU_HUDGFX); kp_timeoutsticker = W_CachePatchName("K_STTOUT", PU_HUDGFX); - // Lakitu Start-up Frames - kp_lakitustart[0] = W_CachePatchName("K_LAKISA", PU_HUDGFX); - kp_lakitustart[1] = W_CachePatchName("K_LAKISB", PU_HUDGFX); - kp_lakitustart[2] = W_CachePatchName("K_LAKISC", PU_HUDGFX); - kp_lakitustart[3] = W_CachePatchName("K_LAKISD", PU_HUDGFX); - kp_lakitustart[4] = W_CachePatchName("K_LAKISE", PU_HUDGFX); - kp_lakitustart[5] = W_CachePatchName("K_LAKISF", PU_HUDGFX); - kp_lakitustart[6] = W_CachePatchName("K_LAKISG", PU_HUDGFX); - kp_lakitustart[7] = W_CachePatchName("K_LAKISH", PU_HUDGFX); - kp_lakitustart[8] = W_CachePatchName("K_LAKISI", PU_HUDGFX); - kp_lakitustart[9] = W_CachePatchName("K_LAKISJ", PU_HUDGFX); - kp_lakitustart[10] = W_CachePatchName("K_LAKISK", PU_HUDGFX); - kp_lakitustart[11] = W_CachePatchName("K_LAKISL", PU_HUDGFX); - kp_lakitustart[12] = W_CachePatchName("K_LAKISM", PU_HUDGFX); - - // Lakitu Lap Frames - kp_lakitulaps[0] = W_CachePatchName("K_LAKIL2", PU_HUDGFX); - kp_lakitulaps[1] = W_CachePatchName("K_LAKIL3", PU_HUDGFX); - kp_lakitulaps[2] = W_CachePatchName("K_LAKIL4", PU_HUDGFX); - kp_lakitulaps[3] = W_CachePatchName("K_LAKIL5", PU_HUDGFX); - kp_lakitulaps[4] = W_CachePatchName("K_LAKIL6", PU_HUDGFX); - kp_lakitulaps[5] = W_CachePatchName("K_LAKIL7", PU_HUDGFX); - kp_lakitulaps[6] = W_CachePatchName("K_LAKIL8", PU_HUDGFX); - kp_lakitulaps[7] = W_CachePatchName("K_LAKIL9", PU_HUDGFX); - kp_lakitulaps[8] = W_CachePatchName("K_LAKILF", PU_HUDGFX); - kp_lakitulaps[9] = W_CachePatchName("K_LAKIF1", PU_HUDGFX); - kp_lakitulaps[10] = W_CachePatchName("K_LAKIF2", PU_HUDGFX); - kp_lakitulaps[11] = W_CachePatchName("K_LAKIF3", PU_HUDGFX); - kp_lakitulaps[12] = W_CachePatchName("K_LAKIF4", PU_HUDGFX); - kp_lakitulaps[13] = W_CachePatchName("K_LAKIF5", PU_HUDGFX); - kp_lakitulaps[14] = W_CachePatchName("K_LAKIF6", PU_HUDGFX); - kp_lakitulaps[15] = W_CachePatchName("K_LAKIF7", PU_HUDGFX); - kp_lakitulaps[16] = W_CachePatchName("K_LAKIF8", PU_HUDGFX); + // Starting countdown + kp_startcountdown[0] = W_CachePatchName("K_CNT3A", PU_HUDGFX); + kp_startcountdown[1] = W_CachePatchName("K_CNT2A", PU_HUDGFX); + kp_startcountdown[2] = W_CachePatchName("K_CNT1A", PU_HUDGFX); + kp_startcountdown[3] = W_CachePatchName("K_CNTGOA", PU_HUDGFX); + kp_startcountdown[4] = W_CachePatchName("K_CNT3B", PU_HUDGFX); + kp_startcountdown[5] = W_CachePatchName("K_CNT2B", PU_HUDGFX); + kp_startcountdown[6] = W_CachePatchName("K_CNT1B", PU_HUDGFX); + kp_startcountdown[7] = W_CachePatchName("K_CNTGOB", PU_HUDGFX); // Position numbers for (i = 0; i < NUMPOSNUMS; i++) @@ -3802,7 +3772,7 @@ INT32 LAPS_X, LAPS_Y; // Lap Sticker INT32 SPDM_X, SPDM_Y; // Speedometer INT32 POSI_X, POSI_Y; // Position Number INT32 FACE_X, FACE_Y; // Top-four Faces -INT32 LAKI_X, LAKI_Y; // Lakitu +INT32 STCD_X, STCD_Y; // Starting countdown INT32 CHEK_Y; // CHECK graphic INT32 MINI_X, MINI_Y; // Minimap INT32 SPBW_X, SPBW_Y; // SPB warning @@ -3862,9 +3832,9 @@ static void K_initKartHUD(void) // Top-Four Faces FACE_X = 9; // 9 FACE_Y = 92; // 92 - // Lakitu - LAKI_X = 136; // 138 - LAKI_Y = 58 - 200; // 58 + // Starting countdown + STCD_X = BASEVIDWIDTH/2; // 9 + STCD_Y = BASEVIDHEIGHT/2; // 92 // CHECK graphic CHEK_Y = BASEVIDHEIGHT; // 200 // Minimap @@ -3883,6 +3853,8 @@ static void K_initKartHUD(void) POSI_Y = (BASEVIDHEIGHT/2)- 2; + STCD_Y = BASEVIDHEIGHT/4; + MINI_Y = (BASEVIDHEIGHT/2); SPBW_Y = (BASEVIDHEIGHT/2)-8; @@ -3897,6 +3869,8 @@ static void K_initKartHUD(void) POSI_X = (BASEVIDWIDTH/2)-3; + STCD_X = BASEVIDWIDTH/4; + MINI_X = (3*BASEVIDWIDTH/4); MINI_Y = (3*BASEVIDHEIGHT/4); @@ -4072,7 +4046,7 @@ static void K_drawKartTimestamp(void) // TIME_Y = 6; // 6 INT32 TIME_XB; - INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); + INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTORIGHT); V_DrawScaledPatch(TIME_X, TIME_Y, V_HUDTRANS|splitflags, kp_timestickerwide); @@ -4829,115 +4803,20 @@ static void K_drawBattleFullscreen(void) } } -static void K_drawStartLakitu(void) +static void K_drawStartCountdown(void) { - patch_t *localpatch = kp_nodraw; + INT32 pnum = 0; // 3 - fixed_t adjustY; - tic_t numFrames = 32; // Number of frames for the animation - fixed_t finalOffset = 206; // Number of pixels to offset the patch (This is actually 200, the 6 is a buffer for the parabola) + if (leveltime >= starttime-(2*TICRATE)) // 2 + pnum++; + if (leveltime >= starttime-TICRATE) // 1 + pnum++; + if (leveltime >= starttime) // GO! + pnum++; + if ((leveltime % (2*5)) / 5) // blink + pnum += 4; - if (leveltime < 52) localpatch = kp_lakitustart[0]; - if (leveltime >= 52 && leveltime < 56) localpatch = kp_lakitustart[1]; - if (leveltime >= 56 && leveltime < 60) localpatch = kp_lakitustart[2]; - if (leveltime >= 60 && leveltime < 64) localpatch = kp_lakitustart[3]; - if (leveltime >= 64 && leveltime < 91) localpatch = kp_lakitustart[4]; - if (leveltime >= 91 && leveltime < 95) localpatch = kp_lakitustart[5]; - if (leveltime >= 95 && leveltime < 99) localpatch = kp_lakitustart[6]; - if (leveltime >= 99 && leveltime < 103) localpatch = kp_lakitustart[7]; - if (leveltime >= 103 && leveltime < 130) localpatch = kp_lakitustart[8]; - if (leveltime >= 130 && leveltime < 134) localpatch = kp_lakitustart[9]; - if (leveltime >= 134 && leveltime < 138) localpatch = kp_lakitustart[10]; - if (leveltime >= 138 && leveltime < 142) localpatch = kp_lakitustart[11]; - if (leveltime >= 142 && leveltime < 178) localpatch = kp_lakitustart[12]; - - if (leveltime <= numFrames) - adjustY = (finalOffset - 1) - FixedMul((finalOffset), FRACUNIT / (leveltime + 3)); - else if (leveltime >= 146) - { - fixed_t templeveltime = leveltime - 145; - adjustY = (finalOffset - 1) - FixedMul((finalOffset), FRACUNIT / (numFrames + 3 - templeveltime)); - } - else - adjustY = 200; - - if (mirrormode) - V_DrawSmallScaledPatch(320-LAKI_X, LAKI_Y + adjustY, V_SNAPTOTOP|V_FLIP, localpatch); - else - V_DrawSmallScaledPatch(LAKI_X, LAKI_Y + adjustY, V_SNAPTOTOP, localpatch); -} - -static void K_drawLapLakitu(void) -{ - patch_t *localpatch = kp_nodraw; - - fixed_t swoopTimer = 80 - stplyr->kartstuff[k_lapanimation]; // Starts at 80, goes down by 1 per frame - fixed_t adjustY; - fixed_t numFrames = 32; // Number of frames for the animation - fixed_t finalOffset = 206; // Number of pixels to offset the patch (This is actually 200, the 6 is a buffer for the parabola) - boolean finishLine = false; - - if (stplyr->laps < (UINT8)(cv_numlaps.value - 1)) - { - switch (stplyr->laps) - { - case 1: localpatch = kp_lakitulaps[0]; break; - case 2: localpatch = kp_lakitulaps[1]; break; - case 3: localpatch = kp_lakitulaps[2]; break; - case 4: localpatch = kp_lakitulaps[3]; break; - case 5: localpatch = kp_lakitulaps[4]; break; - case 6: localpatch = kp_lakitulaps[5]; break; - case 7: localpatch = kp_lakitulaps[6]; break; - case 8: localpatch = kp_lakitulaps[7]; break; - } - } - else if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) - localpatch = kp_lakitulaps[8]; - else - { - // Change flag frame every 4 frames - switch (leveltime % 32) - { - case 0: case 1: case 2: case 3: - localpatch = kp_lakitulaps[9]; break; - case 4: case 5: case 6: case 7: - localpatch = kp_lakitulaps[10]; break; - case 8: case 9: case 10: case 11: - localpatch = kp_lakitulaps[11]; break; - case 12: case 13: case 14: case 15: - localpatch = kp_lakitulaps[12]; break; - case 16: case 17: case 18: case 19: - localpatch = kp_lakitulaps[13]; break; - case 20: case 21: case 22: case 23: - localpatch = kp_lakitulaps[14]; break; - case 24: case 25: case 26: case 27: - localpatch = kp_lakitulaps[15]; break; - case 28: case 29: case 30: case 31: - localpatch = kp_lakitulaps[16]; break; - } - finishLine = true; - finalOffset = 226; - } - - if (swoopTimer <= numFrames) - adjustY = (finalOffset - 1) - FixedMul((finalOffset), FRACUNIT / (swoopTimer + 3)); - else if (swoopTimer >= 48) - { - fixed_t templeveltime = swoopTimer - 47; - adjustY = (finalOffset - 1) - FixedMul((finalOffset), FRACUNIT / (numFrames + 3 - templeveltime)); - } - else - { - if (finishLine) - adjustY = 220; - else - adjustY = 200; - } - - if (mirrormode) - V_DrawSmallScaledPatch(320-(LAKI_X+14+(swoopTimer/4)), LAKI_Y + adjustY, V_SNAPTOTOP|V_FLIP, localpatch); - else - V_DrawSmallScaledPatch(LAKI_X+14+(swoopTimer/4), LAKI_Y + adjustY, V_SNAPTOTOP, localpatch); + V_DrawScaledPatch(STCD_X - (SHORT(kp_startcountdown[pnum]->width)/2), STCD_Y - (SHORT(kp_startcountdown[pnum]->height)/2), 0, kp_startcountdown[pnum]); } static void K_drawCheckpointDebugger(void) @@ -4970,21 +4849,9 @@ void K_drawKartHUD(void) return; } - // Draw Lakitu - // This is done first so that regardless of HUD layers, - // he'll appear to be in the 'real world' - if (!splitscreen) - { - if (leveltime < 178) - K_drawStartLakitu(); - - if (stplyr->kartstuff[k_lapanimation]) - K_drawLapLakitu(); - - // Draw the CHECK indicator before the other items too, so it's overlapped by everything else - if (cv_kartcheck.value) - K_drawKartPlayerCheck(); - } + // Draw the CHECK indicator before the other items, so it's overlapped by everything else + if (cv_kartcheck.value && !splitscreen) + K_drawKartPlayerCheck(); if (splitscreen == 0 && cv_kartminimap.value) K_drawKartMinimap(); // 3P splitscreen is handled above @@ -5036,6 +4903,11 @@ void K_drawKartHUD(void) } } + // Draw the starting countdown after everything else. + if (leveltime >= starttime-(3*TICRATE) + && leveltime < starttime+TICRATE) + K_drawStartCountdown(); + if (cv_kartdebugcheckpoint.value) K_drawCheckpointDebugger(); } diff --git a/src/k_kart.h b/src/k_kart.h index 1728740e..f8a363af 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -20,7 +20,7 @@ void K_RegisterKartStuff(void); boolean K_IsPlayerLosing(player_t *player); void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); -void K_LakituChecker(player_t *player); +void K_RespawnChecker(player_t *player); void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); diff --git a/src/p_enemy.c b/src/p_enemy.c index 228c2dec..a0056fec 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -850,7 +850,7 @@ void A_Look(mobj_t *actor) if (!P_LookForPlayers(actor, locvar1 & 65535, false , FixedMul((locvar1 >> 16)*FRACUNIT, actor->scale))) return; - if (leveltime < 4*TICRATE) // SRB2kart - no looking before race starts + if (leveltime < starttime) // SRB2kart - no looking before race starts return; // go into chase state diff --git a/src/p_mobj.c b/src/p_mobj.c index 55c5c5ff..2249165f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10046,7 +10046,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) z = ceiling - mobjinfo[MT_PLAYER].height; if (mthing->options >> ZSHIFT) z -= ((mthing->options >> ZSHIFT) << FRACBITS); - if (p->kartstuff[k_lakitu]) + if (p->kartstuff[k_respawn]) z -= 128*FRACUNIT; } else @@ -10054,7 +10054,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) z = floor; if (mthing->options >> ZSHIFT) z += ((mthing->options >> ZSHIFT) << FRACBITS); - if (p->kartstuff[k_lakitu]) + if (p->kartstuff[k_respawn]) z += 128*FRACUNIT; } @@ -10116,7 +10116,7 @@ void P_MovePlayerToStarpost(INT32 playernum) #endif sector->ceilingheight; - z = (p->starpostz + 128) << FRACBITS; // Lakitu spawns you off the ground + z = (p->starpostz + 128) << FRACBITS; // Respawn off the ground if (z < floor) z = floor; else if (z > ceiling - mobjinfo[MT_PLAYER].height) diff --git a/src/p_setup.c b/src/p_setup.c index 575452e9..cf2ad8e1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2659,7 +2659,7 @@ boolean P_SetupLevel(boolean skipprecip) S_Start(); // SRB2 Kart - Yes this is weird, but we don't want the music to start until after the countdown is finished // but we do still need the mapmusname to be changed - if (leveltime < 158) + if (leveltime < (starttime + (TICRATE/2))) S_StopMusic(); // Let's fade to black here diff --git a/src/p_spec.c b/src/p_spec.c index 474c73bf..1e2934a6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4151,7 +4151,7 @@ DoneSection2: if (player->starpostcount >= numstarposts/2) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)") { player->laps++; - player->kartstuff[k_lapanimation] = 80; + //player->kartstuff[k_lapanimation] = 80; if (player->pflags & PF_NIGHTSMODE) player->drillmeter += 48*20; diff --git a/src/p_user.c b/src/p_user.c index 901ad958..08f08b62 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1188,7 +1188,7 @@ void P_RestoreMusic(player_t *player) // Item - Invincibility else if (player->kartstuff[k_invincibilitytimer] > 1 && player->playerstate == PST_LIVE) S_ChangeMusicInternal("kinvnc", false); - else if (leveltime > 157) + else if (leveltime > (starttime + (TICRATE/2))) { // Event - Final Lap if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1)) @@ -7863,7 +7863,7 @@ static void P_DeathThink(player_t *player) // Force respawn if idle for more than 30 seconds in shooter modes. if (player->deadtimer > 30*TICRATE && !G_RaceGametype()) player->playerstate = PST_REBORN; - else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= 140) // Don't allow "click to respawn" in special stages! + else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= starttime) // Don't allow "click to respawn" in special stages! { // SRB2kart-- But wait, why'd we add this? :eggthinking: /*if (player->spectator) @@ -7872,7 +7872,7 @@ static void P_DeathThink(player_t *player) player->spectator = false; }*/ - //player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c + //player->kartstuff[k_respawn] = 48; // See G_PlayerReborn in g_game.c // SRB2kart - spawn automatically after 1 second if (player->deadtimer > cv_respawntime.value*TICRATE) @@ -7937,9 +7937,9 @@ static void P_DeathThink(player_t *player) // Keep time rolling if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_TIMEOVER)) { - if (leveltime >= 4*TICRATE) + if (leveltime >= starttime) { - player->realtime = leveltime - 4*TICRATE; + player->realtime = leveltime - starttime; if (player == &players[consoleplayer]) { if (player->spectator || !circuitmap) @@ -8136,7 +8136,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall subsector_t *newsubsec; fixed_t f1, f2; - cameranoclip = (player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) || (player->mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)); // Noclipping player camera noclips too!! + cameranoclip = (player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) || (player->mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT) || (leveltime < 3*TICRATE)); // Noclipping player camera noclips too!! if (!(player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)) { @@ -8270,7 +8270,14 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall lookback = camspin4; } - if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! + if (leveltime < 3*TICRATE) // Whoooshy camera! + { + const INT32 introcam = (3*TICRATE - leveltime) * 3; + camrotate += 3*introcam/2; + camdist += (introcam * mapheaderinfo[gamemap-1]->mobj_scale); + camheight += (introcam * mapheaderinfo[gamemap-1]->mobj_scale); + } + else if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! camstill = true; else if (lookback) // SRB2kart - Camera flipper { @@ -9270,7 +9277,7 @@ void P_PlayerThink(player_t *player) playerdeadview = false; // SRB2kart 010217 - if (leveltime < 4*TICRATE) + if (leveltime < starttime) player->powers[pw_nocontrol] = 2; /* if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE) @@ -9284,9 +9291,9 @@ void P_PlayerThink(player_t *player) // Synchronizes the "real" amount of time spent in the level. if (!player->exiting) { - if (leveltime >= 4*TICRATE) + if (leveltime >= starttime) { - player->realtime = leveltime - 4*TICRATE; + player->realtime = leveltime - starttime; if (player == &players[consoleplayer]) { if (player->spectator || !circuitmap) diff --git a/src/st_stuff.c b/src/st_stuff.c index 33f7a275..78a6278c 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1488,13 +1488,13 @@ static void ST_drawMatchHUD(void) // SRB2kart - unused. static inline void ST_drawRaceHUD(void) { - if (leveltime > TICRATE && leveltime <= 2*TICRATE) + if (leveltime > starttime-(3*TICRATE) && leveltime <= starttime-(2*TICRATE)) V_DrawScaledPatch(SCX((BASEVIDWIDTH - SHORT(race3->width))/2), (INT32)(SCY(BASEVIDHEIGHT/2)), V_NOSCALESTART, race3); - else if (leveltime > 2*TICRATE && leveltime <= 3*TICRATE) + else if (leveltime > starttime-(2*TICRATE) && leveltime <= starttime-TICRATE) V_DrawScaledPatch(SCX((BASEVIDWIDTH - SHORT(race2->width))/2), (INT32)(SCY(BASEVIDHEIGHT/2)), V_NOSCALESTART, race2); - else if (leveltime > 3*TICRATE && leveltime <= 4*TICRATE) + else if (leveltime > starttime-TICRATE && leveltime <= starttime) V_DrawScaledPatch(SCX((BASEVIDWIDTH - SHORT(race1->width))/2), (INT32)(SCY(BASEVIDHEIGHT/2)), V_NOSCALESTART, race1); - else if (leveltime > 4*TICRATE && leveltime <= 5*TICRATE) + else if (leveltime > starttime && leveltime <= starttime+TICRATE) V_DrawScaledPatch(SCX((BASEVIDWIDTH - SHORT(racego->width))/2), (INT32)(SCY(BASEVIDHEIGHT/2)), V_NOSCALESTART, racego); if (circuitmap)