- Changed increased lightning damage for Centaurs into a damage factor.

- Changed PoisonCloud and Lightning special treatment in P_DamageMobj to use damage
  types instead to keep dependencies on specific actor types out of the main engine code.
- Added Korax DECORATE conversion by Gez and a few others by Karate Chris.


SVN r1130 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-08 15:18:23 +00:00
parent b695330e90
commit e010561088
19 changed files with 918 additions and 1047 deletions

View file

@ -1,4 +1,8 @@
August 8, 2008 (Changes by Graf Zahl)
- Changed increased lightning damage for Centaurs into a damage factor.
- Changed PoisonCloud and Lightning special treatment in P_DamageMobj to use damage
types instead to keep dependencies on specific actor types out of the main engine code.
- Added Korax DECORATE conversion by Gez and a few others by Karate Chris.
- Removed FourthWeaponClass and based Hexen's fourth weapons on the generic weapon
pieces.
- Added DECORATE conversions for Hexen's Fighter weapons by Karate Chris.

View file

@ -206,6 +206,14 @@ ACTOR(MinotaurChase)
ACTOR(MinotaurDeath)
// Hexen stuff
ACTOR(KoraxChase)
ACTOR(KoraxDecide)
ACTOR(KoraxBonePop)
ACTOR(KoraxMissile)
ACTOR(KoraxCommand)
ACTOR(KSpiritRoam)
ACTOR(KBolt)
ACTOR(KBoltRaise)
ACTOR(BatSpawnInit)
ACTOR(BatSpawn)
ACTOR(BatMove)
@ -265,10 +273,31 @@ WEAPON(FHammerThrow)
ACTOR(DropWeaponPieces)
WEAPON(FSwordAttack)
WEAPON(FSwordFlames)
ACTOR(DragonInitFlight)
ACTOR(DragonFlap)
ACTOR(DragonFlight)
ACTOR(DragonPain)
ACTOR(DragonAttack)
ACTOR(DragonCheckCrash)
ACTOR(DragonFX2)
ACTOR(PotteryExplode)
ACTOR(PotteryChooseBit)
ACTOR(PotteryCheck)
ACTOR(CorpseBloodDrip)
ACTOR(CorpseExplode)
ACTOR(LeafSpawn)
ACTOR(LeafThrust)
ACTOR(LeafCheck)
ACTOR(PoisonShroom)
ACTOR(SoAExplode)
ACTOR(BellReset1)
ACTOR(BellReset2)
ACTOR(Summon)
ACTOR(PoisonBagInit)
ACTOR(CheckThrowBomb)
ACTOR(CheckThrowBomb2)
ACTOR(PoisonBagDamage)
ACTOR(PoisonBagCheck)
ACTOR(ClassBossHealth)
ACTOR(ClericAttack)
ACTOR(FighterAttack)

View file

@ -19,168 +19,6 @@ void A_DragonAttack (AActor *);
void A_DragonCheckCrash (AActor *);
void A_DragonFX2 (AActor *);
// Dragon -------------------------------------------------------------------
class ADragon : public AActor
{
DECLARE_ACTOR (ADragon, AActor)
};
FState ADragon::States[] =
{
#define S_DRAGON_LOOK1 0
S_NORMAL (DRAG, 'D', 10, A_Look , &States[S_DRAGON_LOOK1]),
#define S_DRAGON_INIT (S_DRAGON_LOOK1+1)
S_NORMAL (DRAG, 'C', 5, NULL , &States[S_DRAGON_INIT+1]),
S_NORMAL (DRAG, 'B', 5, NULL , &States[S_DRAGON_INIT+2]),
S_NORMAL (DRAG, 'A', 5, A_DragonInitFlight , &States[S_DRAGON_INIT+3]),
S_NORMAL (DRAG, 'B', 3, A_DragonFlap , &States[S_DRAGON_INIT+4]),
S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+5]),
S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+6]),
S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+7]),
S_NORMAL (DRAG, 'D', 3, A_DragonFlight , &States[S_DRAGON_INIT+8]),
S_NORMAL (DRAG, 'D', 3, A_DragonFlight , &States[S_DRAGON_INIT+9]),
S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+10]),
S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+11]),
S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+12]),
S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+13]),
S_NORMAL (DRAG, 'A', 3, A_DragonFlight , &States[S_DRAGON_INIT+14]),
S_NORMAL (DRAG, 'A', 3, A_DragonFlight , &States[S_DRAGON_INIT+3]),
#define S_DRAGON_PAIN1 (S_DRAGON_INIT+15)
S_NORMAL (DRAG, 'F', 10, A_DragonPain , &States[S_DRAGON_INIT+3]),
#define S_DRAGON_ATK1 (S_DRAGON_PAIN1+1)
S_NORMAL (DRAG, 'E', 8, A_DragonAttack , &States[S_DRAGON_INIT+3]),
#define S_DRAGON_DEATH1 (S_DRAGON_ATK1+1)
S_NORMAL (DRAG, 'G', 5, A_Scream , &States[S_DRAGON_DEATH1+1]),
S_NORMAL (DRAG, 'H', 4, A_NoBlocking , &States[S_DRAGON_DEATH1+2]),
S_NORMAL (DRAG, 'I', 4, NULL , &States[S_DRAGON_DEATH1+3]),
S_NORMAL (DRAG, 'J', 4, A_DragonCheckCrash , &States[S_DRAGON_DEATH1+3]),
#define S_DRAGON_CRASH1 (S_DRAGON_DEATH1+4)
S_NORMAL (DRAG, 'K', 5, NULL , &States[S_DRAGON_CRASH1+1]),
S_NORMAL (DRAG, 'L', 5, NULL , &States[S_DRAGON_CRASH1+2]),
S_NORMAL (DRAG, 'M', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (ADragon, Hexen, 254, 0)
PROP_SpawnHealth (640)
PROP_PainChance (128)
PROP_SpeedFixed (10)
PROP_HeightFixed (65)
PROP_MassLong (0x7fffffff)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT|MF_NOBLOOD|MF_COUNTKILL)
PROP_Flags2 (MF2_PASSMOBJ|MF2_BOSS)
PROP_Flags3 (MF3_DONTMORPH|MF3_NOTARGET)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_DRAGON_LOOK1)
PROP_SeeState (S_DRAGON_INIT)
PROP_PainState (S_DRAGON_PAIN1)
PROP_MissileState (S_DRAGON_ATK1)
PROP_DeathState (S_DRAGON_DEATH1)
PROP_SeeSound ("DragonSight")
PROP_AttackSound ("DragonAttack")
PROP_PainSound ("DragonPain")
PROP_DeathSound ("DragonDeath")
PROP_ActiveSound ("DragonActive")
PROP_Obituary ("$OB_DRAGON")
END_DEFAULTS
// Dragon Fireball ----------------------------------------------------------
class ADragonFireball : public AActor
{
DECLARE_ACTOR (ADragonFireball, AActor)
};
FState ADragonFireball::States[] =
{
#define S_DRAGON_FX1_1 0
S_BRIGHT (DRFX, 'A', 4, NULL , &States[S_DRAGON_FX1_1+1]),
S_BRIGHT (DRFX, 'B', 4, NULL , &States[S_DRAGON_FX1_1+2]),
S_BRIGHT (DRFX, 'C', 4, NULL , &States[S_DRAGON_FX1_1+3]),
S_BRIGHT (DRFX, 'D', 4, NULL , &States[S_DRAGON_FX1_1+4]),
S_BRIGHT (DRFX, 'E', 4, NULL , &States[S_DRAGON_FX1_1+5]),
S_BRIGHT (DRFX, 'F', 4, NULL , &States[S_DRAGON_FX1_1]),
#define S_DRAGON_FX1_X1 (S_DRAGON_FX1_1+6)
S_BRIGHT (DRFX, 'G', 4, NULL , &States[S_DRAGON_FX1_X1+1]),
S_BRIGHT (DRFX, 'H', 4, NULL , &States[S_DRAGON_FX1_X1+2]),
S_BRIGHT (DRFX, 'I', 4, NULL , &States[S_DRAGON_FX1_X1+3]),
S_BRIGHT (DRFX, 'J', 4, A_DragonFX2 , &States[S_DRAGON_FX1_X1+4]),
S_BRIGHT (DRFX, 'K', 3, NULL , &States[S_DRAGON_FX1_X1+5]),
S_BRIGHT (DRFX, 'L', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ADragonFireball, Hexen, -1, 0)
PROP_SpeedFixed (24)
PROP_RadiusFixed (12)
PROP_HeightFixed (10)
PROP_Damage (6)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_DRAGON_FX1_1)
PROP_DeathState (S_DRAGON_FX1_X1)
PROP_DeathSound ("DragonFireballExplode")
END_DEFAULTS
// Dragon Fireball Secondary Explosion --------------------------------------
class ADragonExplosion : public AActor
{
DECLARE_ACTOR (ADragonExplosion, AActor)
public:
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
};
FState ADragonExplosion::States[] =
{
#define S_DRAGON_FX2_1 0
S_BRIGHT (CFCF, 'Q', 1, NULL , &States[S_DRAGON_FX2_1+1]),
S_BRIGHT (CFCF, 'Q', 4, A_UnHideThing , &States[S_DRAGON_FX2_1+2]),
S_BRIGHT (CFCF, 'R', 3, A_Scream , &States[S_DRAGON_FX2_1+3]),
S_BRIGHT (CFCF, 'S', 4, NULL , &States[S_DRAGON_FX2_1+4]),
S_BRIGHT (CFCF, 'T', 3, A_Explode , &States[S_DRAGON_FX2_1+5]),
S_BRIGHT (CFCF, 'U', 4, NULL , &States[S_DRAGON_FX2_1+6]),
S_BRIGHT (CFCF, 'V', 3, NULL , &States[S_DRAGON_FX2_1+7]),
S_BRIGHT (CFCF, 'W', 4, NULL , &States[S_DRAGON_FX2_1+8]),
S_BRIGHT (CFCF, 'X', 3, NULL , &States[S_DRAGON_FX2_1+9]),
S_BRIGHT (CFCF, 'Y', 4, NULL , &States[S_DRAGON_FX2_1+10]),
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ADragonExplosion, Hexen, -1, 0)
PROP_RadiusFixed (8)
PROP_HeightFixed (8)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderFlags (RF_INVISIBLE)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_DRAGON_FX2_1)
PROP_DeathSound ("DragonFireballExplode")
END_DEFAULTS
void ADragonExplosion::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
{
damage = 80;
hurtSource = false;
}
//============================================================================
//
// DragonSeek
@ -258,7 +96,7 @@ static void DragonSeek (AActor *actor, angle_t thresh, angle_t turnMax)
}
else if (pr_dragonseek() < 128 && P_CheckMissileRange(actor))
{
P_SpawnMissile(actor, target, RUNTIME_CLASS(ADragonFireball));
P_SpawnMissile(actor, target, PClass::FindClass ("DragonFireball"));
S_Sound (actor, CHAN_WEAPON, actor->AttackSound, 1, ATTN_NORM);
}
actor->target = oldTarget;
@ -409,7 +247,7 @@ void A_DragonFlap (AActor *actor)
void A_DragonAttack (AActor *actor)
{
P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ADragonFireball));
P_SpawnMissile (actor, actor->target, PClass::FindClass ("DragonFireball"));
}
//============================================================================
@ -431,7 +269,7 @@ void A_DragonFX2 (AActor *actor)
fixed_t y = actor->y+((pr_dragonfx2()-128)<<14);
fixed_t z = actor->z+((pr_dragonfx2()-128)<<12);
mo = Spawn<ADragonExplosion> (x, y, z, ALLOW_REPLACE);
mo = Spawn ("DragonExplosion", x, y, z, ALLOW_REPLACE);
if (mo)
{
mo->tics = delay+(pr_dragonfx2()&3)*i*2;
@ -451,7 +289,7 @@ void A_DragonPain (AActor *actor)
A_Pain (actor);
if (!actor->tracer)
{ // no destination spot yet
actor->SetState (&ADragon::States[S_DRAGON_INIT]);
actor->SetState (actor->SeeState);
}
}
@ -465,6 +303,6 @@ void A_DragonCheckCrash (AActor *actor)
{
if (actor->z <= actor->floorz)
{
actor->SetState (&ADragon::States[S_DRAGON_CRASH1]);
actor->SetState (actor->FindState ("Crash"));
}
}

View file

@ -22,82 +22,29 @@ void A_CheckThrowBomb (AActor *);
void A_CheckThrowBomb2 (AActor *);
void A_TimeBomb(AActor *self);
// Fire Bomb (Flechette used by Mage) ---------------------------------------
class AFireBomb : public AActor
{
DECLARE_ACTOR (AFireBomb, AActor)
public:
};
FState AFireBomb::States[] =
{
#define S_FIREBOMB1 0
S_NORMAL (PSBG, 'A', 20, NULL , &States[S_FIREBOMB1+1]),
S_NORMAL (PSBG, 'A', 10, NULL , &States[S_FIREBOMB1+2]),
S_NORMAL (PSBG, 'A', 10, NULL , &States[S_FIREBOMB1+3]),
S_NORMAL (PSBG, 'B', 4, NULL , &States[S_FIREBOMB1+4]),
S_NORMAL (PSBG, 'C', 4, A_Scream , &States[S_FIREBOMB1+5]),
S_BRIGHT (XPL1, 'A', 4, A_TimeBomb , &States[S_FIREBOMB1+6]),
S_BRIGHT (XPL1, 'B', 4, NULL , &States[S_FIREBOMB1+7]),
S_BRIGHT (XPL1, 'C', 4, NULL , &States[S_FIREBOMB1+8]),
S_BRIGHT (XPL1, 'D', 4, NULL , &States[S_FIREBOMB1+9]),
S_BRIGHT (XPL1, 'E', 4, NULL , &States[S_FIREBOMB1+10]),
S_BRIGHT (XPL1, 'F', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOGRAVITY)
PROP_Flags3 (MF3_FOILINVUL)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_ALTSHADOW)
PROP_SpawnState (S_FIREBOMB1)
PROP_DeathSound ("FlechetteExplode")
END_DEFAULTS
// Poison Bag Artifact (Flechette) ------------------------------------------
class AArtiPoisonBag : public AInventory
{
DECLARE_ACTOR (AArtiPoisonBag, AInventory)
DECLARE_CLASS (AArtiPoisonBag, AInventory)
public:
bool HandlePickup (AInventory *item);
AInventory *CreateCopy (AActor *other);
void BeginPlay ();
};
FState AArtiPoisonBag::States[] =
{
S_NORMAL (PSBG, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (AArtiPoisonBag, Hexen, 8000, 72)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
PROP_Inventory_DefMaxAmount
PROP_Inventory_PickupFlash (1)
PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND)
PROP_Inventory_Icon ("ARTIPSBG")
PROP_Inventory_PickupSound ("misc/p_pkup")
PROP_Inventory_PickupMessage("$TXT_ARTIPOISONBAG")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiPoisonBag)
// Poison Bag 1 (The Cleric's) ----------------------------------------------
class AArtiPoisonBag1 : public AArtiPoisonBag
{
DECLARE_STATELESS_ACTOR (AArtiPoisonBag1, AArtiPoisonBag)
DECLARE_CLASS (AArtiPoisonBag1, AArtiPoisonBag)
public:
bool Use (bool pickup);
};
IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag1, Hexen, -1, 0)
PROP_Inventory_Icon ("ARTIPSB1")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiPoisonBag1)
bool AArtiPoisonBag1::Use (bool pickup)
{
@ -120,21 +67,19 @@ bool AArtiPoisonBag1::Use (bool pickup)
class AArtiPoisonBag2 : public AArtiPoisonBag
{
DECLARE_STATELESS_ACTOR (AArtiPoisonBag2, AArtiPoisonBag)
DECLARE_CLASS (AArtiPoisonBag2, AArtiPoisonBag)
public:
bool Use (bool pickup);
};
IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag2, Hexen, -1, 0)
PROP_Inventory_Icon ("ARTIPSB2")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiPoisonBag2)
bool AArtiPoisonBag2::Use (bool pickup)
{
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
AActor *mo;
mo = Spawn<AFireBomb> (
mo = Spawn ("FireBomb",
Owner->x+16*finecosine[angle],
Owner->y+24*finesine[angle], Owner->z-
Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
@ -150,14 +95,12 @@ bool AArtiPoisonBag2::Use (bool pickup)
class AArtiPoisonBag3 : public AArtiPoisonBag
{
DECLARE_STATELESS_ACTOR (AArtiPoisonBag3, AArtiPoisonBag)
DECLARE_CLASS (AArtiPoisonBag3, AArtiPoisonBag)
public:
bool Use (bool pickup);
};
IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag3, Hexen, -1, 0)
PROP_Inventory_Icon ("ARTIPSB3")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiPoisonBag3)
bool AArtiPoisonBag3::Use (bool pickup)
{
@ -289,49 +232,15 @@ void AArtiPoisonBag::BeginPlay ()
// Poison Cloud -------------------------------------------------------------
FState APoisonCloud::States[] =
class APoisonCloud : public AActor
{
#define S_POISONCLOUD1 0
S_NORMAL (PSBG, 'D', 1, NULL , &States[S_POISONCLOUD1+1]),
S_NORMAL (PSBG, 'D', 1, A_Scream , &States[S_POISONCLOUD1+2]),
S_NORMAL (PSBG, 'D', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+3]),
S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+4]),
S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+5]),
S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+6]),
S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+7]),
S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+8]),
S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+9]),
S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+10]),
S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+11]),
S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+12]),
S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+13]),
S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+14]),
S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+15]),
S_NORMAL (PSBG, 'I', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+16]),
S_NORMAL (PSBG, 'I', 1, A_PoisonBagDamage , &States[S_POISONCLOUD1+17]),
S_NORMAL (PSBG, 'I', 1, A_PoisonBagCheck , &States[S_POISONCLOUD1+3]),
#define S_POISONCLOUD_X1 (S_POISONCLOUD1+18)
S_NORMAL (PSBG, 'H', 7, NULL , &States[S_POISONCLOUD_X1+1]),
S_NORMAL (PSBG, 'G', 7, NULL , &States[S_POISONCLOUD_X1+2]),
S_NORMAL (PSBG, 'F', 6, NULL , &States[S_POISONCLOUD_X1+3]),
S_NORMAL (PSBG, 'D', 6, NULL , NULL)
DECLARE_CLASS (APoisonCloud, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
void BeginPlay ();
};
IMPLEMENT_ACTOR (APoisonCloud, Hexen, -1, 0)
PROP_Radius (20)
PROP_Height (30)
PROP_MassLong (0x7fffffff)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
PROP_Flags2 (MF2_NODMGTHRUST)
PROP_Flags3 (MF3_DONTSPLASH|MF3_FOILINVUL|MF3_CANBLAST|MF3_BLOODLESSIMPACT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (S_POISONCLOUD1)
PROP_DeathSound ("PoisonShroomDeath")
END_DEFAULTS
IMPLEMENT_CLASS (APoisonCloud)
void APoisonCloud::BeginPlay ()
{
@ -340,12 +249,6 @@ void APoisonCloud::BeginPlay ()
special2 = 0;
}
void APoisonCloud::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
{
damage = 4;
distance = 40;
}
int APoisonCloud::DoSpecialDamage (AActor *victim, int damage)
{
if (victim->player)
@ -414,7 +317,7 @@ void A_PoisonBagCheck (AActor *actor)
{
if (--actor->special1 <= 0)
{
actor->SetState (&APoisonCloud::States[S_POISONCLOUD_X1]);
actor->SetState (actor->FindState ("Death"));
}
else
{
@ -432,7 +335,7 @@ void A_PoisonBagDamage (AActor *actor)
{
int bobIndex;
A_Explode (actor);
P_RadiusAttack (actor, actor->target, 4, 40, actor->DamageType, true);
bobIndex = actor->special2;
actor->z += FloatBobOffsets[bobIndex]>>4;
actor->special2 = (bobIndex+1)&63;

View file

@ -3,22 +3,6 @@
#include "d_player.h"
class ALightning : public AActor
{
DECLARE_CLASS (ALightning, AActor)
public:
int SpecialMissileHit (AActor *victim);
};
class APoisonCloud : public AActor
{
DECLARE_ACTOR (APoisonCloud, AActor)
public:
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
int DoSpecialDamage (AActor *target, int damage);
void BeginPlay ();
};
class AHeresiarch : public AActor
{
DECLARE_ACTOR (AHeresiarch, AActor)
@ -59,12 +43,4 @@ public:
bool TryPickup (AActor *toucher);
};
class ASwitchableDecoration : public AActor
{
DECLARE_STATELESS_ACTOR (ASwitchableDecoration, AActor)
public:
void Activate (AActor *activator);
void Deactivate (AActor *activator);
};
#endif //__A_HEXENGLOBAL_H__

View file

@ -22,33 +22,6 @@ static FRandom pr_leafcheck ("LeafCheck");
static FRandom pr_shroom ("PoisonShroom");
static FRandom pr_soaexplode ("SoAExplode");
// SwitchableDecoration: Activate and Deactivate change state ---------------
IMPLEMENT_ABSTRACT_ACTOR (ASwitchableDecoration)
void ASwitchableDecoration::Activate (AActor *activator)
{
SetState (FindState(NAME_Active));
}
void ASwitchableDecoration::Deactivate (AActor *activator)
{
SetState (FindState(NAME_Inactive));
}
// SwitchingDecoration: Only Activate changes state -------------------------
class ASwitchingDecoration : public ASwitchableDecoration
{
DECLARE_STATELESS_ACTOR (ASwitchingDecoration, ASwitchableDecoration)
public:
void Deactivate (AActor *activator) {}
};
IMPLEMENT_ABSTRACT_ACTOR (ASwitchingDecoration)
// Pottery1 ------------------------------------------------------------------
void A_PotteryExplode (AActor *);
@ -57,31 +30,12 @@ void A_PotteryCheck (AActor *);
class APottery1 : public AActor
{
DECLARE_ACTOR (APottery1, AActor)
DECLARE_CLASS (APottery1, AActor)
public:
void HitFloor ();
};
FState APottery1::States[] =
{
#define S_ZPOTTERY 0
S_NORMAL (POT1, 'A', -1, NULL , NULL),
#define S_ZPOTTERY_EXPLODE (S_ZPOTTERY+1)
S_NORMAL (POT1, 'A', 0, A_PotteryExplode , NULL)
};
IMPLEMENT_ACTOR (APottery1, Hexen, 104, 0)
PROP_SpawnHealth (15)
PROP_RadiusFixed (10)
PROP_HeightFixed (32)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF)
PROP_Flags2 (MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_ZPOTTERY)
PROP_DeathState (S_ZPOTTERY_EXPLODE)
END_DEFAULTS
IMPLEMENT_CLASS (APottery1)
void APottery1::HitFloor ()
{
@ -89,91 +43,6 @@ void APottery1::HitFloor ()
P_DamageMobj (this, NULL, NULL, 25, NAME_None);
}
// Pottery2 -----------------------------------------------------------------
class APottery2 : public APottery1
{
DECLARE_ACTOR (APottery2, APottery1)
};
FState APottery2::States[] =
{
S_NORMAL (POT2, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (APottery2, Hexen, 105, 0)
PROP_HeightFixed (25)
PROP_SpawnState (0)
END_DEFAULTS
// Pottery3 -----------------------------------------------------------------
class APottery3 : public APottery1
{
DECLARE_ACTOR (APottery3, APottery1)
};
FState APottery3::States[] =
{
S_NORMAL (POT3, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (APottery3, Hexen, 106, 0)
PROP_HeightFixed (25)
PROP_SpawnState (0)
END_DEFAULTS
// Pottery Bit --------------------------------------------------------------
class APotteryBit : public AActor
{
DECLARE_ACTOR (APotteryBit, AActor)
};
FState APotteryBit::States[] =
{
#define S_POTTERYBIT 0
S_NORMAL (PBIT, 'A', -1, NULL , NULL),
S_NORMAL (PBIT, 'B', -1, NULL , NULL),
S_NORMAL (PBIT, 'C', -1, NULL , NULL),
S_NORMAL (PBIT, 'D', -1, NULL , NULL),
S_NORMAL (PBIT, 'E', -1, NULL , NULL),
#define S_POTTERYBIT_EX0 (S_POTTERYBIT+5)
S_NORMAL (PBIT, 'F', 0, A_PotteryChooseBit , NULL),
#define S_POTTERYBIT_EX1 (S_POTTERYBIT_EX0+1)
S_NORMAL (PBIT, 'F', 140, NULL , &States[S_POTTERYBIT_EX0+1]),
S_NORMAL (PBIT, 'F', 1, A_PotteryCheck , NULL),
#define S_POTTERYBIT_EX2 (S_POTTERYBIT_EX1+2)
S_NORMAL (PBIT, 'G', 140, NULL , &States[S_POTTERYBIT_EX1+1]),
S_NORMAL (PBIT, 'G', 1, A_PotteryCheck , NULL),
#define S_POTTERYBIT_EX3 (S_POTTERYBIT_EX2+2)
S_NORMAL (PBIT, 'H', 140, NULL , &States[S_POTTERYBIT_EX2+1]),
S_NORMAL (PBIT, 'H', 1, A_PotteryCheck , NULL),
#define S_POTTERYBIT_EX4 (S_POTTERYBIT_EX3+2)
S_NORMAL (PBIT, 'I', 140, NULL , &States[S_POTTERYBIT_EX3+1]),
S_NORMAL (PBIT, 'I', 1, A_PotteryCheck , NULL),
#define S_POTTERYBIT_EX5 (S_POTTERYBIT_EX4+2)
S_NORMAL (PBIT, 'J', 140, NULL , &States[S_POTTERYBIT_EX4+1]),
S_NORMAL (PBIT, 'J', 1, A_PotteryCheck , NULL)
};
IMPLEMENT_ACTOR (APotteryBit, Hexen, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (5)
PROP_Flags (MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_POTTERYBIT)
PROP_DeathState (S_POTTERYBIT_EX0)
END_DEFAULTS
//============================================================================
//
// A_PotteryExplode
@ -187,7 +56,7 @@ void A_PotteryExplode (AActor *actor)
for(i = (pr_pottery()&3)+3; i; i--)
{
mo = Spawn<APotteryBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo = Spawn ("PotteryBit", actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + (pr_pottery()%5));
if (mo)
{
@ -245,82 +114,25 @@ void A_PotteryCheck (AActor *actor)
}
}
// Blood pool ---------------------------------------------------------------
class ABloodPool : public AActor
{
DECLARE_ACTOR (ABloodPool, AActor)
};
FState ABloodPool::States[] =
{
S_NORMAL (BDPL, 'A', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (ABloodPool, Hexen, 111, 0)
PROP_SpawnState (0)
END_DEFAULTS
// Lynched corpse (no heart) ------------------------------------------------
void A_CorpseBloodDrip (AActor *);
class AZCorpseLynchedNoHeart : public AActor
{
DECLARE_ACTOR (AZCorpseLynchedNoHeart, AActor)
DECLARE_CLASS (AZCorpseLynchedNoHeart, AActor)
public:
void PostBeginPlay ();
};
FState AZCorpseLynchedNoHeart::States[] =
{
S_NORMAL (CPS5, 'A', 140, A_CorpseBloodDrip , &States[0])
};
IMPLEMENT_ACTOR (AZCorpseLynchedNoHeart, Hexen, 109, 0)
PROP_RadiusFixed (10)
PROP_HeightFixed (100)
PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (AZCorpseLynchedNoHeart)
void AZCorpseLynchedNoHeart::PostBeginPlay ()
{
Super::PostBeginPlay ();
Spawn<ABloodPool> (x, y, ONFLOORZ, ALLOW_REPLACE);
Spawn ("BloodPool", x, y, ONFLOORZ, ALLOW_REPLACE);
}
// CorpseBloodDrip ----------------------------------------------------------
class ACorpseBloodDrip : public AActor
{
DECLARE_ACTOR (ACorpseBloodDrip, AActor)
};
FState ACorpseBloodDrip::States[] =
{
#define S_CORPSEBLOODDRIP 0
S_NORMAL (BDRP, 'A', -1, NULL , NULL),
#define S_CORPSEBLOODDRIP_X (S_CORPSEBLOODDRIP+1)
S_NORMAL (BDSH, 'A', 3, NULL , &States[S_CORPSEBLOODDRIP_X+1]),
S_NORMAL (BDSH, 'B', 3, NULL , &States[S_CORPSEBLOODDRIP_X+2]),
S_NORMAL (BDSH, 'C', 2, NULL , &States[S_CORPSEBLOODDRIP_X+3]),
S_NORMAL (BDSH, 'D', 2, NULL , NULL)
};
IMPLEMENT_ACTOR (ACorpseBloodDrip, Hexen, -1, 0)
PROP_RadiusFixed (1)
PROP_HeightFixed (4)
PROP_Gravity (FRACUNIT/8)
PROP_Flags (MF_MISSILE)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_CORPSEBLOODDRIP)
PROP_DeathState (S_CORPSEBLOODDRIP_X)
END_DEFAULTS
//============================================================================
//
// A_CorpseBloodDrip
@ -331,62 +143,10 @@ void A_CorpseBloodDrip (AActor *actor)
{
if (pr_drip() <= 128)
{
Spawn<ACorpseBloodDrip> (actor->x, actor->y, actor->z + actor->height/2, ALLOW_REPLACE);
Spawn ("CorpseBloodDrip", actor->x, actor->y, actor->z + actor->height/2, ALLOW_REPLACE);
}
}
// Corpse bit ---------------------------------------------------------------
class ACorpseBit : public AActor
{
DECLARE_ACTOR (ACorpseBit, AActor)
};
FState ACorpseBit::States[] =
{
S_NORMAL (CPB1, 'A', -1, NULL , NULL),
S_NORMAL (CPB2, 'A', -1, NULL , NULL),
S_NORMAL (CPB3, 'A', -1, NULL , NULL),
S_NORMAL (CPB4, 'A', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (ACorpseBit, Hexen, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (5)
PROP_Flags (MF_NOBLOCKMAP)
PROP_Flags2 (MF2_TELESTOMP)
PROP_SpawnState (0)
END_DEFAULTS
// Corpse (sitting, splatterable) -------------------------------------------
void A_CorpseExplode (AActor *);
class AZCorpseSitting : public AActor
{
DECLARE_ACTOR (AZCorpseSitting, AActor)
};
FState AZCorpseSitting::States[] =
{
S_NORMAL (CPS6, 'A', -1, NULL , NULL),
S_NORMAL (CPS6, 'A', 1, A_CorpseExplode , NULL)
};
IMPLEMENT_ACTOR (AZCorpseSitting, Hexen, 110, 0)
PROP_SpawnHealth (30)
PROP_RadiusFixed (15)
PROP_HeightFixed (35)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (0)
PROP_DeathState (1)
PROP_DeathSound ("FireDemonDeath")
END_DEFAULTS
//============================================================================
//
// A_CorpseExplode
@ -400,7 +160,7 @@ void A_CorpseExplode (AActor *actor)
for (i = (pr_foo()&3)+3; i; i--)
{
mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo = Spawn ("CorpseBit", actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + (pr_foo()%3));
if (mo)
{
@ -410,7 +170,7 @@ void A_CorpseExplode (AActor *actor)
}
}
// Spawn a skull
mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo = Spawn ("CorpseBit", actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + 3);
if (mo)
{
@ -422,106 +182,6 @@ void A_CorpseExplode (AActor *actor)
actor->Destroy ();
}
// Leaf Spawner -------------------------------------------------------------
void A_LeafSpawn (AActor *);
void A_LeafThrust (AActor *);
void A_LeafCheck (AActor *);
class ALeafSpawner : public AActor
{
DECLARE_ACTOR (ALeafSpawner, AActor)
};
FState ALeafSpawner::States[] =
{
S_NORMAL (TNT1, 'A', 20, A_LeafSpawn , &States[0])
};
IMPLEMENT_ACTOR (ALeafSpawner, Hexen, 113, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
PROP_RenderFlags (RF_INVISIBLE)
PROP_SpawnState (0)
END_DEFAULTS
// Leaves -------------------------------------------------------------------
class ALeaf1 : public AActor
{
DECLARE_ACTOR (ALeaf1, AActor)
};
FState ALeaf1::States[] =
{
#define S_LEAF1 0
S_NORMAL (LEF1, 'A', 4, NULL , &States[S_LEAF1+1]),
S_NORMAL (LEF1, 'B', 4, NULL , &States[S_LEAF1+2]),
S_NORMAL (LEF1, 'C', 4, NULL , &States[S_LEAF1+3]),
S_NORMAL (LEF1, 'D', 4, A_LeafThrust , &States[S_LEAF1+4]),
S_NORMAL (LEF1, 'E', 4, NULL , &States[S_LEAF1+5]),
S_NORMAL (LEF1, 'F', 4, NULL , &States[S_LEAF1+6]),
S_NORMAL (LEF1, 'G', 4, NULL , &States[S_LEAF1+7]),
S_NORMAL (LEF1, 'H', 4, A_LeafThrust , &States[S_LEAF1+8]),
S_NORMAL (LEF1, 'I', 4, NULL , &States[S_LEAF1+9]),
S_NORMAL (LEF1, 'A', 4, NULL , &States[S_LEAF1+10]),
S_NORMAL (LEF1, 'B', 4, NULL , &States[S_LEAF1+11]),
S_NORMAL (LEF1, 'C', 4, A_LeafThrust , &States[S_LEAF1+12]),
S_NORMAL (LEF1, 'D', 4, NULL , &States[S_LEAF1+13]),
S_NORMAL (LEF1, 'E', 4, NULL , &States[S_LEAF1+14]),
S_NORMAL (LEF1, 'F', 4, NULL , &States[S_LEAF1+15]),
S_NORMAL (LEF1, 'G', 4, A_LeafThrust , &States[S_LEAF1+16]),
S_NORMAL (LEF1, 'H', 4, NULL , &States[S_LEAF1+17]),
S_NORMAL (LEF1, 'I', 4, NULL , NULL),
#define S_LEAF_X (S_LEAF1+18)
S_NORMAL (LEF3, 'D', 10, A_LeafCheck , &States[S_LEAF_X+0])
};
IMPLEMENT_ACTOR (ALeaf1, Hexen, -1, 0)
PROP_RadiusFixed (2)
PROP_HeightFixed (4)
PROP_Gravity (FRACUNIT/8)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_Flags3 (MF3_DONTSPLASH)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_LEAF1)
PROP_DeathState (S_LEAF_X)
END_DEFAULTS
class ALeaf2 : public ALeaf1
{
DECLARE_ACTOR (ALeaf2, ALeaf1)
};
FState ALeaf2::States[] =
{
#define S_LEAF2 0
S_NORMAL (LEF2, 'A', 4, NULL , &States[S_LEAF2+1]),
S_NORMAL (LEF2, 'B', 4, NULL , &States[S_LEAF2+2]),
S_NORMAL (LEF2, 'C', 4, NULL , &States[S_LEAF2+3]),
S_NORMAL (LEF2, 'D', 4, A_LeafThrust , &States[S_LEAF2+4]),
S_NORMAL (LEF2, 'E', 4, NULL , &States[S_LEAF2+5]),
S_NORMAL (LEF2, 'F', 4, NULL , &States[S_LEAF2+6]),
S_NORMAL (LEF2, 'G', 4, NULL , &States[S_LEAF2+7]),
S_NORMAL (LEF2, 'H', 4, A_LeafThrust , &States[S_LEAF2+8]),
S_NORMAL (LEF2, 'I', 4, NULL , &States[S_LEAF2+9]),
S_NORMAL (LEF2, 'A', 4, NULL , &States[S_LEAF2+10]),
S_NORMAL (LEF2, 'B', 4, NULL , &States[S_LEAF2+11]),
S_NORMAL (LEF2, 'C', 4, A_LeafThrust , &States[S_LEAF2+12]),
S_NORMAL (LEF2, 'D', 4, NULL , &States[S_LEAF2+13]),
S_NORMAL (LEF2, 'E', 4, NULL , &States[S_LEAF2+14]),
S_NORMAL (LEF2, 'F', 4, NULL , &States[S_LEAF2+15]),
S_NORMAL (LEF2, 'G', 4, A_LeafThrust , &States[S_LEAF2+16]),
S_NORMAL (LEF2, 'H', 4, NULL , &States[S_LEAF2+17]),
S_NORMAL (LEF2, 'I', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ALeaf2, Hexen, -1, 0)
PROP_SpawnState (S_LEAF2)
END_DEFAULTS
//============================================================================
//
// A_LeafSpawn
@ -535,7 +195,7 @@ void A_LeafSpawn (AActor *actor)
for (i = (pr_leaf()&3)+1; i; i--)
{
mo = Spawn (pr_leaf()&1 ? RUNTIME_CLASS(ALeaf1) : RUNTIME_CLASS(ALeaf2),
mo = Spawn (pr_leaf()&1 ? PClass::FindClass ("Leaf1") : PClass::FindClass ("Leaf2"),
actor->x + (pr_leaf.Random2()<<14),
actor->y + (pr_leaf.Random2()<<14),
actor->z + (pr_leaf()<<14), ALLOW_REPLACE);
@ -591,53 +251,6 @@ void A_LeafCheck (AActor *actor)
actor->flags |= MF_MISSILE;
}
// Torch base class ---------------------------------------------------------
// Poison Shroom ------------------------------------------------------------
void A_PoisonShroom (AActor *);
void A_PoisonBagInit (AActor *);
class AZPoisonShroom : public AActor
{
DECLARE_ACTOR (AZPoisonShroom, AActor)
};
FState AZPoisonShroom::States[] =
{
#define S_ZPOISONSHROOM_P 0
S_NORMAL (SHRM, 'A', 6, NULL , &States[S_ZPOISONSHROOM_P+1]),
S_NORMAL (SHRM, 'B', 8, A_Pain , &States[S_ZPOISONSHROOM_P+2]),//<-- Intentional state
#define S_ZPOISONSHROOM (S_ZPOISONSHROOM_P+2)
S_NORMAL (SHRM, 'A', 5, A_PoisonShroom , &States[S_ZPOISONSHROOM_P+1]),
#define S_ZPOISONSHROOM_X (S_ZPOISONSHROOM+1)
S_NORMAL (SHRM, 'C', 5, NULL , &States[S_ZPOISONSHROOM_X+1]),
S_NORMAL (SHRM, 'D', 5, NULL , &States[S_ZPOISONSHROOM_X+2]),
S_NORMAL (SHRM, 'E', 5, A_PoisonBagInit , &States[S_ZPOISONSHROOM_X+3]),
S_NORMAL (SHRM, 'F', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (AZPoisonShroom, Hexen, 8104, 0)
PROP_RadiusFixed (6)
PROP_HeightFixed (20)
PROP_PainChance (255)
PROP_SpawnHealth (30)
PROP_MassLong (0x7fffffff)
PROP_Flags (MF_SHOOTABLE|MF_SOLID|MF_NOBLOOD)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_ZPOISONSHROOM)
PROP_PainState (S_ZPOISONSHROOM_P)
PROP_DeathState (S_ZPOISONSHROOM_X)
PROP_PainSound ("PoisonShroomPain")
PROP_DeathSound ("PoisonShroomDeath")
END_DEFAULTS
//===========================================================================
//
// A_PoisonShroom
@ -649,63 +262,6 @@ void A_PoisonShroom (AActor *actor)
actor->tics = 128+(pr_shroom()<<1);
}
// Suit of armor ------------------------------------------------------------
void A_SoAExplode (AActor *);
class AZSuitOfArmor : public AActor
{
DECLARE_ACTOR (AZSuitOfArmor, AActor)
};
FState AZSuitOfArmor::States[] =
{
S_NORMAL (ZSUI, 'A', -1, NULL , NULL),
S_NORMAL (ZSUI, 'A', 1, A_SoAExplode , NULL)
};
IMPLEMENT_ACTOR (AZSuitOfArmor, Hexen, 8064, 0)
PROP_SpawnHealth (60)
PROP_RadiusFixed (16)
PROP_HeightFixed (72)
PROP_MassLong (0x7fffffff)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (0)
PROP_DeathState (1)
PROP_DeathSound ("SuitofArmorBreak")
END_DEFAULTS
// Armor chunk --------------------------------------------------------------
class AZArmorChunk : public AActor
{
DECLARE_ACTOR (AZArmorChunk, AActor)
};
FState AZArmorChunk::States[] =
{
S_NORMAL (ZSUI, 'B', -1, NULL , NULL),
S_NORMAL (ZSUI, 'C', -1, NULL , NULL),
S_NORMAL (ZSUI, 'D', -1, NULL , NULL),
S_NORMAL (ZSUI, 'E', -1, NULL , NULL),
S_NORMAL (ZSUI, 'F', -1, NULL , NULL),
S_NORMAL (ZSUI, 'G', -1, NULL , NULL),
S_NORMAL (ZSUI, 'H', -1, NULL , NULL),
S_NORMAL (ZSUI, 'I', -1, NULL , NULL),
S_NORMAL (ZSUI, 'J', -1, NULL , NULL),
S_NORMAL (ZSUI, 'K', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (AZArmorChunk, Hexen, -1, 0)
PROP_RadiusFixed (4)
PROP_HeightFixed (8)
PROP_SpawnState (0)
END_DEFAULTS
//===========================================================================
//
// A_SoAExplode - Suit of Armor Explode
@ -719,7 +275,7 @@ void A_SoAExplode (AActor *actor)
for (i = 0; i < 10; i++)
{
mo = Spawn<AZArmorChunk> (actor->x+((pr_soaexplode()-128)<<12),
mo = Spawn ("ZArmorChunk", actor->x+((pr_soaexplode()-128)<<12),
actor->y+((pr_soaexplode()-128)<<12),
actor->z+(pr_soaexplode()*actor->height/256), ALLOW_REPLACE);
mo->SetState (mo->SpawnState + i);
@ -750,79 +306,12 @@ void A_BellReset2 (AActor *);
class AZBell : public AActor
{
DECLARE_ACTOR (AZBell, AActor)
DECLARE_CLASS (AZBell, AActor)
public:
void Activate (AActor *activator);
};
FState AZBell::States[] =
{
#define S_ZBELL 0
S_NORMAL (BBLL, 'F', -1, NULL , NULL),
#define S_ZBELL_X (S_ZBELL+1)
S_NORMAL (BBLL, 'A', 4, A_BellReset1 , &States[S_ZBELL_X+1]),
S_NORMAL (BBLL, 'B', 4, NULL , &States[S_ZBELL_X+2]),
S_NORMAL (BBLL, 'C', 4, NULL , &States[S_ZBELL_X+3]),
S_NORMAL (BBLL, 'D', 5, A_Scream , &States[S_ZBELL_X+4]),
S_NORMAL (BBLL, 'C', 4, NULL , &States[S_ZBELL_X+5]),
S_NORMAL (BBLL, 'B', 4, NULL , &States[S_ZBELL_X+6]),
S_NORMAL (BBLL, 'A', 3, NULL , &States[S_ZBELL_X+7]),
S_NORMAL (BBLL, 'E', 4, NULL , &States[S_ZBELL_X+8]),
S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+9]),
S_NORMAL (BBLL, 'G', 6, A_Scream , &States[S_ZBELL_X+10]),
S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+11]),
S_NORMAL (BBLL, 'E', 4, NULL , &States[S_ZBELL_X+12]),
S_NORMAL (BBLL, 'A', 4, NULL , &States[S_ZBELL_X+13]),
S_NORMAL (BBLL, 'B', 5, NULL , &States[S_ZBELL_X+14]),
S_NORMAL (BBLL, 'C', 5, NULL , &States[S_ZBELL_X+15]),
S_NORMAL (BBLL, 'D', 6, A_Scream , &States[S_ZBELL_X+16]),
S_NORMAL (BBLL, 'C', 5, NULL , &States[S_ZBELL_X+17]),
S_NORMAL (BBLL, 'B', 5, NULL , &States[S_ZBELL_X+18]),
S_NORMAL (BBLL, 'A', 4, NULL , &States[S_ZBELL_X+19]),
S_NORMAL (BBLL, 'E', 5, NULL , &States[S_ZBELL_X+20]),
S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+21]),
S_NORMAL (BBLL, 'G', 7, A_Scream , &States[S_ZBELL_X+22]),
S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+23]),
S_NORMAL (BBLL, 'E', 5, NULL , &States[S_ZBELL_X+24]),
S_NORMAL (BBLL, 'A', 5, NULL , &States[S_ZBELL_X+25]),
S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+26]),
S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+27]),
S_NORMAL (BBLL, 'D', 7, A_Scream , &States[S_ZBELL_X+28]),
S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+29]),
S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+30]),
S_NORMAL (BBLL, 'A', 5, NULL , &States[S_ZBELL_X+31]),
S_NORMAL (BBLL, 'E', 6, NULL , &States[S_ZBELL_X+32]),
S_NORMAL (BBLL, 'F', 6, NULL , &States[S_ZBELL_X+33]),
S_NORMAL (BBLL, 'G', 7, A_Scream , &States[S_ZBELL_X+34]),
S_NORMAL (BBLL, 'F', 6, NULL , &States[S_ZBELL_X+35]),
S_NORMAL (BBLL, 'E', 6, NULL , &States[S_ZBELL_X+36]),
S_NORMAL (BBLL, 'A', 6, NULL , &States[S_ZBELL_X+37]),
S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+38]),
S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+39]),
S_NORMAL (BBLL, 'B', 7, NULL , &States[S_ZBELL_X+40]),
S_NORMAL (BBLL, 'A', 8, NULL , &States[S_ZBELL_X+41]),
S_NORMAL (BBLL, 'E', 12, NULL , &States[S_ZBELL_X+42]),
S_NORMAL (BBLL, 'A', 10, NULL , &States[S_ZBELL_X+43]),
S_NORMAL (BBLL, 'B', 12, NULL , &States[S_ZBELL_X+44]),
S_NORMAL (BBLL, 'A', 12, NULL , &States[S_ZBELL_X+45]),
S_NORMAL (BBLL, 'E', 14, NULL , &States[S_ZBELL_X+46]),
S_NORMAL (BBLL, 'A', 1, A_BellReset2 , &States[S_ZBELL])
};
IMPLEMENT_ACTOR (AZBell, Hexen, 8065, 0)
PROP_SpawnHealth (5)
PROP_RadiusFixed (56)
PROP_HeightFixed (120)
PROP_MassLong (0x7fffffff)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_NOGRAVITY|MF_SPAWNCEILING)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_ZBELL)
PROP_DeathState (S_ZBELL_X)
PROP_DeathSound ("BellRing")
END_DEFAULTS
IMPLEMENT_CLASS (AZBell)
void AZBell::Activate (AActor *activator)
{

View file

@ -78,162 +78,6 @@ AActor *P_SpawnKoraxMissile (fixed_t x, fixed_t y, fixed_t z,
extern void SpawnSpiritTail (AActor *spirit);
// Korax --------------------------------------------------------------------
class AKorax : public AActor
{
DECLARE_ACTOR (AKorax, AActor)
};
FState AKorax::States[] =
{
#define S_KORAX_LOOK1 0
S_NORMAL (KORX, 'A', 5, A_Look , &States[S_KORAX_LOOK1]),
#define S_KORAX_CHASE2 (S_KORAX_LOOK1+1)
S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+1]),
S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+2]),
S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+3]),
S_NORMAL (KORX, 'B', 3, A_KoraxStep , &States[S_KORAX_CHASE2+4]),
S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+5]),
S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+6]),
S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+7]),
S_NORMAL (KORX, 'C', 3, A_KoraxStep2 , &States[S_KORAX_CHASE2+8]),
S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+9]),
S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+10]),
S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+11]),
S_NORMAL (KORX, 'D', 3, A_KoraxStep , &States[S_KORAX_CHASE2+12]),
S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+13]),
S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+14]),
S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+15]),
S_NORMAL (KORX, 'A', 3, A_KoraxStep2 , &States[S_KORAX_CHASE2]),
#define S_KORAX_PAIN1 (S_KORAX_CHASE2+16)
S_NORMAL (KORX, 'H', 5, A_Pain , &States[S_KORAX_PAIN1+1]),
S_NORMAL (KORX, 'H', 5, NULL , &States[S_KORAX_CHASE2]),
#define S_KORAX_ATTACK1 (S_KORAX_PAIN1+2)
S_BRIGHT (KORX, 'E', 2, A_FaceTarget , &States[S_KORAX_ATTACK1+1]),
S_BRIGHT (KORX, 'E', 5, A_KoraxDecide , &States[S_KORAX_ATTACK1+1]),
#define S_KORAX_DEATH1 (S_KORAX_ATTACK1+2)
S_NORMAL (KORX, 'I', 5, NULL , &States[S_KORAX_DEATH1+1]),
S_NORMAL (KORX, 'J', 5, A_FaceTarget , &States[S_KORAX_DEATH1+2]),
S_NORMAL (KORX, 'K', 5, A_Scream , &States[S_KORAX_DEATH1+3]),
S_NORMAL (KORX, 'L', 5, NULL , &States[S_KORAX_DEATH1+4]),
S_NORMAL (KORX, 'M', 5, NULL , &States[S_KORAX_DEATH1+5]),
S_NORMAL (KORX, 'N', 5, NULL , &States[S_KORAX_DEATH1+6]),
S_NORMAL (KORX, 'O', 5, NULL , &States[S_KORAX_DEATH1+7]),
S_NORMAL (KORX, 'P', 5, NULL , &States[S_KORAX_DEATH1+8]),
S_NORMAL (KORX, 'Q', 10, NULL , &States[S_KORAX_DEATH1+9]),
S_NORMAL (KORX, 'R', 5, A_KoraxBonePop , &States[S_KORAX_DEATH1+10]),
S_NORMAL (KORX, 'S', 5, A_NoBlocking , &States[S_KORAX_DEATH1+11]),
S_NORMAL (KORX, 'T', 5, NULL , &States[S_KORAX_DEATH1+12]),
S_NORMAL (KORX, 'U', 5, NULL , &States[S_KORAX_DEATH1+13]),
S_NORMAL (KORX, 'V', -1, NULL , NULL),
#define S_KORAX_MISSILE1 (S_KORAX_DEATH1+14)
S_BRIGHT (KORX, 'E', 4, A_FaceTarget , &States[S_KORAX_MISSILE1+1]),
S_BRIGHT (KORX, 'F', 8, A_KoraxMissile , &States[S_KORAX_MISSILE1+2]),
S_BRIGHT (KORX, 'E', 8, NULL , &States[S_KORAX_CHASE2]),
#define S_KORAX_COMMAND1 (S_KORAX_MISSILE1+3)
S_BRIGHT (KORX, 'E', 5, A_FaceTarget , &States[S_KORAX_COMMAND1+1]),
S_BRIGHT (KORX, 'W', 10, A_FaceTarget , &States[S_KORAX_COMMAND1+2]),
S_BRIGHT (KORX, 'G', 15, A_KoraxCommand , &States[S_KORAX_COMMAND1+3]),
S_BRIGHT (KORX, 'W', 10, NULL , &States[S_KORAX_COMMAND1+4]),
S_BRIGHT (KORX, 'E', 5, NULL , &States[S_KORAX_CHASE2]),
};
IMPLEMENT_ACTOR (AKorax, Hexen, 10200, 0)
PROP_SpawnHealth (5000)
PROP_PainChance (20)
PROP_SpeedFixed (10)
PROP_RadiusFixed (65)
PROP_HeightFixed (115)
PROP_Mass (2000)
PROP_Damage (15)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
PROP_Flags2 (MF2_FLOORCLIP|MF2_BOSS|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_DONTMORPH|MF3_NOTARGET)
PROP_Flags4 (MF4_NOICEDEATH)
PROP_SpawnState (S_KORAX_LOOK1)
PROP_SeeState (S_KORAX_CHASE2)
PROP_PainState (S_KORAX_PAIN1)
PROP_MissileState (S_KORAX_ATTACK1)
PROP_DeathState (S_KORAX_DEATH1)
PROP_SeeSound ("KoraxSight")
PROP_AttackSound ("KoraxAttack")
PROP_PainSound ("KoraxPain")
PROP_DeathSound ("KoraxDeath")
PROP_ActiveSound ("KoraxActive")
PROP_Obituary ("$OB_KORAX")
END_DEFAULTS
// Korax Spirit -------------------------------------------------------------
class AKoraxSpirit : public AActor
{
DECLARE_ACTOR (AKoraxSpirit, AActor)
};
FState AKoraxSpirit::States[] =
{
S_NORMAL (SPIR, 'A', 5, A_KSpiritRoam , &States[1]),
S_NORMAL (SPIR, 'B', 5, A_KSpiritRoam , &States[0]),
#define S_KSPIRIT_DEATH (2)
S_NORMAL (SPIR, 'D', 5, NULL , &States[S_KSPIRIT_DEATH+1]),
S_NORMAL (SPIR, 'E', 5, NULL , &States[S_KSPIRIT_DEATH+2]),
S_NORMAL (SPIR, 'F', 5, NULL , &States[S_KSPIRIT_DEATH+3]),
S_NORMAL (SPIR, 'G', 5, NULL , &States[S_KSPIRIT_DEATH+4]),
S_NORMAL (SPIR, 'H', 5, NULL , &States[S_KSPIRIT_DEATH+5]),
S_NORMAL (SPIR, 'I', 5, NULL , NULL),
};
IMPLEMENT_ACTOR (AKoraxSpirit, Hexen, -1, 0)
PROP_SpeedFixed (8)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_ALTSHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Korax Bolt ---------------------------------------------------------------
class AKoraxBolt : public AActor
{
DECLARE_ACTOR (AKoraxBolt, AActor)
};
FState AKoraxBolt::States[] =
{
#define S_KBOLT1 0
S_BRIGHT (MLFX, 'I', 2, NULL , &States[S_KBOLT1+1]),
S_BRIGHT (MLFX, 'J', 2, A_KBoltRaise , &States[S_KBOLT1+2]),
S_BRIGHT (MLFX, 'I', 2, A_KBolt , &States[S_KBOLT1+3]),
S_BRIGHT (MLFX, 'J', 2, A_KBolt , &States[S_KBOLT1+4]),
S_BRIGHT (MLFX, 'K', 2, A_KBolt , &States[S_KBOLT1+5]),
S_BRIGHT (MLFX, 'L', 2, A_KBolt , &States[S_KBOLT1+6]),
S_BRIGHT (MLFX, 'M', 2, A_KBolt , &States[S_KBOLT1+2]),
};
IMPLEMENT_ACTOR (AKoraxBolt, Hexen, -1, 0)
PROP_RadiusFixed (15)
PROP_HeightFixed (35)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_KBOLT1)
END_DEFAULTS
//============================================================================
//============================================================================
//
// A_KoraxChase
@ -295,29 +139,6 @@ void A_KoraxChase (AActor *actor)
}
}
//============================================================================
//
// A_KoraxStep
//
//============================================================================
void A_KoraxStep (AActor *actor)
{
A_Chase (actor);
}
//============================================================================
//
// A_KoraxStep2
//
//============================================================================
void A_KoraxStep2 (AActor *actor)
{
S_Sound (actor, CHAN_BODY, "KoraxStep", 1, ATTN_NONE);
A_Chase (actor);
}
//============================================================================
//
// A_KoraxBonePop
@ -332,7 +153,7 @@ void A_KoraxBonePop (AActor *actor)
// Spawn 6 spirits equalangularly
for (i = 0; i < 6; ++i)
{
mo = P_SpawnMissileAngle (actor, RUNTIME_CLASS(AKoraxSpirit), ANGLE_60*i, 5*FRACUNIT);
mo = P_SpawnMissileAngle (actor, PClass::FindClass("KoraxSpirit"), ANGLE_60*i, 5*FRACUNIT);
if (mo) KSpiritInit (mo, actor);
}
@ -368,11 +189,11 @@ void A_KoraxDecide (AActor *actor)
{
if (pr_koraxdecide()<220)
{
actor->SetState (&AKorax::States[S_KORAX_MISSILE1]);
actor->SetState (actor->FindState("Attack"));
}
else
{
actor->SetState (&AKorax::States[S_KORAX_COMMAND1]);
actor->SetState (actor->FindState("Command"));
}
}
@ -435,7 +256,7 @@ void A_KoraxCommand (AActor *actor)
x = actor->x + KORAX_COMMAND_OFFSET * finecosine[ang];
y = actor->y + KORAX_COMMAND_OFFSET * finesine[ang];
z = actor->z + KORAX_COMMAND_HEIGHT*FRACUNIT;
Spawn<AKoraxBolt> (x, y, z, ALLOW_REPLACE);
Spawn("KoraxBolt", x, y, z, ALLOW_REPLACE);
if (actor->health <= (actor->GetDefault()->health >> 1))
{
@ -609,7 +430,7 @@ void A_KSpiritRoam (AActor *actor)
if (actor->health-- <= 0)
{
S_Sound (actor, CHAN_VOICE, "SpiritDie", 1, ATTN_NORM);
actor->SetState (&AKoraxSpirit::States[S_KSPIRIT_DEATH]);
actor->SetState (actor->FindState("Death"));
}
else
{
@ -657,7 +478,7 @@ void A_KBoltRaise (AActor *actor)
if ((z + KORAX_BOLT_HEIGHT) < actor->ceilingz)
{
mo = Spawn<AKoraxBolt> (actor->x, actor->y, z, ALLOW_REPLACE);
mo = Spawn("KoraxBolt", actor->x, actor->y, z, ALLOW_REPLACE);
if (mo)
{
mo->special1 = KORAX_BOLT_LIFETIME;

View file

@ -31,6 +31,13 @@ void A_FreeTargMobj (AActor *);
// Lightning ----------------------------------------------------------------
class ALightning : public AActor
{
DECLARE_CLASS (ALightning, AActor)
public:
int SpecialMissileHit (AActor *victim);
};
IMPLEMENT_CLASS(ALightning)
int ALightning::SpecialMissileHit (AActor *thing)
@ -45,18 +52,7 @@ int ALightning::SpecialMissileHit (AActor *thing)
if ((!thing->player && !(thing->flags2&MF2_BOSS))
|| !(level.time&1))
{
// There needs to be a better way to do this...
static const PClass *centaur=NULL;
if (!centaur) centaur = PClass::FindClass("Centaur");
if (thing->IsKindOf(centaur))
{ // Lightning does more damage to centaurs
P_DamageMobj(thing, this, target, 9, NAME_Electric);
}
else
{
P_DamageMobj(thing, this, target, 3, NAME_Electric);
}
P_DamageMobj(thing, this, target, 3, NAME_Electric);
if (!(S_IsActorPlayingSomething (this, CHAN_WEAPON, -1)))
{
S_Sound (this, CHAN_WEAPON, "MageLightningZap", 1, ATTN_NORM);

View file

@ -18,25 +18,7 @@ public:
bool Use (bool pickup);
};
FState AArtiDarkServant::States[] =
{
#define S_ARTI_SUMMON 0
S_NORMAL (SUMN, 'A', 350, NULL , &States[S_ARTI_SUMMON]),
};
IMPLEMENT_ACTOR (AArtiDarkServant, Hexen, 86, 16)
PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (S_ARTI_SUMMON)
PROP_Inventory_RespawnTics (30+4200)
PROP_Inventory_DefMaxAmount
PROP_Inventory_PickupFlash (1)
PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND)
PROP_Inventory_Icon ("ARTISUMN")
PROP_Inventory_PickupSound ("misc/p_pkup")
PROP_Inventory_PickupMessage("$TXT_ARTISUMMON")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiDarkServant)
//============================================================================
//

View file

@ -16,6 +16,40 @@ static FRandom pr_freezedeath ("FreezeDeath");
static FRandom pr_icesettics ("IceSetTics");
static FRandom pr_freeze ("FreezeDeathChunks");
// SwitchableDecoration: Activate and Deactivate change state ---------------
class ASwitchableDecoration : public AActor
{
DECLARE_STATELESS_ACTOR (ASwitchableDecoration, AActor)
public:
void Activate (AActor *activator);
void Deactivate (AActor *activator);
};
IMPLEMENT_ABSTRACT_ACTOR (ASwitchableDecoration)
void ASwitchableDecoration::Activate (AActor *activator)
{
SetState (FindState(NAME_Active));
}
void ASwitchableDecoration::Deactivate (AActor *activator)
{
SetState (FindState(NAME_Inactive));
}
// SwitchingDecoration: Only Activate changes state -------------------------
class ASwitchingDecoration : public ASwitchableDecoration
{
DECLARE_STATELESS_ACTOR (ASwitchingDecoration, ASwitchableDecoration)
public:
void Deactivate (AActor *activator) {}
};
IMPLEMENT_ABSTRACT_ACTOR (ASwitchingDecoration)
/***************************** IceChunk ************************************/
class AIceChunk : public AActor

View file

@ -218,6 +218,7 @@ xx(DrainLife) // A weapon like the Sigil that drains your life away.
xx(Massacre) // For death by a cheater!
//(Melee) already defined above, so don't define it again
xx(InstantDeath) // Strife "instant death"
xx(PoisonCloud) // makes monsters howl.
// Special death name for getting killed excessively. Could be used as
// a damage type if you wanted to force an extreme death.

View file

@ -1201,7 +1201,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
if (!(target->flags5 & MF5_NOPAIN) && (pr_damagemobj() < painchance) && !(target->flags & MF_SKULLFLY))
{
if (inflictor && inflictor->IsKindOf (RUNTIME_CLASS(ALightning)))
if (mod == NAME_Electric)
{
if (pr_lightning() < 96)
{
@ -1223,7 +1223,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
target->flags |= MF_JUSTHIT; // fight back!
FState * painstate = target->FindState(NAME_Pain, mod);
if (painstate != NULL) target->SetState (painstate);
if (inflictor && inflictor->IsKindOf (RUNTIME_CLASS(APoisonCloud)))
if (mod == NAME_PoisonCloud)
{
if ((target->flags3 & MF3_ISMONSTER) && pr_poison() < 128)
{

View file

@ -20,6 +20,7 @@ ACTOR Centaur 107
ActiveSound "CentaurActive"
HowlSound "PuppyBeat"
Obituary "$OB_CENTAUR"
DamageFactor "Electric", 3
States
{
Spawn:

View file

@ -0,0 +1,118 @@
// Dragon -------------------------------------------------------------------
ACTOR Dragon 254
{
Game Hexen
Health 640
PainChance 128
Speed 10
Height 65
Mass 0x7fffffff
Monster
+NOGRAVITY +FLOAT +NOBLOOD
+BOSS
+DONTMORPH +NOTARGET
+NOICEDEATH
SeeSound "DragonSight"
AttackSound "DragonAttack"
PainSound "DragonPain"
DeathSound "DragonDeath"
ActiveSound "DragonActive"
Obituary "$OB_DRAGON"
action native A_DragonInitFlight();
action native A_DragonFlap();
action native A_DragonFlight();
action native A_DragonPain();
action native A_DragonAttack();
action native A_DragonCheckCrash();
States
{
Spawn:
DRAG D 10 A_Look
Loop
See:
DRAG CB 5
DRAG A 5 A_DragonInitFlight
DRAG B 3 A_DragonFlap
DRAG BCCDDCCBBAA 3 A_DragonFlight
Goto See + 3
Pain:
DRAG F 10 A_DragonPain
Goto See + 3
Missile:
DRAG E 8 A_DragonAttack
Goto See + 3
Death:
DRAG G 5 A_Scream
DRAG H 4 A_NoBlocking
DRAG I 4
DRAG J 4 A_DragonCheckCrash
Wait
Crash:
DRAG KL 5
DRAG M -1
Stop
}
}
// Dragon Fireball ----------------------------------------------------------
ACTOR DragonFireball
{
Speed 24
Radius 12
Height 10
Damage 6
DamageType "Fire"
Projectile
-ACTIVATEIMPACT -ACTIVATEPCROSS
RenderStyle Add
DeathSound "DragonFireballExplode"
action native A_DragonFX2();
States
{
Spawn:
DRFX ABCDEF 4 Bright
Loop
Death:
DRFX GHI 4 Bright
DRFX J 4 Bright A_DragonFX2
DRFX KL 3 Bright
Stop
}
}
// Dragon Fireball Secondary Explosion --------------------------------------
ACTOR DragonExplosion
{
Radius 8
Height 8
DamageType "Fire"
+NOBLOCKMAP
+NOTELEPORT
+INVISIBLE
RenderStyle Add
DeathSound "DragonFireballExplode"
States
{
Spawn:
CFCF Q 1 Bright
CFCF Q 4 Bright A_UnHideThing
CFCF R 3 Bright A_Scream
CFCF S 4 Bright
CFCF T 3 Bright A_Explode (80, 128, 0)
CFCF U 4 Bright
CFCF V 3 Bright
CFCF W 4 Bright
CFCF X 3 Bright
CFCF Y 4 Bright
CFCF Z 3 Bright
Stop
}
}

View file

@ -21,6 +21,32 @@ ACTOR PoisonBag
}
}
// Fire Bomb (Flechette used by Mage) ---------------------------------------
ACTOR FireBomb
{
DamageType "Fire"
+NOGRAVITY
+FOILINVUL
RenderStyle Translucent
Alpha 0.6
DeathSound "FlechetteExplode"
action native A_TimeBomb();
States
{
Spawn:
PSBG A 20
PSBG AA 10
PSBG B 4
PSBG C 4 A_Scream
XPL1 A 4 Bright A_TimeBomb
XPL1 BCDEF 4 Bright
Stop
}
}
// Throwing Bomb (Flechette used by Fighter) --------------------------------
ACTOR ThrowingBomb
@ -65,3 +91,78 @@ ACTOR ThrowingBomb
Stop
}
}
// Poison Bag Artifact (Flechette) ------------------------------------------
ACTOR ArtiPoisonBag : Inventory 8000 native
{
Game Hexen
SpawnID 72
+FLOATBOB
Inventory.DefMaxAmount
Inventory.PickupFlash 1
+INVBAR +FANCYPICKUPSOUND
Inventory.Icon "ARTIPSBG"
Inventory.PickupSound "misc/p_pkup"
Inventory.PickupMessage "$TXT_ARTIPOISONBAG"
States
{
Spawn:
PSBG A -1
Stop
}
}
// Poison Bag 1 (The Cleric's) ----------------------------------------------
ACTOR ArtiPoisonBag1 : ArtiPoisonBag native
{
Inventory.Icon "ARTIPSB1"
}
// Poison Bag 2 (The Mage's) ------------------------------------------------
ACTOR ArtiPoisonBag2 : ArtiPoisonBag native
{
Inventory.Icon "ARTIPSB2"
}
// Poison Bag 3 (The Fighter's) ---------------------------------------------
ACTOR ArtiPoisonBag3 : ArtiPoisonBag native
{
Inventory.Icon "ARTIPSB3"
}
// Poison Cloud -------------------------------------------------------------
ACTOR PoisonCloud native
{
Radius 20
Height 30
Mass 0x7fffffff
+NOBLOCKMAP +NOGRAVITY +DROPOFF
+NODAMAGETHRUST
+DONTSPLASH +FOILINVUL +CANBLAST +BLOODLESSIMPACT
RenderStyle Translucent
Alpha 0.6
DeathSound "PoisonShroomDeath"
DamageType PoisonCloud
action native A_PoisonBagDamage();
action native A_PoisonBagCheck();
States
{
Spawn:
PSBG D 1
PSBG D 1 A_Scream
PSBG DEEEFFFGGGHHHII 2 A_PoisonBagDamage
PSBG I 2 A_PoisonBagCheck
PSBG I 1 A_PoisonBagCheck
Goto Spawn + 3
Death:
PSBG HG 7
PSBG FD 6
Stop
}
}

View file

@ -75,6 +75,283 @@ ACTOR TreeDestructible 8062
}
// Pottery1 ------------------------------------------------------------------
ACTOR Pottery1 104 native
{
Game Hexen
Health 15
Speed 10
Height 32
+SOLID +SHOOTABLE +NOBLOOD +DROPOFF
+SLIDESONWALLS +PUSHABLE +TELESTOMP +CANPASS
+NOICEDEATH
action native A_PotteryExplode();
States
{
Spawn:
POT1 A -1
Loop
Death:
POT1 A 0 A_PotteryExplode
Stop
}
}
// Pottery2 -----------------------------------------------------------------
ACTOR Pottery2 : Pottery1 105
{
Game Hexen
Height 25
States
{
Spawn:
POT2 A -1
Stop
}
}
// Pottery3 -----------------------------------------------------------------
ACTOR Pottery3 : Pottery1 106
{
Game Hexen
Height 25
States
{
Spawn:
POT3 A -1
Stop
}
}
// Pottery Bit --------------------------------------------------------------
ACTOR PotteryBit
{
Radius 5
Height 5
+MISSILE
+NOTELEPORT
+NOICEDEATH
action native A_PotteryChooseBit();
action native A_PotteryCheck();
States
{
Spawn:
PBIT ABCDE -1
Stop
Death:
PBIT F 0 A_PotteryChooseBit
Stop
Pottery1:
PBIT F 140
PBIT F 1 A_PotteryCheck
Stop
Pottery2:
PBIT G 140
PBIT G 1 A_PotteryCheck
Stop
Pottery3:
PBIT H 140
PBIT H 1 A_PotteryCheck
Stop
Pottery4:
PBIT I 140
PBIT I 1 A_PotteryCheck
Stop
Pottery5:
PBIT J 140
PBIT J 1 A_PotteryCheck
Stop
}
}
// Blood pool ---------------------------------------------------------------
ACTOR BloodPool 111
{
Game Hexen
States
{
Spawn:
BDPL A -1
Stop
}
}
// Lynched corpse (no heart) ------------------------------------------------
ACTOR ZCorpseLynchedNoHeart 109 native
{
Radius 10
Height 100
+SOLID +SPAWNCEILING +NOGRAVITY
action native A_CorpseBloodDrip();
States
{
Spawn:
CPS5 A 140 A_CorpseBloodDrip
Loop
}
}
// CorpseBloodDrip ----------------------------------------------------------
ACTOR CorpseBloodDrip
{
Radius 1
Height 4
Gravity 0.125
+MISSILE
+NOICEDEATH
States
{
Spawn:
BDRP A -1
Stop
Death:
BDSH AB 3
BDSH CD 2
Stop
}
}
// Corpse bit ---------------------------------------------------------------
ACTOR CorpseBit
{
Radius 5
Height 5
+NOBLOCKMAP
+TELESTOMP
States
{
Spawn:
CPB1 A -1
Stop
CPB2 A -1
Stop
CPB3 A -1
Stop
CPB4 A -1
Stop
}
}
// Corpse (sitting, splatterable) -------------------------------------------
ACTOR ZCorpseSitting 110
{
Game Hexen
Health 30
Radius 15
Height 35
+SOLID +SHOOTABLE +NOBLOOD
+NOICEDEATH
DeathSound "FireDemonDeath"
action native A_CorpseExplode();
States
{
Spawn:
CPS6 A -1
Stop
CPS6 A 1 A_CorpseExplode
Stop
}
}
// Leaf Spawner -------------------------------------------------------------
ACTOR LeafSpawner 113
{
Game Hexen
+NOBLOCKMAP +NOSECTOR
+INVISIBLE
action native A_LeafSpawn();
States
{
Spawn:
TNT1 A 20 A_LeafSpawn
Loop
}
}
// Leaf 1 -------------------------------------------------------------------
ACTOR Leaf1
{
Radius 2
Height 4
Gravity 0.125
+NOBLOCKMAP +MISSILE
+NOTELEPORT +DONTSPLASH
+NOICEDEATH
action native A_LeafThrust();
action native A_LeafCheck();
States
{
Spawn:
LEF1 ABC 4
LEF1 D 4 A_LeafThrust
LEF1 EFG 4
LEF1 H 4 A_LeafThrust
LEF1 I 4
LEF1 AB 4
LEF1 C 4 A_LeafThrust
LEF1 DEF 4
LEF1 G 4 A_LeafThrust
LEF1 HI 4
Stop
Death:
LEF3 D 10 A_LeafCheck
Wait
}
}
// Leaf 2 -------------------------------------------------------------------
ACTOR Leaf2 : Leaf1
{
States
{
Spawn:
LEF2 ABC 4
LEF2 D 4 A_LeafThrust
LEF2 EFG 4
LEF2 H 4 A_LeafThrust
LEF2 I 4
LEF2 AB 4
LEF2 C 4 A_LeafThrust
LEF2 DEF 4
LEF2 G 4 A_LeafThrust
LEF2 HI 4
Stop
}
}
// Twined torch -------------------------------------------------------------
ACTOR ZTwinedTorch : SwitchableDecoration 116
@ -191,6 +468,39 @@ ACTOR ZShrub2 8102
}
// Poison Shroom ------------------------------------------------------------
ACTOR ZPoisonShroom 8104
{
Game Hexen
Radius 6
Height 20
PainChance 255
Health 30
Mass 0x7fffffff
+SHOOTABLE +SOLID +NOBLOOD
+NOICEDEATH
PainSound "PoisonShroomPain"
DeathSound "PoisonShroomDeath"
action native A_PoisonShroom();
States
{
Spawn:
SHRM A 5 A_PoisonShroom
Pain:
SHRM A 6
SHRM B 8 A_Pain
Goto Spawn
Death:
SHRM CDE 5
SHRM F -1
Stop
}
}
// Fire Bull ----------------------------------------------------------------
ACTOR ZFireBull : SwitchableDecoration 8042
@ -225,6 +535,124 @@ ACTOR ZFireBullUnlit : ZFireBull 8043
}
// Suit of armor ------------------------------------------------------------
ACTOR ZSuitOfArmor
{
Health 60
Radius 16
Height 72
Mass 0x7fffffff
+SOLID +SHOOTABLE +NOBLOOD
+NOICEDEATH
DeathSound "SuitofArmorBreak"
action native A_SoAExplode();
States
{
Spawn:
ZSUI A -1
Stop
ZSUI A 1 A_SoAExplode
Stop
}
}
// Armor chunk --------------------------------------------------------------
ACTOR ZArmorChunk
{
Radius 4
Height 8
States
{
Spawn:
ZSUI B -1
Stop
ZSUI C -1
Stop
ZSUI D -1
Stop
ZSUI E -1
Stop
ZSUI F -1
Stop
ZSUI G -1
Stop
ZSUI H -1
Stop
ZSUI I -1
Stop
ZSUI J -1
Stop
ZSUI K -1
Stop
}
}
// Bell ---------------------------------------------------------------------
ACTOR ZBell 8065 native
{
Game Hexen
Health 5
Radius 56
Height 120
Mass 0x7fffffff
+SOLID +SHOOTABLE +NOBLOOD +NOGRAVITY +SPAWNCEILING
+NOICEDEATH
DeathSound "BellRing"
action native A_BellReset1();
action native A_BellReset2();
States
{
Spawn:
BBLL F -1
Stop
Death:
BBLL A 4 A_BellReset1
BBLL BC 4
BBLL D 5 A_Scream
BBLL CB 4
BBLL A 3
BBLL E 4
BBLL F 5
BBLL G 6 A_Scream
BBLL F 5
BBLL EA 4
BBLL BC 5
BBLL D 6 A_Scream
BBLL CB 5
BBLL A 4
BBLL EF 5
BBLL G 7 A_Scream
BBLL FEA 5
BBLL B 6
BBLL C 6
BBLL D 7 A_Scream
BBLL CB 6
BBLL A 5
BBLL EF 6
BBLL G 7 A_Scream
BBLL FEABC 6
BBLL B 7
BBLL A 8
BBLL E 12
BBLL A 10
BBLL B 12
BBLL A 12
BBLL E 14
BBLL A 1 A_BellReset2
Goto Spawn
}
}
// "Christmas" Tree ---------------------------------------------------------
ACTOR ZXmasTree 8068

View file

@ -0,0 +1,125 @@
ACTOR Korax 10200
{
Game Hexen
Health 5000
Painchance 20
Speed 10
Radius 65
Height 115
Mass 2000
Damage 15
Monster
+BOSS
+FLOORCLIP
+TELESTOMP
+DONTMORPH
+NOTARGET
+NOICEDEATH
+BOSSDEATH
SeeSound "KoraxSight"
AttackSound "KoraxAttack"
PainSound "KoraxPain"
DeathSound "KoraxDeath"
ActiveSound "KoraxActive"
Obituary "$OB_KORAX" // "%o was swept from the board by Korax."
action native A_KoraxChase();
action native A_KoraxDecide();
action native A_KoraxBonePop();
action native A_KoraxMissile();
action native A_KoraxCommand();
States
{
Spawn:
KORX A 5 A_Look
Loop
See:
KORX AAA 3 A_KoraxChase
KORX B 3 A_Chase
KORX BBB 3 A_KoraxChase
KORX C 0 A_PlaySound("KoraxStep")
KORX C 3 A_Chase
KORX CCC 3 A_KoraxChase
KORX D 3 A_Chase
KORX DDD 3 A_KoraxChase
KORX A 0 A_PlaySound("KoraxStep")
KORX A 3 A_Chase
Loop
Pain:
KORX H 5 A_Pain
KORX H 5
Goto See
Missile:
KORX E 2 Bright A_FaceTarget
KORX E 5 Bright A_KoraxDecide
Wait
Death:
KORX I 5
KORX J 5 A_FaceTarget
KORX K 5 A_Scream
KORX LMNOP 5
KORX Q 10
KORX R 5 A_KoraxBonePop
KORX S 5 A_NoBlocking
KORX TU 5
KORX V -1
Stop
Attack:
KORX E 4 Bright A_FaceTarget
KORX F 8 Bright A_KoraxMissile
KORX E 8 Bright
Goto See
Command:
KORX E 5 Bright A_FaceTarget
KORX W 10 Bright A_FaceTarget
KORX G 15 Bright A_KoraxCommand
KORX W 10 Bright
KORX E 5 Bright
Goto See
}
}
ACTOR KoraxSpirit
{
Speed 8
Projectile
+NOCLIP
-ACTIVATEPCROSS
-ACTIVATEIMPACT
RenderStyle Translucent
Alpha 0.4
action native A_KSpiritRoam();
States
{
Spawn:
SPIR AB 5 A_KSpiritRoam
Loop
Death:
SPIR DEFGHI 5
Stop
}
}
ACTOR KoraxBolt
{
Radius 15
Height 35
Projectile
-ACTIVATEPCROSS
-ACTIVATEIMPACT
RenderStyle Add
action native A_KBolt();
action native A_KBoltRaise();
States
{
Spawn:
MLFX I 2 Bright
MLFX J 2 Bright A_KBoltRaise
MLFX IJKLM 2 Bright A_KBolt
}
}

View file

@ -1,4 +1,27 @@
// Dark Servant Artifact ----------------------------------------------------
ACTOR ArtiDarkServant : Inventory 86 native
{
Game Hexen
SpawnID 16
+COUNTITEM
+FLOATBOB
Inventory.RespawnTics 4230
Inventory.DefMaxAmount
Inventory.PickupFlash 1
+INVBAR +FANCYPICKUPSOUND
Inventory.Icon "ARTISUMN"
Inventory.PickupSound "misc/p_pkup"
Inventory.PickupMessage "$TXT_ARTISUMMON"
States
{
Spawn:
SUMN A 350
Loop
}
}
// Summoning Doll -----------------------------------------------------------
ACTOR SummoningDoll

View file

@ -67,6 +67,7 @@
#include "actors/heretic/dsparil.txt"
#include "actors/heretic/chicken.txt"
#include "actors/hexen/korax.txt"
#include "actors/hexen/fighterplayer.txt"
#include "actors/hexen/clericplayer.txt"
#include "actors/hexen/mageplayer.txt"
@ -105,6 +106,7 @@
#include "actors/hexen/fighteraxe.txt"
#include "actors/hexen/fighterhammer.txt"
#include "actors/hexen/fighterquietus.txt"
#include "actors/hexen/dragon.txt"
#include "actors/strife/strifehumanoid.txt"
#include "actors/strife/strifeplayer.txt"