Lakitu murder & countdown improvements

(I'm not SevenethSentienel! I just don't feel like logging out!)
This commit is contained in:
SeventhSentinel 2018-06-24 22:15:22 -04:00
parent a8aec0b9e1
commit 16e1569af1
15 changed files with 142 additions and 264 deletions

View File

@ -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())

View File

@ -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

View File

@ -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",

View File

@ -409,6 +409,7 @@ extern UINT16 spacetimetics;
extern UINT16 extralifetics;
// SRB2kart
extern tic_t starttime;
extern INT32 hyudorotime;
extern INT32 stealtime;
extern INT32 sneakertime;

View File

@ -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

View File

@ -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
},

View File

@ -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.

View File

@ -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();
}

View File

@ -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);

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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)