mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-12 22:02:12 +00:00
Fireflower is now on same level as all other shields, as opposed to being an additional stack layer. (MID LECTURE COMMIT STRATS YO)
This commit is contained in:
parent
4997564d30
commit
80300ac476
8 changed files with 47 additions and 38 deletions
|
@ -192,13 +192,12 @@ typedef enum
|
|||
SH_FLAMEAURA,
|
||||
// Pity shield: the world's most basic shield ever, given to players who suck at Match
|
||||
SH_PITY,
|
||||
// The fireflower used to be stackable with other shields. Not anymore.
|
||||
SH_FIREFLOWER,
|
||||
// The force shield uses the lower 8 bits to count how many extra hits are left.
|
||||
SH_FORCE = 0x100,
|
||||
SH_FORCEHP = 0xFF, // to be used as a bitmask only
|
||||
// The fireflower is special...
|
||||
SH_FIREFLOWER = 0x200,
|
||||
// ...it can combine with other shields.
|
||||
SH_STACK = SH_FIREFLOWER,
|
||||
SH_STACK = 0, //SH_FIREFLOWER,
|
||||
SH_NOSTACK = ~SH_STACK
|
||||
} shieldtype_t; // pw_shield
|
||||
|
||||
|
|
|
@ -7092,8 +7092,8 @@ struct {
|
|||
{"SH_THUNDERCOIN",SH_THUNDERCOIN},
|
||||
{"SH_FLAMEAURA",SH_FLAMEAURA},
|
||||
{"SH_PITY",SH_PITY},
|
||||
{"SH_FIREFLOWER",SH_FIREFLOWER},
|
||||
// These ones are special and use the upper bits
|
||||
{"SH_FIREFLOWER",SH_FIREFLOWER}, // Lower bits are a normal shield stacked on top of the fire flower
|
||||
{"SH_FORCE",SH_FORCE}, // Lower bits are how many hits left, 0 is the last hit
|
||||
// Stack masks
|
||||
{"SH_STACK",SH_STACK},
|
||||
|
|
|
@ -3381,6 +3381,13 @@ void A_ForceShield(mobj_t *actor)
|
|||
player->homing = 0;
|
||||
}
|
||||
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER
|
||||
&& !(player->powers[pw_super] || (mariomode && player->powers[pw_invulnerability])))
|
||||
{
|
||||
player->mo->color = player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
|
||||
player->powers[pw_shield] = SH_FORCE|(player->powers[pw_shield] & SH_STACK)|0x01;
|
||||
P_SpawnShieldOrb(player);
|
||||
S_StartSound(player->mo, actor->info->seesound);
|
||||
|
|
|
@ -1156,12 +1156,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
toucher->movecount = player->powers[pw_shield];
|
||||
player->powers[pw_marioflashing] = MARIOFLASHINGTICS;
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_PITY)
|
||||
player->powers[pw_shield] &= SH_NOSTACK;
|
||||
}
|
||||
player->powers[pw_shield] |= SH_FIREFLOWER; //= (player->powers[pw_shield] & SH_NOSTACK)|SH_FIREFLOWER; -- perfect implementation, not worth it whilst we only have one stack power
|
||||
toucher->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
player->powers[pw_shield] = (player->powers[pw_shield] & SH_STACK)|SH_FIREFLOWER;
|
||||
P_SpawnShieldOrb(player);
|
||||
|
||||
break;
|
||||
|
||||
|
@ -1235,6 +1232,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
S_StartSound(toucher, sfx_mario3);
|
||||
player->mo->movecount = player->powers[pw_shield];
|
||||
player->powers[pw_marioflashing] = MARIOFLASHINGTICS;
|
||||
player->powers[pw_shield] = SH_PITY;
|
||||
P_SpawnShieldOrb(player);
|
||||
}
|
||||
|
@ -2782,6 +2780,7 @@ static inline void P_SuperDamage(player_t *player, mobj_t *inflictor, mobj_t *so
|
|||
void P_RemoveShield(player_t *player)
|
||||
{
|
||||
boolean willbetallmario = (mariomode && ((player->powers[pw_shield] & SH_NOSTACK) != SH_PITY));
|
||||
boolean fireflower = ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER);
|
||||
if (player->powers[pw_shield] & SH_FORCE)
|
||||
{ // Multi-hit
|
||||
if ((player->powers[pw_shield] & SH_FORCEHP) == 0)
|
||||
|
@ -2792,12 +2791,6 @@ void P_RemoveShield(player_t *player)
|
|||
else if ((player->powers[pw_shield] & SH_NOSTACK) == SH_NONE)
|
||||
{ // Second layer shields
|
||||
player->powers[pw_shield] = SH_NONE;
|
||||
// Reset fireflower
|
||||
if (!player->powers[pw_super])
|
||||
{
|
||||
player->mo->color = player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
}
|
||||
else if ((player->powers[pw_shield] & SH_NOSTACK) == SH_BOMB) // Give them what's coming to them!
|
||||
{
|
||||
|
@ -2808,6 +2801,11 @@ void P_RemoveShield(player_t *player)
|
|||
player->powers[pw_shield] = player->powers[pw_shield] & SH_STACK;
|
||||
if (willbetallmario && !player->powers[pw_shield])
|
||||
player->powers[pw_shield] |= SH_PITY;
|
||||
if (fireflower && !(player->powers[pw_super] || (mariomode && player->powers[pw_invulnerability])))
|
||||
{
|
||||
player->mo->color = player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
static void P_ShieldDamage(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 damage)
|
||||
|
|
|
@ -62,9 +62,9 @@
|
|||
#define twodlevel (maptol & TOL_2D)
|
||||
|
||||
#define mariomode (maptol & TOL_MARIO)
|
||||
#define shortmario(player) ((player && mariomode && !player->powers[pw_shield] && !objectplacing) ? 1 : 0)
|
||||
#define shortmario(player) ((player && mariomode && !player->powers[pw_shield]) ? 1 : 0)
|
||||
|
||||
#define MARIOFLASHINGTICS TICRATE/2
|
||||
#define MARIOFLASHINGTICS 21
|
||||
|
||||
#define P_GetPlayerHeight(player) (FixedMul(player->height, player->mo->scale) >> shortmario(player))
|
||||
#define P_GetPlayerSpinHeight(player) (FixedMul(player->spinheight, player->mo->scale) >> shortmario(player))
|
||||
|
|
19
src/p_mobj.c
19
src/p_mobj.c
|
@ -4071,21 +4071,14 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
UINT16 shieldswitch = mobj->player->powers[pw_shield];
|
||||
mobj->player->powers[pw_shield] = mobj->movecount;
|
||||
mobj->movecount = shieldswitch;
|
||||
if ((mobj->player->powers[pw_shield] & SH_FIREFLOWER) != (mobj->movecount & SH_FIREFLOWER))
|
||||
{
|
||||
if (mobj->player->powers[pw_shield] & SH_FIREFLOWER)
|
||||
{
|
||||
mobj->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->color = mobj->player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
}
|
||||
if (mobj->player->powers[pw_shield] & SH_NOSTACK && (mobj->player->powers[pw_shield] & SH_NOSTACK) != (mobj->movecount & SH_NOSTACK))
|
||||
P_SpawnShieldOrb(mobj->player);
|
||||
if ((mobj->player->powers[pw_shield] & SH_NOSTACK) != SH_FIREFLOWER && (mobj->movecount & SH_NOSTACK) == SH_FIREFLOWER
|
||||
&& !(mobj->player->powers[pw_super] || (mariomode && mobj->player->powers[pw_invulnerability])))
|
||||
{
|
||||
mobj->color = mobj->player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
if (mobj->player->powers[pw_flashing] && mobj->player->powers[pw_flashing] < UINT16_MAX && mobj->player->powers[pw_flashing] > flashingtics)
|
||||
|
|
24
src/p_user.c
24
src/p_user.c
|
@ -1340,8 +1340,6 @@ void P_SpawnShieldOrb(player_t *player)
|
|||
I_Error("P_SpawnShieldOrb: player->mo is NULL!\n");
|
||||
#endif
|
||||
|
||||
player->pflags &= ~PF_SHIELDABILITY; // Prevent edge cases when switching shields.
|
||||
|
||||
if (player->powers[pw_shield] & SH_FORCE)
|
||||
orbtype = MT_BLUEORB;
|
||||
else switch (player->powers[pw_shield] & SH_NOSTACK)
|
||||
|
@ -1361,6 +1359,13 @@ void P_SpawnShieldOrb(player_t *player)
|
|||
case SH_PITY:
|
||||
orbtype = MT_PITYORB;
|
||||
break;
|
||||
case SH_FIREFLOWER:
|
||||
if (!(player->powers[pw_super] || (mariomode && player->powers[pw_invulnerability])))
|
||||
{
|
||||
player->mo->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -1456,6 +1461,13 @@ boolean P_SwitchShield(player_t *player, UINT16 shieldtype)
|
|||
}
|
||||
}
|
||||
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER // it's implicit that the new shield isn't a fireflower
|
||||
&& !(player->powers[pw_super] || (mariomode && player->powers[pw_invulnerability])))
|
||||
{
|
||||
player->mo->color = player->skincolor;
|
||||
G_GhostAddColor(GHC_NORMAL);
|
||||
}
|
||||
|
||||
player->powers[pw_shield] = shieldtype|(player->powers[pw_shield] & SH_STACK);
|
||||
P_SpawnShieldOrb(player);
|
||||
return true;
|
||||
|
@ -2164,7 +2176,7 @@ static void P_CheckInvincibilityTimer(player_t *player)
|
|||
{
|
||||
if (mariomode)
|
||||
{
|
||||
if (player->powers[pw_shield] & SH_FIREFLOWER)
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER)
|
||||
{
|
||||
player->mo->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
|
@ -3188,7 +3200,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
if (cmd->buttons & BT_ATTACK || cmd->buttons & BT_FIRENORMAL)
|
||||
{
|
||||
if (!(player->pflags & PF_ATTACKDOWN) && player->powers[pw_shield] & SH_FIREFLOWER && !player->climbing)
|
||||
if (!(player->pflags & PF_ATTACKDOWN) && (player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER && !player->climbing)
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
P_SpawnPlayerMissile(player->mo, MT_FIREBALL, 0);
|
||||
|
@ -3423,7 +3435,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
P_SpawnShieldOrb(player);
|
||||
|
||||
// Restore color
|
||||
if (player->powers[pw_shield] & SH_FIREFLOWER)
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER)
|
||||
{
|
||||
player->mo->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
|
@ -3473,7 +3485,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
player->powers[pw_super] = 0;
|
||||
|
||||
// Restore color
|
||||
if (player->powers[pw_shield] & SH_FIREFLOWER)
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_FIREFLOWER)
|
||||
{
|
||||
player->mo->color = SKINCOLOR_WHITE;
|
||||
G_GhostAddColor(GHC_FIREFLOWER);
|
||||
|
|
|
@ -1128,7 +1128,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
fixed_t offset, offset2;
|
||||
boolean papersprite = !!(thing->frame & FF_PAPERSPRITE);
|
||||
|
||||
fixed_t shortmarioshift = shortmario(thing->player);
|
||||
fixed_t shortmarioshift = (objectplacing ? 0 : shortmario(thing->player));
|
||||
|
||||
INT32 dispoffset = thing->info->dispoffset;
|
||||
|
||||
|
|
Loading…
Reference in a new issue