mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-01-18 07:22:03 +00:00
Mammoth commit!
* Deaths in record attack no longer put you into a glitchy singleplayer game-over state that we somehow both kept around and also broke since we branched Kart off of Vanilla.. * Fix non-standard mapscales making the Death Egg respawn octagons dissasemble themselves. * Allow for MULTIPLE TIME EMBLEMS PER MAP, at least in the emblem UI on the timer. It shows all completed emblems plus the uncompleted emblem up to a total of three. * Major tweaks to the First Person HUD. * I know this was your baby, Sal, and some of the changes may prove controversial - so I've put the ones that are likely to cause the most fuss inside an ifndef block, so that you can toggle it as you please with minimal code changes. * Dontdraw-ness, transparency, and colorization match the player's object! * Moves around on the screen with respect to the direction of the player object's motion, to make drifting look nicer! * Flashes the colour of your drift sparks. * Did a WHOLE bunch of things with respect to music. I'm not sure how to describe this, so I'll go through step-by-step. * Countdowns now play the drowning music again. * Removed/disabled extraenous P_RestoreMusics. * Made map-ending music called by its own function, P_EndingMusic(player_t *player). * Made the ending music play on the LAST player crossing the finishing line in splitscreen, rather than first. * Make dead players spinout and clip through the floor, at least until we add the new death anims. * Fix prior pogo spring usage making dead players fall faster. * Make the time over countdown use the kart font when not splitscreen with 3 or 4 players. * Removed a weird bonus HWR_DrawCroppedPatch function signature in the hardware header.
This commit is contained in:
parent
e3a1bf2f83
commit
1d88cdf40d
13 changed files with 255 additions and 185 deletions
|
@ -4080,7 +4080,8 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
players[i].starpostx = players[i].starposty = players[i].starpostz = 0;
|
||||
players[i].starpostcount = 0; // srb2kart
|
||||
|
||||
/*if (netgame || multiplayer)
|
||||
#if 0
|
||||
if (netgame || multiplayer)
|
||||
{
|
||||
players[i].lives = cv_startinglives.value;
|
||||
players[i].continues = 0;
|
||||
|
@ -4096,7 +4097,10 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
players[i].continues = 1;
|
||||
}
|
||||
|
||||
players[i].xtralife = 0;*/
|
||||
players[i].xtralife = 0;
|
||||
#else
|
||||
players[i].lives = 1; // SRB2Kart
|
||||
#endif
|
||||
|
||||
// The latter two should clear by themselves, but just in case
|
||||
players[i].pflags &= ~(PF_TAGIT|PF_TAGGED|PF_FULLSTASIS);
|
||||
|
|
|
@ -46,7 +46,6 @@ void HWR_SetViewSize(void);
|
|||
void HWR_DrawPatch(GLPatch_t *gpatch, INT32 x, INT32 y, INT32 option);
|
||||
void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale, INT32 option, const UINT8 *colormap);
|
||||
void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale, INT32 option, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h);
|
||||
void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, INT32 option, fixed_t scale, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h);
|
||||
void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
|
||||
void HWR_CreatePlanePolygons(INT32 bspnum);
|
||||
void HWR_CreateStaticLightmaps(INT32 bspnum);
|
||||
|
|
150
src/k_kart.c
150
src/k_kart.c
|
@ -1146,8 +1146,8 @@ void K_RespawnChecker(player_t *player)
|
|||
fixed_t newx, newy, newz;
|
||||
|
||||
newangle = FixedAngle(((360/8)*i)*FRACUNIT);
|
||||
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 31*FRACUNIT);
|
||||
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 31*FRACUNIT);
|
||||
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 31*player->mo->scale);
|
||||
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 31*player->mo->scale);
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
newz = player->mo->z + player->mo->height;
|
||||
else
|
||||
|
@ -3039,17 +3039,18 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
return turnvalue;
|
||||
}
|
||||
|
||||
fixed_t K_GetKartDriftSparkValue(player_t *player)
|
||||
{
|
||||
UINT8 kartspeed = (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
? 1
|
||||
: player->kartspeed;
|
||||
return (26*4 + kartspeed*2 + (9 - player->kartweight))*8;
|
||||
}
|
||||
|
||||
static void K_KartDrift(player_t *player, boolean onground)
|
||||
{
|
||||
UINT8 kartspeed = player->kartspeed;
|
||||
fixed_t dsone, dstwo;
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
kartspeed = 1;
|
||||
|
||||
// IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:"
|
||||
dsone = (26*4 + kartspeed*2 + (9 - player->kartweight))*8;
|
||||
dstwo = dsone*2;
|
||||
fixed_t dsone = K_GetKartDriftSparkValue(player);
|
||||
fixed_t dstwo = dsone*2;
|
||||
|
||||
// Drifting is actually straffing + automatic turning.
|
||||
// Holding the Jump button will enable drifting.
|
||||
|
@ -4620,7 +4621,8 @@ static void K_drawKartTimestamp(void)
|
|||
|
||||
if (modeattacking) // emblem time!
|
||||
{
|
||||
INT32 workx;
|
||||
INT32 workx = TIME_XB + 96, worky = TIME_Y+18;
|
||||
UINT8 curemb = 0;
|
||||
emblem_t *emblem = M_GetLevelEmblems(gamemap);
|
||||
while (emblem)
|
||||
{
|
||||
|
@ -4630,7 +4632,7 @@ static void K_drawKartTimestamp(void)
|
|||
{
|
||||
case ET_TIME:
|
||||
{
|
||||
static boolean canplaysound = true;
|
||||
static boolean canplaysound[3] = {true, true, true};
|
||||
tic_t timetoreach = emblem->var;
|
||||
snprintf(targettext, 9, "%i:%02i.%02i",
|
||||
G_TicsToMinutes(timetoreach, false),
|
||||
|
@ -4640,14 +4642,14 @@ static void K_drawKartTimestamp(void)
|
|||
if (stplyr->realtime > timetoreach)
|
||||
{
|
||||
splitflags = (splitflags &~ V_HUDTRANS)|V_HUDTRANSHALF;
|
||||
if (canplaysound)
|
||||
if (canplaysound[curemb])
|
||||
{
|
||||
S_StartSound(NULL, sfx_s3k72); //sfx_s26d); -- you STOLE fizzy lifting drinks
|
||||
canplaysound = false;
|
||||
canplaysound[curemb] = false;
|
||||
}
|
||||
}
|
||||
else if (!canplaysound)
|
||||
canplaysound = true;
|
||||
else if (!canplaysound[curemb])
|
||||
canplaysound[curemb] = true;
|
||||
|
||||
targettext[8] = 0;
|
||||
}
|
||||
|
@ -4656,16 +4658,18 @@ static void K_drawKartTimestamp(void)
|
|||
goto bademblem;
|
||||
}
|
||||
|
||||
workx = TIME_XB + 96 - V_StringWidth(targettext, 0);
|
||||
V_DrawString(workx, TIME_Y+18, splitflags, targettext);
|
||||
workx -= 16;
|
||||
if (emblem->collected)
|
||||
V_DrawSmallMappedPatch(workx, TIME_Y+18, splitflags, W_CachePatchName(M_GetEmblemPatch(emblem), PU_CACHE),
|
||||
V_DrawSmallMappedPatch(workx - 65, worky, splitflags, W_CachePatchName(M_GetEmblemPatch(emblem), PU_CACHE),
|
||||
R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(emblem), GTC_CACHE));
|
||||
else
|
||||
V_DrawSmallScaledPatch(workx, TIME_Y+18, splitflags, W_CachePatchName("NEEDIT", PU_CACHE));
|
||||
V_DrawSmallScaledPatch(workx, worky, splitflags, W_CachePatchName("NEEDIT", PU_CACHE));
|
||||
|
||||
break;
|
||||
V_DrawRightAlignedString(workx, worky, splitflags, targettext);
|
||||
|
||||
if (!emblem->collected || ++curemb >= 3)
|
||||
break;
|
||||
|
||||
worky += 10;
|
||||
|
||||
bademblem:
|
||||
emblem = M_GetLevelEmblems(-1);
|
||||
|
@ -5464,8 +5468,13 @@ static void K_drawKartFirstPerson(void)
|
|||
static INT32 pnum1 = 0, pnum2 = 0, pnum3 = 0, pnum4 = 0;
|
||||
INT32 pn = 0, target = 0, splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM);
|
||||
INT32 x = BASEVIDWIDTH/2, y = BASEVIDHEIGHT;
|
||||
fixed_t scale;
|
||||
UINT8 *colmap = NULL;
|
||||
ticcmd_t *cmd = &stplyr->cmd;
|
||||
|
||||
if (stplyr->mo && stplyr->mo->flags2 & MF2_DONTDRAW)
|
||||
return;
|
||||
|
||||
if (stplyr == &players[secondarydisplayplayer] && splitscreen)
|
||||
pn = pnum2;
|
||||
else if (stplyr == &players[thirddisplayplayer] && splitscreen > 1)
|
||||
|
@ -5477,15 +5486,20 @@ static void K_drawKartFirstPerson(void)
|
|||
|
||||
if (splitscreen)
|
||||
{
|
||||
y /= 2;
|
||||
y >>= 1;
|
||||
if (splitscreen > 1)
|
||||
x /= 2;
|
||||
x >>= 1;
|
||||
}
|
||||
|
||||
if (stplyr->spectator || !stplyr->mo)
|
||||
splitflags |= FF_TRANS50;
|
||||
else if (stplyr->speed < FixedMul(stplyr->runspeed, stplyr->mo->scale) && (leveltime & 1))
|
||||
y++;
|
||||
splitflags |= FF_TRANS50; // this isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it
|
||||
else
|
||||
{
|
||||
if (stplyr->speed < FixedMul(stplyr->runspeed, stplyr->mo->scale) && (leveltime & 1) && !splitscreen)
|
||||
y++;
|
||||
if (stplyr->mo->frame & FF_TRANSMASK)
|
||||
splitflags |= (stplyr->mo->frame & FF_TRANSMASK); // ditto
|
||||
}
|
||||
|
||||
if (cmd->driftturn > 400) // strong left turn
|
||||
target = 2;
|
||||
|
@ -5510,10 +5524,68 @@ static void K_drawKartFirstPerson(void)
|
|||
if (target > 2)
|
||||
target = 2;
|
||||
|
||||
if (splitscreen)
|
||||
V_DrawSmallScaledPatch(x, y, splitflags, kp_fpview[target]);
|
||||
x <<= FRACBITS;
|
||||
y <<= FRACBITS;
|
||||
|
||||
if (splitscreen == 1)
|
||||
{
|
||||
scale = (2*FRACUNIT)/3;
|
||||
y += FRACUNIT/(vid.dupx < vid.dupy ? vid.dupx : vid.dupy); // correct a one-pixel gap on the screen view (not the basevid view)
|
||||
}
|
||||
else if (splitscreen)
|
||||
scale = FRACUNIT/2;
|
||||
else
|
||||
V_DrawScaledPatch(x, y, splitflags, kp_fpview[target]);
|
||||
scale = FRACUNIT;
|
||||
|
||||
if (stplyr->mo)
|
||||
{
|
||||
fixed_t dsone = K_GetKartDriftSparkValue(stplyr);
|
||||
fixed_t dstwo = dsone*2;
|
||||
|
||||
#ifndef DONTLIKETOASTERSFPTWEAKS
|
||||
if (stplyr->rmomx || stplyr->rmomy || stplyr->frameangle != stplyr->mo->angle) // an approximation of drifting!
|
||||
{
|
||||
const angle_t ang = ((stplyr->frameangle != stplyr->mo->angle)
|
||||
? stplyr->frameangle
|
||||
: R_PointToAngle2(0, 0, stplyr->rmomx, stplyr->rmomy))
|
||||
- stplyr->mo->angle;
|
||||
// yes, the follwing is correct. no, you do not need to swap the x and y.
|
||||
fixed_t xoffs = -P_ReturnThrustY(stplyr->mo, ang, BASEVIDWIDTH<<(FRACBITS-2));
|
||||
fixed_t yoffs = (splitscreen ? 0 : -(P_ReturnThrustX(stplyr->mo, ang, 4*FRACUNIT) - 4*FRACUNIT));
|
||||
|
||||
if (splitscreen)
|
||||
xoffs = FixedMul(xoffs, scale);
|
||||
|
||||
if (stplyr->frameangle == stplyr->mo->angle)
|
||||
{
|
||||
const fixed_t mag = FixedDiv(stplyr->speed, 10*stplyr->mo->scale);
|
||||
|
||||
if (mag < FRACUNIT)
|
||||
{
|
||||
xoffs = FixedMul(xoffs, mag);
|
||||
if (!splitscreen)
|
||||
yoffs = FixedMul(yoffs, mag);
|
||||
}
|
||||
}
|
||||
|
||||
x += xoffs;
|
||||
if (!splitscreen)
|
||||
y += yoffs;
|
||||
}
|
||||
|
||||
// drift sparks!
|
||||
if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dstwo))
|
||||
colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_TANGERINE, 0);
|
||||
else if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dsone))
|
||||
colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SAPPHIRE, 0);
|
||||
else
|
||||
#endif
|
||||
// invincibility/grow/shrink!
|
||||
if (stplyr->mo->colorized && stplyr->mo->color)
|
||||
colmap = R_GetTranslationColormap(TC_RAINBOW, stplyr->mo->color, 0);
|
||||
}
|
||||
|
||||
V_DrawFixedPatch(x, y, scale, splitflags, kp_fpview[target], colmap);
|
||||
|
||||
if (stplyr == &players[secondarydisplayplayer] && splitscreen)
|
||||
pnum2 = pn;
|
||||
|
@ -5578,7 +5650,7 @@ static void K_drawInput(void)
|
|||
target = 0;
|
||||
else // turning of multiple strengths!
|
||||
{
|
||||
target = (abs(cmd->driftturn)+99)/100;
|
||||
target = ((abs(cmd->driftturn) - 1)/125)+1;
|
||||
if (target > 4)
|
||||
target = 4;
|
||||
if (cmd->driftturn < 0)
|
||||
|
@ -5722,10 +5794,22 @@ void K_drawKartHUD(void)
|
|||
K_drawInput();
|
||||
}
|
||||
|
||||
// Draw the starting countdown after everything else.
|
||||
// Draw the countdowns after everything else.
|
||||
if (leveltime >= starttime-(3*TICRATE)
|
||||
&& leveltime < starttime+TICRATE)
|
||||
K_drawStartCountdown();
|
||||
else if (countdown && !stplyr->exiting)
|
||||
{
|
||||
char *countstr = va("%d", countdown/TICRATE);
|
||||
|
||||
if (splitscreen > 1)
|
||||
V_DrawCenteredString(BASEVIDWIDTH/4, LAPS_Y+1, K_calcSplitFlags(0), countstr);
|
||||
else
|
||||
{
|
||||
INT32 karlen = strlen(countstr)*6; // half of 12
|
||||
V_DrawKartString((BASEVIDWIDTH/2)-karlen, LAPS_Y+3, K_calcSplitFlags(0), countstr);
|
||||
}
|
||||
}
|
||||
|
||||
if (cv_kartdebugcheckpoint.value)
|
||||
K_drawCheckpointDebugger();
|
||||
|
|
|
@ -40,6 +40,7 @@ void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source);
|
|||
void K_RepairOrbitChain(mobj_t *orbit);
|
||||
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
|
||||
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
||||
fixed_t K_GetKartDriftSparkValue(player_t *player);
|
||||
void K_StripItems(player_t *player);
|
||||
void K_MomentumToFacing(player_t *player);
|
||||
fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower);
|
||||
|
|
|
@ -3239,8 +3239,10 @@ void A_WaterShield(mobj_t *actor)
|
|||
P_SpawnShieldOrb(player);
|
||||
}
|
||||
|
||||
/* // SRB2kart - Can't drown.
|
||||
if (player->powers[pw_underwater] && player->powers[pw_underwater] <= 12*TICRATE + 1)
|
||||
P_RestoreMusic(player);
|
||||
*/
|
||||
|
||||
player->powers[pw_underwater] = 0;
|
||||
|
||||
|
|
|
@ -1547,12 +1547,14 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
|| special->z > toucher->z + (toucher->height*2/3))
|
||||
return; // Only go in the mouth
|
||||
|
||||
/* // SRB2kart - Can't drown.
|
||||
// Eaten by player!
|
||||
if (player->powers[pw_underwater] && player->powers[pw_underwater] <= 12*TICRATE + 1)
|
||||
P_RestoreMusic(player);
|
||||
|
||||
if (player->powers[pw_underwater] < underwatertics + 1)
|
||||
player->powers[pw_underwater] = underwatertics + 1;
|
||||
*/
|
||||
|
||||
/*
|
||||
if (!player->climbing)
|
||||
|
@ -2254,7 +2256,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||
{
|
||||
target->flags &= ~(MF_SOLID|MF_SHOOTABLE); // does not block
|
||||
P_UnsetThingPosition(target);
|
||||
target->flags |= MF_NOBLOCKMAP;
|
||||
target->flags |= MF_NOBLOCKMAP|MF_NOCLIPHEIGHT;
|
||||
P_SetThingPosition(target);
|
||||
|
||||
if (!target->player->bot && !G_IsSpecialStage(gamemap)
|
||||
|
@ -2329,9 +2331,9 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||
}
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
{
|
||||
K_CheckBumpers();
|
||||
}
|
||||
|
||||
target->player->kartstuff[k_pogospring] = 0;
|
||||
}
|
||||
|
||||
if (source && target && target->player && source->player)
|
||||
|
|
|
@ -150,6 +150,7 @@ boolean P_InQuicksand(mobj_t *mo);
|
|||
|
||||
void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative);
|
||||
void P_RestoreMusic(player_t *player);
|
||||
void P_EndingMusic(player_t *player);
|
||||
void P_SpawnShieldOrb(player_t *player);
|
||||
mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
|
||||
void P_GivePlayerRings(player_t *player, INT32 num_rings);
|
||||
|
|
15
src/p_mobj.c
15
src/p_mobj.c
|
@ -1343,7 +1343,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
// || (mo->state >= &states[S_PLAY_SPC1] && mo->state <= &states[S_PLAY_SPC4]))))
|
||||
// gravityadd = gravityadd/3; // less gravity while flying/gliding
|
||||
if (mo->player->climbing || (mo->player->pflags & PF_NIGHTSMODE))
|
||||
gravityadd = 0;
|
||||
return 0;
|
||||
|
||||
if (!(mo->flags2 & MF2_OBJECTFLIP) != !(mo->player->powers[pw_gravityboots])) // negated to turn numeric into bool - would be double negated, but not needed if both would be
|
||||
{
|
||||
|
@ -6587,16 +6587,11 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
{
|
||||
if (mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator)
|
||||
{
|
||||
UINT8 kartspeed = mobj->target->player->kartspeed;
|
||||
fixed_t dsone, dstwo;
|
||||
INT32 HEIGHT;
|
||||
fixed_t radius;
|
||||
|
||||
if (G_BattleGametype() && mobj->target->player->kartstuff[k_bumper] <= 0)
|
||||
kartspeed = 1;
|
||||
|
||||
dsone = (26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight))*8;
|
||||
dstwo = dsone*2;
|
||||
fixed_t dsone = K_GetKartDriftSparkValue(mobj->target->player);
|
||||
fixed_t dstwo = dsone*2;
|
||||
|
||||
if (mobj->target->player->kartstuff[k_driftcharge] < dsone)
|
||||
{
|
||||
|
@ -7427,7 +7422,11 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
else // Apply gravity to fall downwards.
|
||||
{
|
||||
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||
if (mobj->player)
|
||||
mobj->player->frameangle -= ANGLE_22h;
|
||||
}
|
||||
}
|
||||
break;
|
||||
//{ SRB2kart Items - Death States
|
||||
|
|
|
@ -2197,11 +2197,15 @@ static void P_LevelInitStuff(void)
|
|||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
#if 0
|
||||
if ((netgame || multiplayer) && (gametype == GT_COMPETITION || players[i].lives <= 0))
|
||||
{
|
||||
// In Co-Op, replenish a user's lives if they are depleted.
|
||||
players[i].lives = cv_startinglives.value;
|
||||
}
|
||||
#else
|
||||
players[i].lives = 1;
|
||||
#endif
|
||||
|
||||
players[i].realtime = countdown = countdown2 = 0;
|
||||
curlap = bestlap = 0; // SRB2Kart
|
||||
|
|
18
src/p_spec.c
18
src/p_spec.c
|
@ -4231,23 +4231,7 @@ DoneSection2:
|
|||
|
||||
if (player->laps >= (unsigned)cv_numlaps.value)
|
||||
{
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
// SRB2kart 200117
|
||||
if (splitscreen)
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
else
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("krwin", true);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("krlose", true);
|
||||
else
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
}
|
||||
}
|
||||
|
||||
if (P_IsLocalPlayer(player))
|
||||
if (!splitscreen && P_IsLocalPlayer(player))
|
||||
S_StartSound(NULL, sfx_s3k6a);
|
||||
else if (player->kartstuff[k_position] == 1)
|
||||
S_StartSound(NULL, sfx_s253);
|
||||
|
|
215
src/p_user.c
215
src/p_user.c
|
@ -1121,6 +1121,59 @@ void P_PlayLivesJingle(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_EndingMusic
|
||||
//
|
||||
// Consistently sets ending music!
|
||||
//
|
||||
void P_EndingMusic(player_t *player)
|
||||
{
|
||||
// Event - Level Finish
|
||||
if (splitscreen
|
||||
&& (players[displayplayer].exiting || !players[displayplayer].lives)
|
||||
&& (players[secondarydisplayplayer].exiting || !players[secondarydisplayplayer].lives)
|
||||
&& ((splitscreen < 2) || players[thirddisplayplayer].exiting || !players[thirddisplayplayer].lives)
|
||||
&& ((splitscreen < 3) || players[fourthdisplayplayer].exiting || !players[fourthdisplayplayer].lives))
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
else if (G_BattleGametype())
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
else if (!splitscreen && !player->lives) // outta lives, outta time
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
S_ChangeMusicInternal("krlose", true);
|
||||
else if (G_BattleGametype())
|
||||
S_ChangeMusicInternal("kblose", false);
|
||||
}
|
||||
else if (player->exiting)
|
||||
{
|
||||
if (splitscreen)
|
||||
return;
|
||||
else if (G_RaceGametype())
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("krwin", true);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("krlose", true);
|
||||
else
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("kbwin", false);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("kblose", false);
|
||||
else
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
}
|
||||
|
||||
S_SpeedMusic(1.0f);
|
||||
}
|
||||
|
||||
//
|
||||
// P_RestoreMusic
|
||||
//
|
||||
|
@ -1131,51 +1184,22 @@ void P_RestoreMusic(player_t *player)
|
|||
if (!P_IsLocalPlayer(player)) // Only applies to a local player
|
||||
return;
|
||||
|
||||
if (player->powers[pw_extralife] > 1)
|
||||
if (player->exiting)
|
||||
return;
|
||||
|
||||
if (countdown && countdown <= 11*TICRATE - 1)
|
||||
return;
|
||||
|
||||
S_SpeedMusic(1.0f);
|
||||
|
||||
// SRB2kart - We have some different powers than vanilla, some of which tweak the music.
|
||||
// Event - Level Start
|
||||
if (leveltime < (starttime + (TICRATE/2)))
|
||||
S_ChangeMusicInternal("kstart", false); //S_StopMusic();
|
||||
else
|
||||
else // see also where time overs are handled - search for "lives = 2" in this file
|
||||
{
|
||||
// Event - Level Finish
|
||||
if (splitscreen
|
||||
&& (players[displayplayer].exiting
|
||||
|| players[secondarydisplayplayer].exiting
|
||||
|| players[thirddisplayplayer].exiting
|
||||
|| players[fourthdisplayplayer].exiting))
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
else if (G_BattleGametype())
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
else if (!splitscreen && player->exiting)
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("krwin", true);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("krlose", true);
|
||||
else
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("kbwin", false);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("kblose", false);
|
||||
else
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
}
|
||||
// Item - Grow
|
||||
else if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE)
|
||||
if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE)
|
||||
S_ChangeMusicInternal("kgrow", true);
|
||||
// Item - Invincibility
|
||||
else if (player->kartstuff[k_invincibilitytimer] > 1 && player->playerstate == PST_LIVE)
|
||||
|
@ -1688,26 +1712,14 @@ void P_DoPlayerExit(player_t *player)
|
|||
else
|
||||
S_StartSound(player->mo, sfx_kwin);
|
||||
|
||||
if (P_IsLocalPlayer(player) && cv_inttime.value > 0)
|
||||
{
|
||||
if (!splitscreen)
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("krwin", true);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("krlose", true);
|
||||
else
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
}
|
||||
else
|
||||
S_ChangeMusicInternal("krok", true);
|
||||
}
|
||||
|
||||
player->exiting = 3*TICRATE;
|
||||
|
||||
if (P_IsLocalPlayer(player) && cv_inttime.value > 0)
|
||||
P_EndingMusic(player);
|
||||
|
||||
// SRB2kart 120217
|
||||
if (!countdown2 && !(netgame || multiplayer))
|
||||
countdown2 = (66)*TICRATE + 1; // 6 seconds past the time over
|
||||
countdown2 = (68)*TICRATE + 1; // 8 seconds past the time over... so close to nice
|
||||
else if (!countdown2)
|
||||
countdown2 = (8 + cv_countdowntime.value)*TICRATE + 1; // 8 sec more than countdowntime -- 11 is too much
|
||||
|
||||
|
@ -1716,24 +1728,10 @@ void P_DoPlayerExit(player_t *player)
|
|||
}
|
||||
else if (G_BattleGametype()) // Battle Mode exiting
|
||||
{
|
||||
//S_StopMusic();
|
||||
player->exiting = 8*TICRATE + 1;
|
||||
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
if (!splitscreen)
|
||||
{
|
||||
if (player->kartstuff[k_position] == 1)
|
||||
S_ChangeMusicInternal("kbwin", false);
|
||||
else if (K_IsPlayerLosing(player))
|
||||
S_ChangeMusicInternal("kblose", false);
|
||||
else
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
else
|
||||
S_ChangeMusicInternal("kbok", false);
|
||||
}
|
||||
|
||||
player->exiting = 8*TICRATE + 1;
|
||||
P_EndingMusic(player);
|
||||
}
|
||||
else
|
||||
player->exiting = (14*TICRATE)/5 + 2; // Accidental death safeguard???
|
||||
|
@ -1750,7 +1748,6 @@ void P_DoPlayerExit(player_t *player)
|
|||
player->powers[pw_underwater] = 0;
|
||||
player->powers[pw_spacetime] = 0;
|
||||
player->kartstuff[k_cardanimation] = 0; // srb2kart: reset battle animation
|
||||
P_RestoreMusic(player);
|
||||
|
||||
/*if (playeringame[player-players] && netgame && !circuitmap)
|
||||
CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]);*/
|
||||
|
@ -2173,6 +2170,7 @@ static void P_CheckQuicksand(player_t *player)
|
|||
//
|
||||
// Restores music from sneaker and life fanfares
|
||||
//
|
||||
/* // SRB2kart - Can't drown.
|
||||
static void P_CheckSneakerAndLivesTimer(player_t *player)
|
||||
{
|
||||
if ((player->powers[pw_underwater] <= 11*TICRATE + 1)
|
||||
|
@ -2185,12 +2183,14 @@ static void P_CheckSneakerAndLivesTimer(player_t *player)
|
|||
//if (player->powers[pw_sneakers] == 1) // SRB2kart
|
||||
// P_RestoreMusic(player);
|
||||
}
|
||||
*/
|
||||
|
||||
//
|
||||
// P_CheckUnderwaterAndSpaceTimer
|
||||
//
|
||||
// Restores music from underwater and space warnings, and handles number generation
|
||||
//
|
||||
/* // SRB2kart - Can't drown.
|
||||
static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
|
||||
{
|
||||
fixed_t height;
|
||||
|
@ -2299,7 +2299,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
|
|||
|
||||
player->powers[pw_spacetime] = 0;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
//
|
||||
// P_CheckInvincibilityTimer
|
||||
|
@ -2343,11 +2343,11 @@ static void P_CheckInvincibilityTimer(player_t *player)
|
|||
P_SpawnShieldOrb(player);
|
||||
}
|
||||
|
||||
if ((player->powers[pw_underwater] <= 11*TICRATE + 1)
|
||||
/*if ((player->powers[pw_underwater] <= 11*TICRATE + 1)
|
||||
&& (player->powers[pw_underwater] > 1))
|
||||
return; // don't restore music if drowning music is playing
|
||||
|
||||
if (!player->powers[pw_super] || (mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC))
|
||||
if (!player->powers[pw_super] || (mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC))*/
|
||||
P_RestoreMusic(player);
|
||||
}
|
||||
}
|
||||
|
@ -6490,8 +6490,8 @@ static void P_MovePlayer(player_t *player)
|
|||
{
|
||||
player->pflags |= PF_FULLSTASIS;
|
||||
// If you're in stasis in tag, you don't drown.
|
||||
if (player->powers[pw_underwater] <= 12*TICRATE + 1)
|
||||
P_RestoreMusic(player);
|
||||
/*if (player->powers[pw_underwater] <= 12*TICRATE + 1)
|
||||
P_RestoreMusic(player);*/
|
||||
player->powers[pw_underwater] = player->powers[pw_spacetime] = 0;
|
||||
}
|
||||
}
|
||||
|
@ -7864,44 +7864,34 @@ void P_FindEmerald(void)
|
|||
//
|
||||
static void P_DeathThink(player_t *player)
|
||||
{
|
||||
ticcmd_t *cmd = &player->cmd;
|
||||
//ticcmd_t *cmd = &player->cmd;
|
||||
//player->deltaviewheight = 0;
|
||||
|
||||
if (player->deadtimer < INT32_MAX)
|
||||
player->deadtimer++;
|
||||
|
||||
// continue logic
|
||||
if (!(netgame || multiplayer) && player->lives <= 0)
|
||||
/*if (!(netgame || multiplayer) && player->lives <= 0)
|
||||
{
|
||||
if (player->deadtimer > TICRATE && (cmd->buttons & BT_BRAKE || cmd->buttons & BT_ACCELERATE || cmd->buttons & BT_DRIFT) && player->continues > 0)
|
||||
G_UseContinue();
|
||||
else if (player->deadtimer >= gameovertics)
|
||||
G_UseContinue(); // Even if we don't have one this handles ending the game
|
||||
}
|
||||
}*/
|
||||
|
||||
// Force respawn if idle for more than 30 seconds in shooter modes.
|
||||
if (player->deadtimer > 30*TICRATE && !G_RaceGametype())
|
||||
/*if (player->deadtimer > 30*TICRATE && !G_RaceGametype())
|
||||
player->playerstate = PST_REBORN;
|
||||
else if (player->lives > 0 && !G_IsSpecialStage(gamemap) && leveltime >= starttime) // Don't allow "click to respawn" in special stages!
|
||||
else if (player->lives > 0 && !G_IsSpecialStage(gamemap)*/
|
||||
if (player->lives > 0 && leveltime >= starttime) // *could* you respawn?
|
||||
{
|
||||
// SRB2kart-- But wait, why'd we add this? :eggthinking:
|
||||
/*if (player->spectator)
|
||||
{
|
||||
CONS_Printf("%s entered the game.\n", player_names[player-players]);
|
||||
player->spectator = false;
|
||||
}*/
|
||||
|
||||
//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)
|
||||
player->playerstate = PST_REBORN;
|
||||
|
||||
// Single player auto respawn
|
||||
if (!(netgame || multiplayer) && player->deadtimer > 5*TICRATE)
|
||||
player->playerstate = PST_REBORN;
|
||||
if (player->deadtimer > ((netgame || multiplayer)
|
||||
? cv_respawntime.value*TICRATE
|
||||
: TICRATE)) // don't let them change it in record attack
|
||||
player->playerstate = PST_REBORN;
|
||||
}
|
||||
else if ((netgame || multiplayer) && player->deadtimer == 8*TICRATE)
|
||||
/*else if ((netgame || multiplayer) && player->deadtimer == 8*TICRATE)
|
||||
{
|
||||
// In a net/multiplayer game, and out of lives
|
||||
if (gametype == GT_COMPETITION)
|
||||
|
@ -7937,13 +7927,11 @@ static void P_DeathThink(player_t *player)
|
|||
countdown2 = 1*TICRATE;
|
||||
skipstats = true;
|
||||
|
||||
/* // SRB2kart 010217 - Score doesn't need to be reset in Kart.
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i])
|
||||
players[i].score = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
//emeralds = 0;
|
||||
tokenbits = 0;
|
||||
|
@ -7951,7 +7939,7 @@ static void P_DeathThink(player_t *player)
|
|||
token = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
// Keep time rolling
|
||||
if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_TIMEOVER))
|
||||
|
@ -7975,9 +7963,12 @@ static void P_DeathThink(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
if ((G_RaceGametype() || (gametype == GT_COOP && (multiplayer || netgame))) && (player->lives <= 0))
|
||||
if (G_RaceGametype() && (player->lives <= 0))
|
||||
{
|
||||
// Return to level music
|
||||
// to the lose music!
|
||||
if (player->deadtimer == 4*TICRATE && P_IsLocalPlayer(player))
|
||||
P_EndingMusic(player);
|
||||
/*// Return to level music
|
||||
if (netgame)
|
||||
{
|
||||
if (player->deadtimer == gameovertics && P_IsLocalPlayer(player))
|
||||
|
@ -8012,7 +8003,7 @@ static void P_DeathThink(player_t *player)
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
if (!player->mo)
|
||||
|
@ -9183,7 +9174,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
// If 10 seconds are left on the timer,
|
||||
// begin the drown music for countdown!
|
||||
/*
|
||||
|
||||
if (countdown == 11*TICRATE - 1)
|
||||
{
|
||||
if (P_IsLocalPlayer(player))
|
||||
|
@ -9192,8 +9183,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
// If you've hit the countdown and you haven't made
|
||||
// it to the exit, you're a goner!
|
||||
else */
|
||||
if (countdown == 1 && !player->exiting && !player->spectator && player->lives > 0)
|
||||
else if (countdown == 1 && !player->exiting && !player->spectator && player->lives > 0)
|
||||
{
|
||||
if (netgame && player->health > 0)
|
||||
CONS_Printf(M_GetText("%s ran out of time.\n"), player_names[player-players]);
|
||||
|
@ -9213,7 +9203,12 @@ void P_PlayerThink(player_t *player)
|
|||
S_StartScreamSound(player->mo, sfx_s3k66);
|
||||
}
|
||||
|
||||
player->lives = 2; // Don't start the game over music!
|
||||
//player->lives = 2; // Don't start the game over music! -- it's never going to play in srb2kart you numpnut
|
||||
S_StopSound(player->mo);
|
||||
if (player->playerstate == PST_LIVE
|
||||
&& (player->kartstuff[k_growshrinktimer] > 1
|
||||
|| player->kartstuff[k_invincibilitytimer] > 1))
|
||||
S_StopMusic();
|
||||
P_DamageMobj(player->mo, NULL, NULL, 10000);
|
||||
player->lives = 0;
|
||||
|
||||
|
@ -9296,12 +9291,16 @@ void P_PlayerThink(player_t *player)
|
|||
player->health = 1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ((netgame || multiplayer) && player->lives <= 0)
|
||||
{
|
||||
// In Co-Op, replenish a user's lives if they are depleted.
|
||||
// of course, this is just a cheap hack, meh...
|
||||
player->lives = cv_startinglives.value;
|
||||
}
|
||||
#else
|
||||
player->lives = 1; // SRB2Kart
|
||||
#endif
|
||||
|
||||
if (player == &players[displayplayer])
|
||||
playerdeadview = false;
|
||||
|
@ -9430,9 +9429,9 @@ void P_PlayerThink(player_t *player)
|
|||
#endif
|
||||
|
||||
//P_DoSuperStuff(player);
|
||||
P_CheckSneakerAndLivesTimer(player);
|
||||
//P_CheckSneakerAndLivesTimer(player);
|
||||
P_DoBubbleBreath(player); // Spawn Sonic's bubbles
|
||||
P_CheckUnderwaterAndSpaceTimer(player); // Display the countdown drown numbers!
|
||||
//P_CheckUnderwaterAndSpaceTimer(player); // Display the countdown drown numbers!
|
||||
P_CheckInvincibilityTimer(player); // Spawn Invincibility Sparkles
|
||||
P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head
|
||||
|
||||
|
@ -9500,6 +9499,7 @@ void P_PlayerThink(player_t *player)
|
|||
if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX && player->charability != CA_SWIM && !(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) // tails fly counter
|
||||
player->powers[pw_tailsfly]--;
|
||||
|
||||
/* // SRB2kart - Can't drown.
|
||||
if (player->powers[pw_underwater] && (player->pflags & PF_GODMODE || (player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL))
|
||||
{
|
||||
if (player->powers[pw_underwater] <= 12*TICRATE+1)
|
||||
|
@ -9514,6 +9514,7 @@ void P_PlayerThink(player_t *player)
|
|||
player->powers[pw_spacetime] = 0;
|
||||
else if (player->powers[pw_spacetime] && !(maptol & TOL_NIGHTS) && !((netgame || multiplayer) && player->spectator)) // underwater timer
|
||||
player->powers[pw_spacetime]--;
|
||||
*/
|
||||
|
||||
if (player->powers[pw_gravityboots] && player->powers[pw_gravityboots] < UINT16_MAX)
|
||||
player->powers[pw_gravityboots]--;
|
||||
|
|
|
@ -1843,18 +1843,7 @@ static void ST_overlayDrawer(void)
|
|||
if (!hu_showscores) // hide the following if TAB is held
|
||||
{
|
||||
// Countdown timer for Race Mode
|
||||
if (countdown)
|
||||
{
|
||||
INT32 x = BASEVIDWIDTH/2;
|
||||
INT32 y = BASEVIDHEIGHT-24;
|
||||
if (splitscreen)
|
||||
{
|
||||
y = (BASEVIDHEIGHT/2)-12;
|
||||
if (splitscreen > 1)
|
||||
x = BASEVIDWIDTH/4;
|
||||
}
|
||||
V_DrawCenteredString(x, y, K_calcSplitFlags(0), va("%d", countdown/TICRATE));
|
||||
}
|
||||
// ...moved to k_kart.c so we can take advantage of the LAPS_Y value
|
||||
|
||||
K_drawKartHUD();
|
||||
|
||||
|
|
|
@ -480,7 +480,7 @@ void Y_IntermissionDrawer(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (intertype == int_ctf || intertype == int_teammatch)
|
||||
/*else if (intertype == int_ctf || intertype == int_teammatch)
|
||||
{
|
||||
INT32 x = 4, y = 0;
|
||||
INT32 redplayers = 0, blueplayers = 0;
|
||||
|
@ -636,7 +636,7 @@ void Y_IntermissionDrawer(void)
|
|||
if (y > 176)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
if (timer)
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol,
|
||||
|
|
Loading…
Reference in a new issue