From 471ae8ecb4b146fffd1749cf7465a4ac3b7f86b6 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 13 Nov 2019 16:33:53 +0000 Subject: [PATCH 1/5] Paper sign tweaks. * Add "twinkling" and "landing sounds to paper signpost. * Fix whitespace on definitions. * It says locvar2 is unused in the comment for A_SignSpin, but it's used for the "doesn't have a spawnpoint" thing. Make it deathstate instead, so the object doesn't disappear. --- src/info.c | 28 ++++++++++++++-------------- src/p_enemy.c | 14 ++++++++++++-- src/sounds.c | 2 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/info.c b/src/info.c index 698e6c25f..f00d32e0a 100644 --- a/src/info.c +++ b/src/info.c @@ -1911,18 +1911,18 @@ state_t states[NUMSTATES] = {SPR_BBLS, 3, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES4 // Level End Sign - {SPR_SIGN, 0, -1, {A_SignPlayer}, -3, 0, S_NULL}, // S_SIGN - {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN2}, // S_SIGNSPIN1 - {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN1, S_SIGNSPIN3}, // S_SIGNSPIN2 - {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN4}, // S_SIGNSPIN3 - {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN5}, // S_SIGNSPIN4 - {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN4, S_SIGNSPIN6}, // S_SIGNSPIN5 - {SPR_SIGN, 0, 0, {A_SignPlayer}, -3, 0, S_SIGNSPIN1}, // S_SIGNSPIN6 - {SPR_SIGN, 0, 1, {A_SignPlayer}, -1, 0, S_SIGNSLOW}, // S_SIGNPLAYER - {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSLOW}, // S_SIGNSLOW - {SPR_SIGN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNSTOP - {SPR_SIGN, FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNBOARD - {SPR_SIGN, FF_PAPERSPRITE|1, -1, {NULL}, 0, 29, S_NULL}, // S_EGGMANSIGN + {SPR_SIGN, 0, -1, {A_SignPlayer}, -3, 0, S_NULL}, // S_SIGN + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN2}, // S_SIGNSPIN1 + {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN1, S_SIGNSPIN3}, // S_SIGNSPIN2 + {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN4}, // S_SIGNSPIN3 + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN5}, // S_SIGNSPIN4 + {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN4, S_SIGNSPIN6}, // S_SIGNSPIN5 + {SPR_SIGN, 0, 0, {A_SignPlayer}, -3, 0, S_SIGNSPIN1}, // S_SIGNSPIN6 + {SPR_SIGN, 0, 1, {A_SignPlayer}, -1, 0, S_SIGNSLOW}, // S_SIGNPLAYER + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSLOW}, // S_SIGNSLOW + {SPR_SIGN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNSTOP + {SPR_SIGN, FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNBOARD + {SPR_SIGN, FF_PAPERSPRITE|1, -1, {NULL}, 0, 29, S_NULL}, // S_EGGMANSIGN // Spike Ball {SPR_SPIK, 0, 1, {NULL}, 0, 0, S_SPIKEBALL2}, // S_SPIKEBALL1 @@ -7794,12 +7794,12 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // attacksound S_SIGNPLAYER, // painstate MT_SPARK, // painchance - sfx_None, // painsound + sfx_s3kb8, // painsound S_EGGMANSIGN, // meleestate S_NULL, // missilestate S_SIGNSTOP, // deathstate S_NULL, // xdeathstate - sfx_None, // deathsound + sfx_s3k64, // deathsound 8, // speed 36*FRACUNIT, // radius 32*FRACUNIT, // height diff --git a/src/p_enemy.c b/src/p_enemy.c index 27033acbc..3cb2b3354 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5031,7 +5031,6 @@ void A_UnsetSolidSteam(mobj_t *actor) void A_SignSpin(mobj_t *actor) { INT32 locvar1 = var1; - INT32 locvar2 = var2; INT16 i; angle_t rotateangle = FixedAngle(locvar1 << FRACBITS); @@ -5042,6 +5041,11 @@ void A_SignSpin(mobj_t *actor) if (P_IsObjectOnGround(actor) && P_MobjFlip(actor) * actor->momz <= 0) { + if (actor->flags2 & MF2_BOSSFLEE) + { + S_StartSound(actor, actor->info->deathsound); + actor->flags2 &= ~MF2_BOSSFLEE; + } if (actor->spawnpoint) { angle_t mapangle = FixedAngle(actor->spawnpoint->angle << FRACBITS); @@ -5058,14 +5062,20 @@ void A_SignSpin(mobj_t *actor) } else // no mapthing? just finish in your current angle { - P_SetMobjState(actor, locvar2); + P_SetMobjState(actor, actor->info->deathstate); return; } } else { + if (!(actor->flags2 & MF2_BOSSFLEE)) + { + S_StartSound(actor, actor->info->painsound); + actor->flags2 |= MF2_BOSSFLEE; + } actor->movedir = rotateangle; } + actor->angle += actor->movedir; if (actor->tracer == NULL || P_MobjWasRemoved(actor->tracer)) return; for (i = -1; i < 2; i += 2) diff --git a/src/sounds.c b/src/sounds.c index 197bfc066..b067903b1 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -578,7 +578,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3kb5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Clink"}, {"s3kb6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Spin launch"}, {"s3kb7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Tumbler"}, - {"s3kb8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Falling signpost"}, + {"s3kb8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Spinning signpost"}, {"s3kb9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Ring loss"}, {"s3kba", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flight"}, {"s3kbb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Tired flight"}, From b4da50b7fb5861e16a856746ab95ad1c6bbcc827 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 13 Nov 2019 16:51:50 +0000 Subject: [PATCH 2/5] When you have the skin to set to in A_SignPlayer be "next skin", it's possible the initial skin to pick is a not-available character. This commit prevents that. --- src/p_enemy.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 3cb2b3354..564b9bb31 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5165,15 +5165,26 @@ void A_SignPlayer(mobj_t *actor) // I turned this function into a fucking mess. I'm so sorry. -Lach if (locvar1 == -2) // next skin { + player_t *player = actor->target ? actor->target->player : NULL; + UINT8 skinnum; +#define skincheck(num) (player ? !R_SkinUsable(player-players, num) : skins[num].availability > 0) if (ov->skin == NULL) // pick a random skin to start with! - skin = &skins[P_RandomKey(numskins)]; + { + UINT8 skincount = 0; + for (skincount = 0; skincount < numskins; skincount++) + if (!skincheck(skincount)) + skincount++; + skinnum = P_RandomKey(skincount); + for (skincount = skinnum; skincount < numskins; skincount++) + if (skincheck(skinnum)) + skinnum++; + } else // otherwise, advance 1 skin { - UINT8 skinnum = (skin_t*)ov->skin-skins; - player_t *player = actor->target ? actor->target->player : NULL; - while ((skinnum = (skinnum + 1) % numskins) && (player ? !R_SkinUsable(player-players, skinnum) : skins[skinnum].availability > 0)); - skin = &skins[skinnum]; + skinnum = (skin_t*)ov->skin-skins; + while ((skinnum = (skinnum + 1) % numskins) && skincheck(skinnum)); } + skin = &skins[skinnum]; } else // specific skin { From fc8392dac46c91590dc17146ac861aa2568f26fc Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 13 Nov 2019 16:54:44 +0000 Subject: [PATCH 3/5] Typo (my fault). --- src/p_enemy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 564b9bb31..6fdfd8c55 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5176,7 +5176,7 @@ void A_SignPlayer(mobj_t *actor) skincount++; skinnum = P_RandomKey(skincount); for (skincount = skinnum; skincount < numskins; skincount++) - if (skincheck(skinnum)) + if (skincheck(skincount)) skinnum++; } else // otherwise, advance 1 skin From 527195c2145ef6b24c09c1e22e7b8f90d80f3dd8 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 13 Nov 2019 16:59:15 +0000 Subject: [PATCH 4/5] I should be more careful when commiting, lmao. (Just a little bit of tying off loose ends for peace of mind.) --- src/p_enemy.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_enemy.c b/src/p_enemy.c index 6fdfd8c55..1c6625bd9 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5184,6 +5184,7 @@ void A_SignPlayer(mobj_t *actor) skinnum = (skin_t*)ov->skin-skins; while ((skinnum = (skinnum + 1) % numskins) && skincheck(skinnum)); } +#undef skincheck skin = &skins[skinnum]; } else // specific skin From ec44b24f72416c20bbee02bcaa400dfa8f0bb8c0 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 13 Nov 2019 17:06:54 +0000 Subject: [PATCH 5/5] Ok, I'm really paying for my hubris. Corrected a faulty optimisation in my fix. --- src/p_enemy.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 1c6625bd9..00f3c52c6 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5175,9 +5175,13 @@ void A_SignPlayer(mobj_t *actor) if (!skincheck(skincount)) skincount++; skinnum = P_RandomKey(skincount); - for (skincount = skinnum; skincount < numskins; skincount++) + for (skincount = 0; skincount < numskins; skincount++) + { if (skincheck(skincount)) skinnum++; + if (skincount > skinnum) + break; + } } else // otherwise, advance 1 skin {