mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-22 19:02:45 +00:00
* Fix "exitlevel" being counted as a special stage success despite not giving you an emerald by inverting stagefailed's default value, since there's only a limited number of ways you can WIN at a special stage.
* Correct a potential source of desync in P_GiveEmerald.
This commit is contained in:
parent
b77780e1e7
commit
18e43a5cef
4 changed files with 34 additions and 11 deletions
|
@ -670,7 +670,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
P_DoMatchSuper(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
emeralds |= special->info->speed;
|
||||
stagefailed = false;
|
||||
}
|
||||
|
||||
if (special->target && special->target->type == MT_EMERALDSPAWN)
|
||||
{
|
||||
|
|
|
@ -2215,7 +2215,7 @@ static void P_LevelInitStuff(void)
|
|||
ssspheres = timeinmap = 0;
|
||||
|
||||
// special stage
|
||||
stagefailed = false;
|
||||
stagefailed = true; // assume failed unless proven otherwise - P_GiveEmerald or emerald touchspecial
|
||||
// Reset temporary record data
|
||||
memset(&ntemprecords, 0, sizeof(nightsdata_t));
|
||||
|
||||
|
|
|
@ -518,10 +518,7 @@ static inline void P_DoSpecialStageStuff(void)
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sstimer = 0;
|
||||
stagefailed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
37
src/p_user.c
37
src/p_user.c
|
@ -302,15 +302,39 @@ void P_GiveEmerald(boolean spawnObj)
|
|||
|
||||
S_StartSound(NULL, sfx_cgot); // Got the emerald!
|
||||
emeralds |= (1 << em);
|
||||
stagefailed = false;
|
||||
|
||||
if (spawnObj && playeringame[consoleplayer])
|
||||
if (spawnObj)
|
||||
{
|
||||
// The Chaos Emerald begins to orbit us!
|
||||
// Only give it to ONE person!
|
||||
mobj_t *emmo = P_SpawnMobjFromMobj(players[consoleplayer].mo, 0, 0, players[consoleplayer].mo->height, MT_GOTEMERALD);
|
||||
P_SetTarget(&emmo->target, players[consoleplayer].mo);
|
||||
P_SetMobjState(emmo, mobjinfo[MT_GOTEMERALD].meleestate + em);
|
||||
P_SetTarget(&players[consoleplayer].mo->tracer, emmo);
|
||||
// Only visibly give it to ONE person!
|
||||
UINT8 i, pnum = ((playeringame[consoleplayer]) && (!players[consoleplayer].spectator) && (players[consoleplayer].mo)) ? consoleplayer : 255;
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
mobj_t *emmo;
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
if (players[i].spectator)
|
||||
continue;
|
||||
if (!players[i].mo)
|
||||
continue;
|
||||
|
||||
emmo = P_SpawnMobjFromMobj(players[i].mo, 0, 0, players[i].mo->height, MT_GOTEMERALD);
|
||||
P_SetTarget(&emmo->target, players[i].mo);
|
||||
P_SetMobjState(emmo, mobjinfo[MT_GOTEMERALD].meleestate + em);
|
||||
P_SetTarget(&players[i].mo->tracer, emmo);
|
||||
|
||||
if (pnum == 255)
|
||||
{
|
||||
i = pnum;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i == pnum)
|
||||
continue;
|
||||
|
||||
emmo->flags2 |= MF2_DONTDRAW;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -615,7 +639,6 @@ static void P_DeNightserizePlayer(player_t *player)
|
|||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
players[i].nightstime = 1; // force everyone else to fall too.
|
||||
player->exiting = 3*TICRATE;
|
||||
stagefailed = true; // NIGHT OVER
|
||||
|
||||
// If you screwed up, kiss your score and ring bonus goodbye.
|
||||
// But only do this in special stage (and instakill!) In regular stages, wait til we hit the ground.
|
||||
|
|
Loading…
Reference in a new issue