From 80300ac476d08d478fc609c80451d4ca99f56480 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 13 Oct 2016 15:13:33 +0100 Subject: [PATCH] Fireflower is now on same level as all other shields, as opposed to being an additional stack layer. (MID LECTURE COMMIT STRATS YO) --- src/d_player.h | 7 +++---- src/dehacked.c | 2 +- src/p_enemy.c | 7 +++++++ src/p_inter.c | 20 +++++++++----------- src/p_local.h | 4 ++-- src/p_mobj.c | 19 ++++++------------- src/p_user.c | 24 ++++++++++++++++++------ src/r_things.c | 2 +- 8 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 1fa101e12..4bdfb9581 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/dehacked.c b/src/dehacked.c index b6076f872..7e50f1d8d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -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}, diff --git a/src/p_enemy.c b/src/p_enemy.c index dccc6a8ea..a519563de 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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); diff --git a/src/p_inter.c b/src/p_inter.c index 05f8b3d4e..4d34de374 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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) diff --git a/src/p_local.h b/src/p_local.h index 4568fe4d8..7107432ef 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -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)) diff --git a/src/p_mobj.c b/src/p_mobj.c index 50a80ebea..822f2ef85 100644 --- a/src/p_mobj.c +++ b/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) diff --git a/src/p_user.c b/src/p_user.c index d81c9e19f..ffbff5ed4 100644 --- a/src/p_user.c +++ b/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); diff --git a/src/r_things.c b/src/r_things.c index 823dda3ac..eb1a3cb25 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -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;