- Converted the Minotaur's projectiles to DECORATE so that I can get

rid of the AT_SPEED_SET code.
- Converted Heretic's Blaster and SkullRod to DECORATE.


SVN r1109 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-04 19:25:13 +00:00
parent cc99d150a3
commit b2a6bed19f
17 changed files with 451 additions and 639 deletions

View file

@ -1,4 +1,7 @@
August 3, 2008 (Changes by Graf Zahl)
- Converted the Minotaur's projectiles to DECORATE so that I can get
rid of the AT_SPEED_SET code.
- Converted Heretic's Blaster and SkullRod to DECORATE.
- Converted the mace and all related actors to DECORATE and generalized
the spawn function that only spawns one mace per level.
- Moved Mace respawning code into AInventory so that it works properly

View file

@ -40,12 +40,10 @@
#define AREG_SECTION "__DATA,areg"
#define CREG_SECTION "__DATA,creg"
#define GREG_SECTION "__DATA,greg"
#define SREG_SECTION "__DATA,sreg"
#else
#define AREG_SECTION "areg"
#define CREG_SECTION "creg"
#define GREG_SECTION "greg"
#define SREG_SECTION "sreg"
#endif
#endif
@ -60,10 +58,6 @@ extern REGINFO ARegTail;
extern REGINFO GRegHead;
extern REGINFO GRegTail;
// List of AT_SPEED_SET functions
extern REGINFO SRegHead;
extern REGINFO SRegTail;
// List of TypeInfos
extern REGINFO CRegHead;
extern REGINFO CRegTail;

View file

@ -46,7 +46,7 @@
#if defined(_MSC_VER)
#pragma comment(linker, "/merge:.areg=.data /merge:.creg=.data /merge:.greg=.data /merge:.sreg=.data /merge:.wreg=.data")
#pragma comment(linker, "/merge:.areg=.data /merge:.creg=.data /merge:.greg=.data /merge:.wreg=.data")
#pragma data_seg(".areg$a")
void *ARegHead = 0;
@ -57,9 +57,6 @@ void *CRegHead = 0;
#pragma data_seg(".greg$a")
void *GRegHead = 0;
#pragma data_seg(".sreg$a")
void *SRegHead = 0;
#pragma data_seg()
// We want visual styles support under XP
@ -86,7 +83,6 @@ void *SRegHead = 0;
void *ARegHead __attribute__((section(AREG_SECTION))) = 0;
void *CRegHead __attribute__((section(CREG_SECTION))) = 0;
void *GRegHead __attribute__((section(GREG_SECTION))) = 0;
void *SRegHead __attribute__((section(SREG_SECTION))) = 0;
#elif

View file

@ -46,9 +46,6 @@ void *CRegTail = 0;
#pragma data_seg(".greg$z")
void *GRegTail = 0;
#pragma data_seg(".sreg$z")
void *SRegTail = 0;
#pragma data_seg()
@ -58,7 +55,6 @@ void *SRegTail = 0;
void *ARegTail __attribute__((section(AREG_SECTION))) = 0;
void *CRegTail __attribute__((section(CREG_SECTION))) = 0;
void *GRegTail __attribute__((section(GREG_SECTION))) = 0;
void *SRegTail __attribute__((section(SREG_SECTION))) = 0;
#elif

View file

@ -158,6 +158,14 @@ ACTOR(MacePL1Check)
ACTOR(MaceBallImpact)
ACTOR(MaceBallImpact2)
ACTOR(DeathBallImpact)
ACTOR(FireBlasterPL1)
ACTOR(SpawnRippers)
ACTOR(FireSkullRodPL1)
ACTOR(AddPlayerRain)
ACTOR(HideInCeiling)
ACTOR(SkullRodStorm)
ACTOR(RainImpact)
ACTOR(MntrFloorFire)
ACTOR(BatSpawnInit)

View file

@ -704,123 +704,17 @@ boom:
}
}
// --- Blaster (aka Claw) ---------------------------------------------------
void A_FireBlasterPL1 (AActor *);
void A_FireBlasterPL2 (AActor *);
void A_SpawnRippers (AActor *);
// Blaster ------------------------------------------------------------------
class ABlaster : public AHereticWeapon
{
DECLARE_ACTOR (ABlaster, AHereticWeapon)
};
class ABlasterPowered : public ABlaster
{
DECLARE_STATELESS_ACTOR (ABlasterPowered, ABlaster)
};
FState ABlaster::States[] =
{
#define S_BLSR 0
S_NORMAL (WBLS, 'A', -1, NULL , NULL),
#define S_BLASTERREADY (S_BLSR+1)
S_NORMAL (BLSR, 'A', 1, A_WeaponReady , &States[S_BLASTERREADY]),
#define S_BLASTERDOWN (S_BLASTERREADY+1)
S_NORMAL (BLSR, 'A', 1, A_Lower , &States[S_BLASTERDOWN]),
#define S_BLASTERUP (S_BLASTERDOWN+1)
S_NORMAL (BLSR, 'A', 1, A_Raise , &States[S_BLASTERUP]),
#define S_BLASTERATK1 (S_BLASTERUP+1)
S_NORMAL (BLSR, 'B', 3, NULL , &States[S_BLASTERATK1+1]),
S_NORMAL (BLSR, 'C', 3, NULL , &States[S_BLASTERATK1+2]),
S_NORMAL (BLSR, 'D', 2, A_FireBlasterPL1 , &States[S_BLASTERATK1+3]),
S_NORMAL (BLSR, 'C', 2, NULL , &States[S_BLASTERATK1+4]),
S_NORMAL (BLSR, 'B', 2, NULL , &States[S_BLASTERATK1+5]),
S_NORMAL (BLSR, 'A', 0, A_ReFire , &States[S_BLASTERREADY]),
#define S_BLASTERATK2 (S_BLASTERATK1+6)
S_NORMAL (BLSR, 'B', 0, NULL , &States[S_BLASTERATK2+1]),
S_NORMAL (BLSR, 'C', 0, NULL , &States[S_BLASTERATK2+2]),
S_NORMAL (BLSR, 'D', 3, A_FireBlasterPL2 , &States[S_BLASTERATK2+3]),
S_NORMAL (BLSR, 'C', 4, NULL , &States[S_BLASTERATK2+4]),
S_NORMAL (BLSR, 'B', 4, NULL , &States[S_BLASTERATK2+5]),
S_NORMAL (BLSR, 'A', 0, A_ReFire , &States[S_BLASTERREADY])
};
IMPLEMENT_ACTOR (ABlaster, Heretic, 53, 28)
PROP_Flags (MF_SPECIAL)
PROP_Flags5 (MF5_BLOODSPLATTER)
PROP_SpawnState (S_BLSR)
PROP_Weapon_SelectionOrder (500)
PROP_Weapon_AmmoUse1 (USE_BLSR_AMMO_1)
PROP_Weapon_AmmoGive1 (30)
PROP_Weapon_UpState (S_BLASTERUP)
PROP_Weapon_DownState (S_BLASTERDOWN)
PROP_Weapon_ReadyState (S_BLASTERREADY)
PROP_Weapon_AtkState (S_BLASTERATK1)
PROP_Weapon_HoldAtkState (S_BLASTERATK1+2)
PROP_Weapon_YAdjust (15)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("BlasterAmmo")
PROP_Weapon_SisterType ("BlasterPowered")
PROP_Inventory_PickupMessage("$TXT_WPNBLASTER")
END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (ABlasterPowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_POWERED_UP)
PROP_Weapon_AmmoUse1 (USE_BLSR_AMMO_2)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AtkState (S_BLASTERATK2)
PROP_Weapon_HoldAtkState (S_BLASTERATK2+2)
PROP_Weapon_SisterType ("Blaster")
PROP_Weapon_ProjectileType ("BlasterFX1")
END_DEFAULTS
// Blaster FX 1 -------------------------------------------------------------
class ABlasterFX1 : public AActor
{
DECLARE_ACTOR (ABlasterFX1, AActor)
DECLARE_CLASS(ABlasterFX1, AActor)
public:
void Tick ();
int DoSpecialDamage (AActor *target, int damage);
};
FState ABlasterFX1::States[] =
{
#define S_BLASTERFX1 0
S_NORMAL (ACLO, 'E', 200, NULL , &States[S_BLASTERFX1+0]),
#define S_BLASTERFXI1 (S_BLASTERFX1+1)
S_BRIGHT (FX18, 'A', 3, A_SpawnRippers , &States[S_BLASTERFXI1+1]),
S_BRIGHT (FX18, 'B', 3, NULL , &States[S_BLASTERFXI1+2]),
S_BRIGHT (FX18, 'C', 4, NULL , &States[S_BLASTERFXI1+3]),
S_BRIGHT (FX18, 'D', 4, NULL , &States[S_BLASTERFXI1+4]),
S_BRIGHT (FX18, 'E', 4, NULL , &States[S_BLASTERFXI1+5]),
S_BRIGHT (FX18, 'F', 4, NULL , &States[S_BLASTERFXI1+6]),
S_BRIGHT (FX18, 'G', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterFX1, Heretic, -1, 0)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (184)
PROP_Damage (2)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_SpawnState (S_BLASTERFX1)
PROP_DeathState (S_BLASTERFXI1)
PROP_DeathSound ("weapons/blasterhit")
END_DEFAULTS
int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
{
@ -835,69 +729,18 @@ int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
return damage;
}
// Blaster smoke ------------------------------------------------------------
class ABlasterSmoke : public AActor
{
DECLARE_ACTOR (ABlasterSmoke, AActor)
};
FState ABlasterSmoke::States[] =
{
#define S_BLASTERSMOKE 0
S_NORMAL (FX18, 'H', 4, NULL , &States[S_BLASTERSMOKE+1]),
S_NORMAL (FX18, 'I', 4, NULL , &States[S_BLASTERSMOKE+2]),
S_NORMAL (FX18, 'J', 4, NULL , &States[S_BLASTERSMOKE+3]),
S_NORMAL (FX18, 'K', 4, NULL , &States[S_BLASTERSMOKE+4]),
S_NORMAL (FX18, 'L', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterSmoke, Heretic, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HR_SHADOW)
PROP_SpawnState (S_BLASTERSMOKE)
END_DEFAULTS
IMPLEMENT_CLASS(ABlasterFX1)
// Ripper -------------------------------------------------------------------
class ARipper : public AActor
{
DECLARE_ACTOR (ARipper, AActor)
DECLARE_CLASS (ARipper, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ARipper::States[] =
{
#define S_RIPPER 0
S_NORMAL (FX18, 'M', 4, NULL , &States[S_RIPPER+1]),
S_NORMAL (FX18, 'N', 5, NULL , &States[S_RIPPER+0]),
#define S_RIPPERX (S_RIPPER+2)
S_BRIGHT (FX18, 'O', 4, NULL , &States[S_RIPPERX+1]),
S_BRIGHT (FX18, 'P', 4, NULL , &States[S_RIPPERX+2]),
S_BRIGHT (FX18, 'Q', 4, NULL , &States[S_RIPPERX+3]),
S_BRIGHT (FX18, 'R', 4, NULL , &States[S_RIPPERX+4]),
S_BRIGHT (FX18, 'S', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ARipper, Heretic, -1, 157)
PROP_RadiusFixed (8)
PROP_HeightFixed (6)
PROP_SpeedFixed (14)
PROP_Damage (1)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_PCROSS|MF2_IMPACT)
PROP_Flags3 (MF3_WARNBOT)
PROP_SpawnState (S_RIPPER)
PROP_DeathState (S_RIPPERX)
PROP_DeathSound ("weapons/blasterpowhit")
END_DEFAULTS
IMPLEMENT_CLASS(ARipper)
int ARipper::DoSpecialDamage (AActor *target, int damage)
{
@ -912,41 +755,6 @@ int ARipper::DoSpecialDamage (AActor *target, int damage)
return damage;
}
// Blaster Puff -------------------------------------------------------------
class ABlasterPuff : public AActor
{
DECLARE_ACTOR (ABlasterPuff, AActor)
};
FState ABlasterPuff::States[] =
{
#define S_BLASTERPUFF1 0
S_BRIGHT (FX17, 'A', 4, NULL , &States[S_BLASTERPUFF1+1]),
S_BRIGHT (FX17, 'B', 4, NULL , &States[S_BLASTERPUFF1+2]),
S_BRIGHT (FX17, 'C', 4, NULL , &States[S_BLASTERPUFF1+3]),
S_BRIGHT (FX17, 'D', 4, NULL , &States[S_BLASTERPUFF1+4]),
S_BRIGHT (FX17, 'E', 4, NULL , NULL),
#define S_BLASTERPUFF2 (S_BLASTERPUFF1+5)
S_BRIGHT (FX17, 'F', 3, NULL , &States[S_BLASTERPUFF2+1]),
S_BRIGHT (FX17, 'G', 3, NULL , &States[S_BLASTERPUFF2+2]),
S_BRIGHT (FX17, 'H', 4, NULL , &States[S_BLASTERPUFF2+3]),
S_BRIGHT (FX17, 'I', 4, NULL , &States[S_BLASTERPUFF2+4]),
S_BRIGHT (FX17, 'J', 4, NULL , &States[S_BLASTERPUFF2+5]),
S_BRIGHT (FX17, 'K', 4, NULL , &States[S_BLASTERPUFF2+6]),
S_BRIGHT (FX17, 'L', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterPuff, Heretic, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags3 (MF3_PUFFONACTORS)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_BLASTERPUFF2)
PROP_CrashState (S_BLASTERPUFF1)
END_DEFAULTS
//----------------------------------------------------------------------------
//
// PROC A_FireBlasterPL1
@ -977,36 +785,10 @@ void A_FireBlasterPL1 (AActor *actor)
{
angle += pr_fb1.Random2() << 18;
}
P_LineAttack (actor, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, RUNTIME_CLASS(ABlasterPuff));
P_LineAttack (actor, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, "BlasterPuff");
S_Sound (actor, CHAN_WEAPON, "weapons/blastershoot", 1, ATTN_NORM);
}
//----------------------------------------------------------------------------
//
// PROC A_FireBlasterPL2
//
//----------------------------------------------------------------------------
void A_FireBlasterPL2 (AActor *actor)
{
player_t *player;
if (NULL == (player = actor->player))
{
return;
}
AWeapon *weapon = actor->player->ReadyWeapon;
if (weapon != NULL)
{
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ABlasterFX1));
S_Sound (actor, CHAN_WEAPON, "weapons/blastershoot", 1, ATTN_NORM);
}
//----------------------------------------------------------------------------
//
// PROC A_SpawnRippers
@ -1085,7 +867,7 @@ void ABlasterFX1::Tick ()
}
if (changexy && (pr_bfx1t() < 64))
{
Spawn<ABlasterSmoke> (x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz), ALLOW_REPLACE);
Spawn("BlasterSmoke", x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz), ALLOW_REPLACE);
}
}
}
@ -1105,168 +887,17 @@ void ABlasterFX1::Tick ()
// --- Skull rod ------------------------------------------------------------
void A_FireSkullRodPL1 (AActor *);
void A_FireSkullRodPL2 (AActor *);
void A_SkullRodPL2Seek (AActor *);
void A_AddPlayerRain (AActor *);
void A_HideInCeiling (AActor *);
void A_SkullRodStorm (AActor *);
void A_RainImpact (AActor *);
// Skull (Horn) Rod ---------------------------------------------------------
class ASkullRod : public AHereticWeapon
{
DECLARE_ACTOR (ASkullRod, AHereticWeapon)
};
class ASkullRodPowered : public ASkullRod
{
DECLARE_STATELESS_ACTOR (ASkullRodPowered, ASkullRod)
};
FState ASkullRod::States[] =
{
#define S_WSKL 0
S_NORMAL (WSKL, 'A', -1, NULL , NULL),
#define S_HORNRODREADY (S_WSKL+1)
S_NORMAL (HROD, 'A', 1, A_WeaponReady , &States[S_HORNRODREADY]),
#define S_HORNRODDOWN (S_HORNRODREADY+1)
S_NORMAL (HROD, 'A', 1, A_Lower , &States[S_HORNRODDOWN]),
#define S_HORNRODUP (S_HORNRODDOWN+1)
S_NORMAL (HROD, 'A', 1, A_Raise , &States[S_HORNRODUP]),
#define S_HORNRODATK1 (S_HORNRODUP+1)
S_NORMAL (HROD, 'A', 4, A_FireSkullRodPL1 , &States[S_HORNRODATK1+1]),
S_NORMAL (HROD, 'B', 4, A_FireSkullRodPL1 , &States[S_HORNRODATK1+2]),
S_NORMAL (HROD, 'B', 0, A_ReFire , &States[S_HORNRODREADY]),
#define S_HORNRODATK2 (S_HORNRODATK1+3)
S_NORMAL (HROD, 'C', 2, NULL , &States[S_HORNRODATK2+1]),
S_NORMAL (HROD, 'D', 3, NULL , &States[S_HORNRODATK2+2]),
S_NORMAL (HROD, 'E', 2, NULL , &States[S_HORNRODATK2+3]),
S_NORMAL (HROD, 'F', 3, NULL , &States[S_HORNRODATK2+4]),
S_NORMAL (HROD, 'G', 4, A_FireSkullRodPL2 , &States[S_HORNRODATK2+5]),
S_NORMAL (HROD, 'F', 2, NULL , &States[S_HORNRODATK2+6]),
S_NORMAL (HROD, 'E', 3, NULL , &States[S_HORNRODATK2+7]),
S_NORMAL (HROD, 'D', 2, NULL , &States[S_HORNRODATK2+8]),
S_NORMAL (HROD, 'C', 2, A_ReFire , &States[S_HORNRODREADY])
};
IMPLEMENT_ACTOR (ASkullRod, Heretic, 2004, 30)
PROP_Flags (MF_SPECIAL)
PROP_SpawnState (S_WSKL)
PROP_Weapon_SelectionOrder (200)
PROP_Weapon_AmmoUse1 (USE_SKRD_AMMO_1)
PROP_Weapon_AmmoGive1 (50)
PROP_Weapon_UpState (S_HORNRODUP)
PROP_Weapon_DownState (S_HORNRODDOWN)
PROP_Weapon_ReadyState (S_HORNRODREADY)
PROP_Weapon_AtkState (S_HORNRODATK1)
PROP_Weapon_YAdjust (15)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("SkullRodAmmo")
PROP_Weapon_SisterType ("SkullRodPowered")
PROP_Weapon_ProjectileType ("HornRodFX1")
PROP_Inventory_PickupMessage("$TXT_WPNSKULLROD")
END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (ASkullRodPowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_POWERED_UP)
PROP_Weapon_AmmoUse1 (USE_SKRD_AMMO_2)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AtkState (S_HORNRODATK2)
PROP_Weapon_SisterType ("SkullRod")
PROP_Weapon_ProjectileType ("HornRodFX2")
END_DEFAULTS
// Horn Rod FX 1 ------------------------------------------------------------
class AHornRodFX1 : public AActor
{
DECLARE_ACTOR (AHornRodFX1, AActor)
};
FState AHornRodFX1::States[] =
{
#define S_HRODFX1 0
S_BRIGHT (FX00, 'A', 6, NULL , &States[S_HRODFX1+1]),
S_BRIGHT (FX00, 'B', 6, NULL , &States[S_HRODFX1+0]),
#define S_HRODFXI1 (S_HRODFX1+2)
S_BRIGHT (FX00, 'H', 5, NULL , &States[S_HRODFXI1+1]),
S_BRIGHT (FX00, 'I', 5, NULL , &States[S_HRODFXI1+2]),
S_BRIGHT (FX00, 'J', 4, NULL , &States[S_HRODFXI1+3]),
S_BRIGHT (FX00, 'K', 4, NULL , &States[S_HRODFXI1+4]),
S_BRIGHT (FX00, 'L', 3, NULL , &States[S_HRODFXI1+5]),
S_BRIGHT (FX00, 'M', 3, NULL , NULL)
};
IMPLEMENT_ACTOR (AHornRodFX1, Heretic, -1, 160)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (22)
PROP_Damage (3)
PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_Flags3 (MF3_WARNBOT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_HRODFX1)
PROP_DeathState (S_HRODFXI1)
PROP_SeeSound ("weapons/hornrodshoot")
PROP_DeathSound ("weapons/hornrodhit")
END_DEFAULTS
// Horn Rod FX 2 ------------------------------------------------------------
class AHornRodFX2 : public AActor
{
DECLARE_ACTOR (AHornRodFX2, AActor)
DECLARE_CLASS (AHornRodFX2, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState AHornRodFX2::States[] =
{
#define S_HRODFX2 0
S_BRIGHT (FX00, 'C', 3, NULL , &States[S_HRODFX2+1]),
S_BRIGHT (FX00, 'D', 3, A_SkullRodPL2Seek , &States[S_HRODFX2+2]),
S_BRIGHT (FX00, 'E', 3, NULL , &States[S_HRODFX2+3]),
S_BRIGHT (FX00, 'F', 3, A_SkullRodPL2Seek , &States[S_HRODFX2+0]),
#define S_HRODFXI2 (S_HRODFX2+4)
S_BRIGHT (FX00, 'H', 5, A_AddPlayerRain , &States[S_HRODFXI2+1]),
S_BRIGHT (FX00, 'I', 5, NULL , &States[S_HRODFXI2+2]),
S_BRIGHT (FX00, 'J', 4, NULL , &States[S_HRODFXI2+3]),
S_BRIGHT (FX00, 'K', 3, NULL , &States[S_HRODFXI2+4]),
S_BRIGHT (FX00, 'L', 3, NULL , &States[S_HRODFXI2+5]),
S_BRIGHT (FX00, 'M', 3, NULL , &States[S_HRODFXI2+6]),
S_NORMAL (FX00, 'G', 1, A_HideInCeiling , &States[S_HRODFXI2+7]),
S_NORMAL (FX00, 'G', 1, A_SkullRodStorm , &States[S_HRODFXI2+7])
};
IMPLEMENT_ACTOR (AHornRodFX2, Heretic, -1, 0)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (22)
PROP_Damage (10)
PROP_SpawnHealth (4*35)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_HRODFX2)
PROP_DeathState (S_HRODFXI2)
PROP_SeeSound ("weapons/hornrodshoot")
PROP_DeathSound ("weapons/hornrodpowhit")
END_DEFAULTS
IMPLEMENT_CLASS (AHornRodFX2)
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
{
@ -1282,41 +913,12 @@ int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
class ARainPillar : public AActor
{
DECLARE_ACTOR (ARainPillar, AActor)
DECLARE_CLASS (ARainPillar, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ARainPillar::States[] =
{
#define S_RAINPLR 0
S_BRIGHT (FX22, 'A', -1, NULL , NULL),
#define S_RAINPLRX (S_RAINPLR+1)
S_BRIGHT (FX22, 'B', 4, A_RainImpact , &States[S_RAINPLRX+1]),
S_BRIGHT (FX22, 'C', 4, NULL , &States[S_RAINPLRX+2]),
S_BRIGHT (FX22, 'D', 4, NULL , &States[S_RAINPLRX+3]),
S_BRIGHT (FX22, 'E', 4, NULL , &States[S_RAINPLRX+4]),
S_BRIGHT (FX22, 'F', 4, NULL , NULL),
#define S_RAINAIRXPLR (S_RAINPLRX+5)
S_BRIGHT (FX22, 'G', 4, NULL , &States[S_RAINAIRXPLR+1]),
S_BRIGHT (FX22, 'H', 4, NULL , &States[S_RAINAIRXPLR+2]),
S_BRIGHT (FX22, 'I', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (ARainPillar, Heretic, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (12)
PROP_SpeedFixed (12)
PROP_Damage (5)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_RAINPLR)
PROP_DeathState (S_RAINPLRX)
END_DEFAULTS
IMPLEMENT_CLASS (ARainPillar)
int ARainPillar::DoSpecialDamage (AActor *target, int damage)
{
@ -1331,16 +933,14 @@ int ARainPillar::DoSpecialDamage (AActor *target, int damage)
class ARainTracker : public AInventory
{
DECLARE_STATELESS_ACTOR (ARainTracker, AInventory)
DECLARE_CLASS (ARainTracker, AInventory)
public:
void Serialize (FArchive &arc);
AActor *Rain1, *Rain2;
};
IMPLEMENT_STATELESS_ACTOR (ARainTracker, Any, -1, 0)
PROP_Inventory_FlagsSet (IF_UNDROPPABLE)
END_DEFAULTS
IMPLEMENT_CLASS (ARainTracker)
void ARainTracker::Serialize (FArchive &arc)
{
Super::Serialize (arc);
@ -1369,7 +969,7 @@ void A_FireSkullRodPL1 (AActor *actor)
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
mo = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(AHornRodFX1));
mo = P_SpawnPlayerMissile (actor, PClass::FindClass("HornRodFX1"));
// Randomize the first frame
if (mo && pr_fsr1() > 128)
{
@ -1551,7 +1151,7 @@ void A_RainImpact (AActor *actor)
{
if (actor->z > actor->floorz)
{
actor->SetState (&ARainPillar::States[S_RAINAIRXPLR]);
actor->SetState (actor->FindState("NotFloor"));
}
else if (pr_impact() < 40)
{

View file

@ -1784,11 +1784,6 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
wantFast = !!G_SkillProperty(SKILLP_FastMonsters);
GameSpeed = wantFast ? SPEED_Fast : SPEED_Normal;
if (oldSpeed != GameSpeed)
{
FActorInfo::StaticSpeedSet ();
}
if (!savegamerestore)
{
if (!netgame)

View file

@ -323,165 +323,6 @@ void AMinotaurFriend::NoBlockingSet ()
// Do not drop anything
}
// Minotaur FX 1 ------------------------------------------------------------
class AMinotaurFX1 : public AActor
{
DECLARE_ACTOR (AMinotaurFX1, AActor)
};
FState AMinotaurFX1::States[] =
{
#define S_MNTRFX1 0
S_BRIGHT (FX12, 'A', 6, NULL , &States[S_MNTRFX1+1]),
S_BRIGHT (FX12, 'B', 6, NULL , &States[S_MNTRFX1+0]),
#define S_MNTRFXI1 (S_MNTRFX1+2)
S_BRIGHT (FX12, 'C', 5, NULL , &States[S_MNTRFXI1+1]),
S_BRIGHT (FX12, 'D', 5, NULL , &States[S_MNTRFXI1+2]),
S_BRIGHT (FX12, 'E', 5, NULL , &States[S_MNTRFXI1+3]),
S_BRIGHT (FX12, 'F', 5, NULL , &States[S_MNTRFXI1+4]),
S_BRIGHT (FX12, 'G', 5, NULL , &States[S_MNTRFXI1+5]),
S_BRIGHT (FX12, 'H', 5, NULL , NULL)
};
IMPLEMENT_ACTOR (AMinotaurFX1, Raven, -1, 0)
PROP_RadiusFixed (10)
PROP_HeightFixed (6)
PROP_SpeedFixed (20)
PROP_Damage (3)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_MNTRFX1)
PROP_DeathState (S_MNTRFXI1)
END_DEFAULTS
AT_SPEED_SET (MinotaurFX1, speed)
{
SimpleSpeedSetter (AMinotaurFX1, 20*FRACUNIT, 26*FRACUNIT, speed);
}
// Minotaur FX 2 ------------------------------------------------------------
class AMinotaurFX2 : public AMinotaurFX1
{
DECLARE_ACTOR (AMinotaurFX2, AMinotaurFX1)
public:
void GetExplodeParms (int &damage, int &distance, bool &hurtSource)
{
damage = 24;
}
};
FState AMinotaurFX2::States[] =
{
#define S_MNTRFX2 0
S_NORMAL (FX13, 'A', 2, A_MntrFloorFire , &States[S_MNTRFX2+0]),
#define S_MNTRFXI2 (S_MNTRFX2+1)
S_BRIGHT (FX13, 'I', 4, A_Explode , &States[S_MNTRFXI2+1]),
S_BRIGHT (FX13, 'J', 4, NULL , &States[S_MNTRFXI2+2]),
S_BRIGHT (FX13, 'K', 4, NULL , &States[S_MNTRFXI2+3]),
S_BRIGHT (FX13, 'L', 4, NULL , &States[S_MNTRFXI2+4]),
S_BRIGHT (FX13, 'M', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (AMinotaurFX2, Raven, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (12)
PROP_SpeedFixed (14)
PROP_Damage (4)
PROP_Flags3 (MF3_FLOORHUGGER)
PROP_SpawnState (S_MNTRFX2)
PROP_DeathState (S_MNTRFXI2)
PROP_DeathSound ("minotaur/fx2hit")
END_DEFAULTS
AT_SPEED_SET (MinotaurFX2, speed)
{
SimpleSpeedSetter (AMinotaurFX2, 14*FRACUNIT, 20*FRACUNIT, speed);
}
// Minotaur FX 3 ------------------------------------------------------------
class AMinotaurFX3 : public AMinotaurFX2
{
DECLARE_ACTOR (AMinotaurFX3, AMinotaurFX2)
public:
void GetExplodeParms (int &damage, int &distance, bool &hurtSource)
{
damage = 128;
}
};
FState AMinotaurFX3::States[] =
{
#define S_MNTRFX3 0
S_BRIGHT (FX13, 'D', 4, NULL , &States[S_MNTRFX3+1]),
S_BRIGHT (FX13, 'C', 4, NULL , &States[S_MNTRFX3+2]),
S_BRIGHT (FX13, 'B', 5, NULL , &States[S_MNTRFX3+3]),
S_BRIGHT (FX13, 'C', 5, NULL , &States[S_MNTRFX3+4]),
S_BRIGHT (FX13, 'D', 5, NULL , &States[S_MNTRFX3+5]),
S_BRIGHT (FX13, 'E', 5, NULL , &States[S_MNTRFX3+6]),
S_BRIGHT (FX13, 'F', 4, NULL , &States[S_MNTRFX3+7]),
S_BRIGHT (FX13, 'G', 4, NULL , &States[S_MNTRFX3+8]),
S_BRIGHT (FX13, 'H', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (AMinotaurFX3, Raven, -1, 0)
PROP_RadiusFixed (8)
PROP_HeightFixed (16)
PROP_SpeedFixed (0)
PROP_SpawnState (S_MNTRFX3)
PROP_DeathSound ("minotaur/fx3hit")
END_DEFAULTS
// Minotaur Smoke Exit ------------------------------------------------------
class AMinotaurSmokeExit : public AActor
{
DECLARE_ACTOR (AMinotaurSmokeExit, AActor)
};
FState AMinotaurSmokeExit::States[] =
{
S_NORMAL (MNSM, 'A', 3, NULL , &States[1]),
S_NORMAL (MNSM, 'B', 3, NULL , &States[2]),
S_NORMAL (MNSM, 'C', 3, NULL , &States[3]),
S_NORMAL (MNSM, 'D', 3, NULL , &States[4]),
S_NORMAL (MNSM, 'E', 3, NULL , &States[5]),
S_NORMAL (MNSM, 'F', 3, NULL , &States[6]),
S_NORMAL (MNSM, 'G', 3, NULL , &States[7]),
S_NORMAL (MNSM, 'H', 3, NULL , &States[8]),
S_NORMAL (MNSM, 'I', 3, NULL , &States[9]),
S_NORMAL (MNSM, 'J', 3, NULL , &States[10]),
S_NORMAL (MNSM, 'I', 3, NULL , &States[11]),
S_NORMAL (MNSM, 'H', 3, NULL , &States[12]),
S_NORMAL (MNSM, 'G', 3, NULL , &States[13]),
S_NORMAL (MNSM, 'F', 3, NULL , &States[14]),
S_NORMAL (MNSM, 'E', 3, NULL , &States[15]),
S_NORMAL (MNSM, 'D', 3, NULL , &States[16]),
S_NORMAL (MNSM, 'C', 3, NULL , &States[17]),
S_NORMAL (MNSM, 'B', 3, NULL , &States[18]),
S_NORMAL (MNSM, 'A', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AMinotaurSmokeExit, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Action functions for the minotaur ----------------------------------------
//----------------------------------------------------------------------------
@ -641,16 +482,20 @@ void A_MinotaurAtk2 (AActor *actor)
return;
}
z = actor->z + 40*FRACUNIT;
mo = P_SpawnMissileZ (actor, z, actor->target, RUNTIME_CLASS(AMinotaurFX1));
if (mo != NULL)
const PClass *fx = PClass::FindClass("MinotaurFX1");
if (fx)
{
// S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM);
momz = mo->momz;
angle = mo->angle;
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle-(ANG45/8), momz);
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle+(ANG45/8), momz);
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle-(ANG45/16), momz);
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle+(ANG45/16), momz);
mo = P_SpawnMissileZ (actor, z, actor->target, fx);
if (mo != NULL)
{
// S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM);
momz = mo->momz;
angle = mo->angle;
P_SpawnMissileAngleZ (actor, z, fx, angle-(ANG45/8), momz);
P_SpawnMissileAngleZ (actor, z, fx, angle+(ANG45/8), momz);
P_SpawnMissileAngleZ (actor, z, fx, angle-(ANG45/16), momz);
P_SpawnMissileAngleZ (actor, z, fx, angle+(ANG45/16), momz);
}
}
}
@ -688,7 +533,7 @@ void A_MinotaurAtk3 (AActor *actor)
}
else
{
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(AMinotaurFX2));
mo = P_SpawnMissile (actor, actor->target, PClass::FindClass("MinotaurFX2"));
if (mo != NULL)
{
S_Sound (mo, CHAN_WEAPON, "minotaur/attack1", 1, ATTN_NORM);
@ -715,7 +560,7 @@ void A_MntrFloorFire (AActor *actor)
actor->z = actor->floorz;
x = actor->x + (pr_fire.Random2 () << 10);
y = actor->y + (pr_fire.Random2 () << 10);
mo = Spawn<AMinotaurFX3> (x, y, ONFLOORZ, ALLOW_REPLACE);
mo = Spawn("MinotaurFX3", x, y, ONFLOORZ, ALLOW_REPLACE);
mo->target = actor->target;
mo->momx = 1; // Force block checking
P_CheckMissileSpawn (mo);
@ -967,5 +812,5 @@ void A_SmokePuffEntry(mobj_t *actor)
void A_SmokePuffExit (AActor *actor)
{
Spawn<AMinotaurSmokeExit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
Spawn("MinotaurSmokeExit", actor->x, actor->y, actor->z, ALLOW_REPLACE);
}

View file

@ -342,22 +342,6 @@ void FActorInfo::RegisterIDs ()
}
}
//==========================================================================
//
// Called when a new game is started, but only if the game
// speed has changed.
//
//==========================================================================
void FActorInfo::StaticSpeedSet ()
{
TAutoSegIteratorNoArrow<void (*)(int), &SRegHead, &SRegTail> setters;
while (++setters != NULL)
{
((void (*)(int))setters) (GameSpeed);
}
}
//==========================================================================
//
//

View file

@ -387,7 +387,6 @@ struct FActorInfo
static void StaticInit ();
static void StaticGameSet ();
static void StaticSetActorNums ();
static void StaticSpeedSet ();
void BuildDefaults ();
void ApplyDefaults (BYTE *defaults);

View file

@ -69,7 +69,6 @@ typedef void (*voidfunc_)();
#pragma data_seg(".areg$u") // ActorInfo initializer list
#pragma data_seg(".greg$u") // AT_GAME_SET list
#pragma data_seg(".sreg$u") // AT_SPEED_SET list
#pragma data_seg()
#define DOOMEDNUMOF(actor) actor##ActorInfo.DoomEdNum
@ -104,12 +103,6 @@ typedef void (*voidfunc_)();
__declspec(allocate(".greg$u")) voidfunc_ ns##_gsr = ns##_gs; \
void ns##_gs ()
// Define a function that gets called when the speed is changed.
#define AT_SPEED_SET(ns,varname) \
extern void ns##_ss(EGameSpeed); \
__declspec(allocate(".sreg$u")) void (*ns##_gsr)(EGameSpeed) = ns##_ss; \
void ns##_ss (EGameSpeed varname)
#else
/***********************************************
@ -151,11 +144,6 @@ extern void ApplyActorDefault (int defnum, int dataint);
//typedef void (*speedfunc)(EGameSpeed);
#define AT_SPEED_SET(ns,varname) \
extern void ns##_ss(EGameSpeed); \
void (*ns##_gsr)(EGameSpeed) __attribute__((section(SREG_SECTION))) = ns##_ss; \
void ns##_ss (EGameSpeed varname)
#endif
// Common macros

View file

@ -658,3 +658,320 @@ ACTOR MaceSpawner : SpecialSpot 2002
}
}
// Blaster ------------------------------------------------------------------
ACTOR Blaster : Weapon 53
{
Game Heretic
SpawnID 28
+BLOODSPLATTER
Weapon.SelectionOrder 500
Weapon.AmmoUse 1
Weapon.AmmoGive 30
Weapon.YAdjust 15
Weapon.AmmoType "BlasterAmmo"
Weapon.SisterWeapon "BlasterPowered"
Inventory.PickupMessage "$TxT_WPNBLASTER"
action native A_FireBlasterPL1();
States
{
Spawn:
WBLS A -1
Stop
Ready:
BLSR A 1 A_WeaponReady
Loop
Deselect:
BLSR A 1 A_Lower
Loop
Select:
BLSR A 1 A_Raise
Loop
Fire:
BLSR BC 3
Hold:
BLSR D 2 A_FireBlasterPL1
BLSR CB 2
BLSR A 0 A_ReFire
Goto Ready
}
}
ACTOR BlasterPowered : Blaster
{
+WEAPON.POWERED_UP
Weapon.AmmoUse 5
Weapon.AmmoGive 0
Weapon.SisterWeapon "Blaster"
States
{
Fire:
BLSR BC 0
Hold:
BLSR D 3 A_FireCustomMissile("BlasterFX1")
BLSR CB 4
BLSR A 0 A_ReFire
Goto Ready
}
}
// Blaster FX 1 -------------------------------------------------------------
ACTOR BlasterFX1 native
{
Radius 12
Height 8
Speed 184
Damage 2
Projectile
SeeSound "weapons/blastershoot"
DeathSound "weapons/blasterhit"
+SPAWNSOUNDSOURCE
action native A_SpawnRippers();
States
{
Spawn:
ACLO E 200
Loop
Death:
FX18 A 3 BRIGHT A_SpawnRippers
FX18 BCDEFG 4 BRIGHT
Stop
}
}
// Blaster smoke ------------------------------------------------------------
ACTOR BlasterSmoke
{
+NOBLOCKMAP
+NOGRAVITY
+NOTELEPORT
+CANNOTPUSH
RenderStyle Translucent
Alpha 0.4
States
{
Spawn:
FX18 HIJKL 4
Stop
}
}
// Ripper -------------------------------------------------------------------
ACTOR Ripper native
{
Game Heretic
SpawnID 157
Radius 8
Height 6
Speed 14
Damage 1
Projectile
+RIPPER
DeathSound "weapons/blasterpowhit"
States
{
Spawn:
FX18 M 4
FX18 N 5
Loop
Death:
FX18 OPQRS 4 BRIGHT
Stop
}
}
// Blaster Puff -------------------------------------------------------------
ACTOR BlasterPuff
{
+NOBLOCKMAP
+NOGRAVITY
+PUFFONACTORS
+NOTELEPORT
RenderStyle Add
States
{
Crash:
FX17 ABCDE 4 BRIGHT
Stop
Spawn:
FX17 FG 3 BRIGHT
FX17 HIJKL 4 BRIGHT
Stop
}
}
// Skull (Horn) Rod ---------------------------------------------------------
ACTOR SkullRod : Weapon 2004
{
Game Heretic
SpawnID 30
Weapon.SelectionOrder 200
Weapon.AmmoUse1 1
Weapon.AmmoGive1 50
Weapon.YAdjust 15
Weapon.AmmoType1 "SkullRodAmmo"
Weapon.SisterWeapon "SkullRodPowered"
Inventory.PickupMessage "$TxT_WPNSKULLROD"
action native A_FireSkullRodPL1();
States
{
Spawn:
WSKL A -1
Stop
Ready:
HROD A 1 A_WeaponReady
Loop
Deselect:
HROD A 1 A_Lower
Loop
Select:
HROD A 1 A_Raise
Loop
Fire:
HROD AB 4 A_FireSkullRodPL1
HROD B 0 A_ReFire
Goto Ready
}
}
ACTOR SkullRodPowered : SkullRod
{
+WEAPON.POWERED_UP
Weapon.AmmoUse1 5
Weapon.AmmoGive1 0
Weapon.SisterWeapon "SkullRod"
States
{
Fire:
HROD C 2
HROD D 3
HROD E 2
HROD F 3
HROD G 4 A_FireCustomMissile("HornRodFX2")
HROD F 2
HROD E 3
HROD D 2
HROD C 2 A_ReFire
Goto Ready
}
}
// Horn Rod FX 1 ------------------------------------------------------------
ACTOR HornRodFX1
{
Game Heretic
SpawnID 160
Radius 12
Height 8
Speed 22
Damage 3
Projectile
+WINDTHRUST
-NOBLOCKMAP
RenderStyle Add
SeeSound "weapons/hornrodshoot"
DeathSound "weapons/hornrodhit"
States
{
Spawn:
FX00 AB 6 BRIGHT
Loop
Death:
FX00 HI 5 BRIGHT
FX00 JK 4 BRIGHT
FX00 LM 3 BRIGHT
Stop
}
}
// Horn Rod FX 2 ------------------------------------------------------------
ACTOR HornRodFX2 native
{
Radius 12
Height 8
Speed 22
Damage 10
Health 140
Projectile
RenderStyle Add
SeeSound "weapons/hornrodpowshoot"
DeathSound "weapons/hornrodpowhit"
action native A_AddPlayerRain();
action native A_HideInCeiling();
action native A_SkullRodStorm();
States
{
Spawn:
FX00 C 3 BRIGHT
FX00 D 3 BRIGHT A_SeekerMissile(10, 30)
FX00 E 3 BRIGHT
FX00 F 3 BRIGHT A_SeekerMissile(10, 30)
Loop
Death:
FX00 H 5 BRIGHT A_AddPlayerRain
FX00 I 5 BRIGHT
FX00 JK 4 BRIGHT
FX00 LM 3 BRIGHT
FX00 G 1 A_HideInCeiling
FX00 G 1 A_SkullRodStorm
Wait
}
}
// Rain pillar 1 ------------------------------------------------------------
ACTOR RainPillar native
{
Radius 5
Height 12
Speed 12
Damage 5
Mass 5
Projectile
-ACTIVATEPCROSS
-ACTIVATEIMPACT
RenderStyle Add
action native A_RainImpact();
States
{
Spawn:
FX22 A -1 BRIGHT
Stop
Death:
FX22 B 4 BRIGHT A_RainImpact
FX22 CDEF 4 BRIGHT
Stop
NotFloor:
FX22 GHI 4 BRIGHT
Stop
}
}
// Rain tracker "inventory" item --------------------------------------------
ACTOR RainTracker : Inventory native
{
+INVENTORY.UNDROPPABLE
}

View file

@ -3,6 +3,7 @@
ACTOR CWeapFlame : ClericWeapon 8009
{
Game Hexen
+NOGRAVITY
Weapon.SelectionOrder 1000
Weapon.AmmoUse 4
@ -45,7 +46,6 @@ ACTOR CWeapFlame : ClericWeapon 8009
ACTOR CFlameFloor
{
Game Hexen
+NOBLOCKMAP +NOGRAVITY
RenderStyle Add
States
@ -62,7 +62,6 @@ ACTOR CFlameFloor
ACTOR FlamePuff
{
Game Hexen
Radius 1
Height 1
+NOBLOCKMAP +NOGRAVITY

View file

@ -220,8 +220,6 @@ ACTOR FireDemonMissile
Damage 1
DamageType "Fire"
Projectile
+FLOORCLIP
-BLOODSPLATTER
RenderStyle Add
DeathSound "FireDemonMissileHit"
States

View file

@ -0,0 +1,88 @@
// Minotaur FX 1 ------------------------------------------------------------
ACTOR MinotaurFX1
{
Radius 10
Height 6
Speed 20
FastSpeed 26
Damage 3
DamageType Fire
Projectile
-ACTIVATEIMPACT
-ACTIVATEPCROSS
RenderStyle Add
States
{
Spawn:
FX12 AB 6 Bright
Loop
Death:
FX12 CDEFGH 5 Bright
Stop
}
}
// Minotaur FX 2 ------------------------------------------------------------
ACTOR MinotaurFX2 : MinotaurFX1
{
Radius 5
Height 12
Speed 14
FastSpeed 20
Damage 4
+FLOORHUGGER
ExplosionDamage 24
DeathSound "minotaur/fx2hit"
action native A_MntrFloorFire();
states
{
Spawn:
FX13 A 2 Bright A_MntrFloorFire
Loop
Death:
FX13 I 4 Bright A_Explode
FX13 JKLM 4 Bright
Stop
}
}
// Minotaur FX 3 ------------------------------------------------------------
ACTOR MinotaurFX3 : MinotaurFX2
{
Radius 8
Height 16
Speed 0
DeathSound "minotaur/fx3hit"
ExplosionDamage 128
States
{
Spawn:
FX13 DC 4 Bright
FX13 BCDE 5 Bright
FX13 FGH 4 Bright
Stop
}
}
// Minotaur Smoke Exit ------------------------------------------------------
ACTOR MinotaurSmokeExit
{
+NOBLOCKMAP
+NOTELEPORT
RenderStyle Translucent
Alpha 0.4
States
{
Spawn:
MNSM ABCDEFGHIJIHGFEDCBA 3
Stop
}
}

View file

@ -75,6 +75,7 @@ ACTOR ArtiInvulnerability : PowerupGiver 84
+FLOATBOB
+INVENTORY.PICKUPFLASH
Inventory.RespawnTics 4230
Inventory.Icon ARTIINVU
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY"
Powerup.Type Invulnerable
Powerup.Color GoldMap

View file

@ -44,6 +44,7 @@
#include "actors/raven/ravenartifacts.txt"
#include "actors/raven/ravenhealth.txt"
#include "actors/raven/ravenambient.txt"
#include "actors/raven/minotaur.txt"
#include "actors/heretic/hereticplayer.txt"
#include "actors/heretic/hereticammo.txt"