mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-15 16:51:31 +00:00
- 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:
parent
b695330e90
commit
e010561088
19 changed files with 918 additions and 1047 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -20,6 +20,7 @@ ACTOR Centaur 107
|
|||
ActiveSound "CentaurActive"
|
||||
HowlSound "PuppyBeat"
|
||||
Obituary "$OB_CENTAUR"
|
||||
DamageFactor "Electric", 3
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
|
|
118
wadsrc/static/actors/hexen/dragon.txt
Normal file
118
wadsrc/static/actors/hexen/dragon.txt
Normal 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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
125
wadsrc/static/actors/hexen/korax.txt
Normal file
125
wadsrc/static/actors/hexen/korax.txt
Normal 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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue