From cea4562c74655b24508bcd04bf21df65baaefd2f Mon Sep 17 00:00:00 2001
From: toasterbabe <rollerorbital@gmail.com>
Date: Tue, 29 May 2018 18:48:57 +0100
Subject: [PATCH] Realised I forgot to commit these, didn't want to move to a
 new laptop-tablet and just have them disappear on me.

* Facestabber statues now have fun breaking effects.
* Fake coronas for candles and prickets.
* hnext and hprev are properly dealt with in MobjThinker if P_MobjIsRemoved.
---
 src/info.c    | 14 +++++++-------
 src/p_enemy.c | 36 +++++++++++++++++++++++++++++++-----
 src/p_mobj.c  | 18 ++++++++++++++++++
 3 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/src/info.c b/src/info.c
index 57c3c0a047..4f4dc1aa7b 100644
--- a/src/info.c
+++ b/src/info.c
@@ -2137,9 +2137,9 @@ state_t states[NUMSTATES] =
 
 	{SPR_CBBS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_FACESTABBERSTATUE
 
-	{SPR_CBBS, 0,  5,        {A_Look}, 768*FRACUNIT, 0, S_SUSPICIOUSFACESTABBERSTATUE_WAIT},   // S_SUSPICIOUSFACESTABBERSTATUE_WAIT
-	{SPR_CBBS, 0, 23,          {NULL},            0, 0, S_SUSPICIOUSFACESTABBERSTATUE_BURST2}, // S_SUSPICIOUSFACESTABBERSTATUE_BURST1
-	{SPR_NULL, 0, 40, {A_StatueBurst},            0, S_FACESTABBER_CHARGE2, S_NULL}, // S_SUSPICIOUSFACESTABBERSTATUE_BURST2
+	{SPR_CBBS, 0,  5,        {A_Look},   768*FRACUNIT, 0, S_SUSPICIOUSFACESTABBERSTATUE_WAIT},   // S_SUSPICIOUSFACESTABBERSTATUE_WAIT
+	{SPR_CBBS, 0, 23,          {NULL},              0, 0, S_SUSPICIOUSFACESTABBERSTATUE_BURST2}, // S_SUSPICIOUSFACESTABBERSTATUE_BURST1
+	{SPR_NULL, 0, 40, {A_StatueBurst}, MT_FACESTABBER, S_FACESTABBER_CHARGE2, S_NULL}, // S_SUSPICIOUSFACESTABBERSTATUE_BURST2
 
 	// Big Tumbleweed
 	{SPR_BTBL, 0, -1, {NULL}, 0, 0, S_NULL},                // S_BIGTUMBLEWEED
@@ -10048,7 +10048,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		1000,           // spawnhealth
 		S_YELLOWSPRINGBALL2, // seestate
 		sfx_None,       // seesound
-		8,              // reactiontime
+		0,              // reactiontime
 		sfx_None,       // attacksound
 		S_NULL,         // painstate
 		0,              // painchance
@@ -10075,7 +10075,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		1000,           // spawnhealth
 		S_REDSPRINGBALL2, // seestate
 		sfx_None,       // seesound
-		8,              // reactiontime
+		0,              // reactiontime
 		sfx_None,       // attacksound
 		S_NULL,         // painstate
 		0,              // painchance
@@ -10552,7 +10552,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		0,              // damage
 		sfx_None,       // activesound
 		MF_SLIDEME|MF_SOLID|MF_PUSHABLE, // flags
-		MT_FACESTABBER  // raisestate
+		MT_ROCKCRUMBLE3 // raisestate
 	},
 
 	{           // MT_BIGTUMBLEWEED
@@ -14304,7 +14304,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		4*FRACUNIT,     // speed
 		4*FRACUNIT,     // radius
 		4*FRACUNIT,     // height
-		0,              // display offset
+		1,              // display offset
 		4,              // mass
 		0,              // damage
 		sfx_None,       // activesound
diff --git a/src/p_enemy.c b/src/p_enemy.c
index d2ef9ab9f0..20b32f2202 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -1188,8 +1188,6 @@ void A_FaceStabRev(mobj_t *actor)
 		return;
 	}
 
-	if (actor->hnext)
-		P_SetTarget(&actor->hnext, NULL);
 	actor->extravalue1 = 0;
 
 	if (!actor->reactiontime)
@@ -1344,13 +1342,14 @@ void A_FaceStabMiss(mobj_t *actor)
 //
 // Description: For suspicious statues only...
 //
-// var1 = unused
+// var1 = object to create
 // var2 = effective nextstate for created object
 //
 void A_StatueBurst(mobj_t *actor)
 {
-	//INT32 locvar1 = var1;
+	INT32 locvar1 = var1;
 	INT32 locvar2 = var2;
+	mobjtype_t chunktype = (mobjtype_t)actor->info->raisestate;
 	mobj_t *new;
 
 #ifdef HAVE_BLUA
@@ -1358,15 +1357,42 @@ void A_StatueBurst(mobj_t *actor)
 		return;
 #endif
 
-	if (!(new = P_SpawnMobjFromMobj(actor, 0, 0, 0, (mobjtype_t)actor->info->raisestate)))
+	if (!locvar1 || !(new = P_SpawnMobjFromMobj(actor, 0, 0, 0, locvar1)))
 		return;
 
 	new->angle = actor->angle;
 	new->target = actor->target;
 	if (locvar2)
 		P_SetMobjState(new, (statenum_t)locvar2);
+	S_StartSound(new, new->info->attacksound);
 	S_StopSound(actor);
 	S_StartSound(actor, sfx_s3k96);
+
+	{
+		fixed_t a, b;
+		fixed_t c = (actor->height>>2) - FixedMul(actor->scale, mobjinfo[chunktype].height>>1);
+		fixed_t v = 4<<FRACBITS;
+		const fixed_t r = (actor->radius>>1);
+		mobj_t *spawned;
+		UINT8 i;
+		for (i = 0; i < 8; i++)
+		{
+			a = ((i & 1) ? r : (-r));
+			b = ((i & 2) ? r : (-r));
+			if (i == 4)
+			{
+				c += (actor->height>>1);
+				v = 8<<FRACBITS;
+			}
+
+			spawned = P_SpawnMobjFromMobj(actor, a, b, c, chunktype);
+
+			P_InstaThrust(spawned, R_PointToAngle2(0, 0, a, b), 8<<FRACBITS);
+			P_SetObjectMomZ(spawned, v, false);
+
+			spawned->fuse = 3*TICRATE;
+		}
+	}
 }
 
 // Function: A_JetJawRoam
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 6c46fe8410..8232586b2e 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -6670,6 +6670,10 @@ void P_MobjThinker(mobj_t *mobj)
 		P_SetTarget(&mobj->target, NULL);
 	if (mobj->tracer && P_MobjWasRemoved(mobj->tracer))
 		P_SetTarget(&mobj->tracer, NULL);
+	if (mobj->hnext && P_MobjWasRemoved(mobj->hnext))
+		P_SetTarget(&mobj->hnext, NULL);
+	if (mobj->hprev && P_MobjWasRemoved(mobj->hprev))
+		P_SetTarget(&mobj->hprev, NULL);
 
 	mobj->eflags &= ~(MFE_PUSHED|MFE_SPRUNG);
 
@@ -8612,6 +8616,20 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
 				}
 			}
 			break;
+		case MT_CANDLE:
+		case MT_CANDLEPRICKET:
+			{
+				// Fake corona!!
+				mobj_t *corona = P_SpawnMobjFromMobj(mobj, 0, 0, ((mobj->type == MT_CANDLE) ? 40 : 176)<<FRACBITS, MT_PARTICLE);
+				//P_SetTarget(&corona->tracer, mobj);
+				//corona->flags2 |= MF2_LINKDRAW; -- crash??????? can't debug right now...
+				corona->sprite = SPR_FLAM;
+				corona->frame = (FF_FULLBRIGHT|FF_TRANS90|12);
+				corona->tics = -1;
+				if (mobj->type == MT_CANDLE)
+					P_SetScale(corona, (corona->destscale = mobj->scale*3));
+			}
+			break;
 		case MT_JACKO1:
 		case MT_JACKO2:
 		case MT_JACKO3:
-- 
GitLab