From bc1e4eff7208d9d29c3374531764c5d9b8d5d09b Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <c.oelckers@users.noreply.github.com>
Date: Sat, 26 Nov 2016 10:30:41 +0100
Subject: [PATCH] - scriptified the Cleric's flame weapon. Also fixed the angle
 calculations for the circle flame.

---
 src/CMakeLists.txt                          |   1 -
 src/g_hexen/a_clericflame.cpp               | 138 --------------------
 src/g_hexen/a_hexenmisc.cpp                 |   1 -
 wadsrc/static/zscript/hexen/clericflame.txt | 101 +++++++++++++-
 4 files changed, 94 insertions(+), 147 deletions(-)
 delete mode 100644 src/g_hexen/a_clericflame.cpp

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 41419df79..376d33887 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -855,7 +855,6 @@ set( NOT_COMPILED_SOURCE_FILES
 	${OTHER_SYSTEM_SOURCES}
 	sc_man_scanner.h
 	sc_man_scanner.re
-	g_hexen/a_clericflame.cpp
 	g_hexen/a_clericholy.cpp
 	g_hexen/a_clericmace.cpp
 	g_hexen/a_clericstaff.cpp
diff --git a/src/g_hexen/a_clericflame.cpp b/src/g_hexen/a_clericflame.cpp
deleted file mode 100644
index d4f86ecd5..000000000
--- a/src/g_hexen/a_clericflame.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-#include "actor.h"
-#include "gi.h"
-#include "m_random.h"
-#include "s_sound.h"
-#include "d_player.h"
-#include "a_action.h"
-#include "p_local.h"
-#include "a_action.h"
-#include "p_pspr.h"
-#include "gstrings.h"
-#include "a_hexenglobal.h"
-#include "vm.h"
-*/
-
-const double FLAMESPEED	= 0.45;
-const double FLAMEROTSPEED	= 2.;
-
-static FRandom pr_missile ("CFlameMissile");
-
-void A_CFlameAttack (AActor *);
-void A_CFlameRotate (AActor *);
-void A_CFlamePuff (AActor *);
-void A_CFlameMissile (AActor *);
-
-// Flame Missile ------------------------------------------------------------
-
-
-//============================================================================
-//
-// A_CFlameAttack
-//
-//============================================================================
-
-DEFINE_ACTION_FUNCTION(AActor, A_CFlameAttack)
-{
-	PARAM_ACTION_PROLOGUE(AActor);
-
-	player_t *player;
-
-	if (NULL == (player = self->player))
-	{
-		return 0;
-	}
-	AWeapon *weapon = self->player->ReadyWeapon;
-	if (weapon != NULL)
-	{
-		if (!weapon->DepleteAmmo (weapon->bAltFire))
-			return 0;
-	}
-	P_SpawnPlayerMissile (self, PClass::FindActor("CFlameMissile"));
-	S_Sound (self, CHAN_WEAPON, "ClericFlameFire", 1, ATTN_NORM);
-	return 0;
-}
-
-//============================================================================
-//
-// A_CFlamePuff
-//
-//============================================================================
-
-DEFINE_ACTION_FUNCTION(AActor, A_CFlamePuff)
-{
-	PARAM_SELF_PROLOGUE(AActor);
-
-	self->renderflags &= ~RF_INVISIBLE;
-	self->Vel.Zero();
-	S_Sound (self, CHAN_BODY, "ClericFlameExplode", 1, ATTN_NORM);
-	return 0;
-}
-
-//============================================================================
-//
-// A_CFlameMissile
-//
-//============================================================================
-
-DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile)
-{
-	PARAM_SELF_PROLOGUE(AActor);
-
-	int i;
-	DAngle an;
-	double dist;
-	AActor *mo;
-	
-	self->renderflags &= ~RF_INVISIBLE;
-	S_Sound (self, CHAN_BODY, "ClericFlameExplode", 1, ATTN_NORM);
-	AActor *BlockingMobj = self->BlockingMobj;
-	if (BlockingMobj && BlockingMobj->flags&MF_SHOOTABLE)
-	{ // Hit something, so spawn the flame circle around the thing
-		dist = BlockingMobj->radius + 18;
-		for (i = 0; i < 4; i++)
-		{
-			an = i*45.;
-			mo = Spawn ("CircleFlame", BlockingMobj->Vec3Angle(dist, an, 5), ALLOW_REPLACE);
-			if (mo)
-			{
-				mo->Angles.Yaw = an;
-				mo->target = self->target;
-				mo->VelFromAngle(FLAMESPEED);
-				mo->specialf1 = mo->Vel.X;
-				mo->specialf2 = mo->Vel.Y;
-				mo->tics -= pr_missile()&3;
-			}
-			mo = Spawn("CircleFlame", BlockingMobj->Vec3Angle(dist, an, 5), ALLOW_REPLACE);
-			if(mo)
-			{
-				mo->Angles.Yaw = an + 180.;
-				mo->target = self->target;
-				mo->VelFromAngle(-FLAMESPEED);
-				mo->specialf1 = mo->Vel.X;
-				mo->specialf2 = mo->Vel.Y;
-				mo->tics -= pr_missile()&3;
-			}
-		}
-		self->SetState (self->SpawnState);
-	}
-	return 0;
-}
-
-//============================================================================
-//
-// A_CFlameRotate
-//
-//============================================================================
-
-DEFINE_ACTION_FUNCTION(AActor, A_CFlameRotate)
-{
-	PARAM_SELF_PROLOGUE(AActor);
-
-	DAngle an = self->Angles.Yaw + 90.;
-	self->VelFromAngle(FLAMEROTSPEED, an);
-	self->Vel += DVector2(self->specialf1, self->specialf2);
-
-	self->Angles.Yaw += 6.;
-	return 0;
-}
diff --git a/src/g_hexen/a_hexenmisc.cpp b/src/g_hexen/a_hexenmisc.cpp
index fa8d151a7..cbe9d3c12 100644
--- a/src/g_hexen/a_hexenmisc.cpp
+++ b/src/g_hexen/a_hexenmisc.cpp
@@ -24,7 +24,6 @@
 #include "serializer.h"
 
 // Include all the Hexen stuff here to reduce compile time
-#include "a_clericflame.cpp"
 #include "a_clericholy.cpp"
 #include "a_clericmace.cpp"
 #include "a_clericstaff.cpp"
diff --git a/wadsrc/static/zscript/hexen/clericflame.txt b/wadsrc/static/zscript/hexen/clericflame.txt
index 37e4149f9..d222a07db 100644
--- a/wadsrc/static/zscript/hexen/clericflame.txt
+++ b/wadsrc/static/zscript/hexen/clericflame.txt
@@ -16,8 +16,6 @@ class CWeapFlame : ClericWeapon
 		Tag "$TAG_CWEAPFLAME";
 	}
 
-	action native void A_CFlameAttack();
-
 	States
 	{
 	Spawn:
@@ -43,6 +41,29 @@ class CWeapFlame : ClericWeapon
 		CFLM G 2;
 		Goto Ready;
 	}
+	
+	//============================================================================
+	//
+	// A_CFlameAttack
+	//
+	//============================================================================
+
+	action void A_CFlameAttack()
+	{
+		if (player == null)
+		{
+			return;
+		}
+
+		Weapon weapon = player.ReadyWeapon;
+		if (weapon != null)
+		{
+			if (!weapon.DepleteAmmo (weapon.bAltFire))
+				return;
+		}
+		SpawnPlayerMissile ("CFlameMissile");
+		A_PlaySound ("ClericFlameFire", CHAN_WEAPON);
+	}
 }
 
 // Floor Flame --------------------------------------------------------------
@@ -127,6 +148,9 @@ class FlamePuff2 : FlamePuff
 
 class CircleFlame : Actor
 {
+	const FLAMESPEED = 0.45;
+	const FLAMEROTSPEED = 2.;
+	
 	Default
 	{
 		Radius 6;
@@ -140,8 +164,6 @@ class CircleFlame : Actor
 		Obituary "$OB_MPCWEAPFLAME";
 	}
 
-	native void A_CFlameRotate();
-
 	States
 	{
 	Spawn:
@@ -166,6 +188,20 @@ class CircleFlame : Actor
 		CFCF TUVWXYZ 3 Bright;
 		Stop;
 	}
+	
+	//============================================================================
+	//
+	// A_CFlameRotate
+	//
+	//============================================================================
+
+	void A_CFlameRotate()
+	{
+		double an = Angle + 90.;
+		VelFromAngle(FLAMEROTSPEED, an);
+		Vel.XY += (specialf1, specialf2);
+		Angle += 6;
+	}
 }
 
 // Flame Missile ------------------------------------------------------------
@@ -184,9 +220,6 @@ class CFlameMissile : FastProjectile
 		Obituary "$OB_MPCWEAPFLAME";
 	}
 
-	native void A_CFlamePuff();
-	native void A_CFlameMissile();
-
 	States
 	{
 	Spawn:
@@ -232,4 +265,58 @@ class CFlameMissile : FastProjectile
 		}
 	}
 	
+	//============================================================================
+	//
+	// A_CFlamePuff
+	//
+	//============================================================================
+
+	void A_CFlamePuff()
+	{
+		bInvisible = false;
+		Vel = (0,0,0);
+		A_PlaySound ("ClericFlameExplode", CHAN_BODY);
+	}
+
+	//============================================================================
+	//
+	// A_CFlameMissile
+	//
+	//============================================================================
+
+	void A_CFlameMissile()
+	{
+		bInvisible = false;
+		A_PlaySound ("ClericFlameExplode", CHAN_BODY);
+		if (BlockingMobj && BlockingMobj.bShootable)
+		{ // Hit something, so spawn the flame circle around the thing
+			double dist = BlockingMobj.radius + 18;
+			for (int i = 0; i < 4; i++)
+			{
+				double an = i*45.;
+				Actor mo = Spawn ("CircleFlame", BlockingMobj.Vec3Angle(dist, an, 5), ALLOW_REPLACE);
+				if (mo)
+				{
+					mo.angle = an;
+					mo.target = target;
+					mo.VelFromAngle(CircleFlame.FLAMESPEED);
+					mo.specialf1 = mo.Vel.X;
+					mo.specialf2 = mo.Vel.Y;
+					mo.tics -= random[FlameMissile]()&3;
+				}
+				an += 180;
+				mo = Spawn("CircleFlame", BlockingMobj.Vec3Angle(dist, an, 5), ALLOW_REPLACE);
+				if(mo)
+				{
+					mo.angle = an;
+					mo.target = target;
+					mo.VelFromAngle(-CircleFlame.FLAMESPEED);
+					mo.specialf1 = mo.Vel.X;
+					mo.specialf2 = mo.Vel.Y;
+					mo.tics -= random[FlameMissile]()&3;
+				}
+			}
+			SetState (SpawnState);
+		}
+	}
 }