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:
toasterbabe 2016-10-13 15:13:33 +01:00
parent 4997564d30
commit 80300ac476
8 changed files with 47 additions and 38 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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