mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-06-01 09:41:58 +00:00
- fixed some broken brightmaps.
Update to ZDoom r1109: - 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 for replacement actors. - Added more DECORATE conversions by Karate Chris. - Cleaned up the new bridge code and exported all related actors to DECORATE so that the exported code pointers can be used. - Separated Heretic's and Hexen's invulnerability items for stability reasons. - Fixed spurious warnings on 32-bit VC++ debug builds. - Made the subsong (order) number a proper parameter to MusInfo::Play() instead of requiring a separate SetPosition() call to do it. - Added Gez's submission for custom bridge things. - Fixed: ASpecialSpot must check the array's size before dividing by it. git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@148 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
parent
abe446ced2
commit
ef24d413da
72 changed files with 2062 additions and 2402 deletions
|
@ -1,4 +1,25 @@
|
|||
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
|
||||
for replacement actors.
|
||||
- Added more DECORATE conversions by Karate Chris.
|
||||
- Cleaned up the new bridge code and exported all related actors to
|
||||
DECORATE so that the exported code pointers can be used.
|
||||
- Separated Heretic's and Hexen's invulnerability items for stability
|
||||
reasons.
|
||||
|
||||
August 2, 2008
|
||||
- Fixed spurious warnings on 32-bit VC++ debug builds.
|
||||
- Made the subsong (order) number a proper parameter to MusInfo::Play()
|
||||
instead of requiring a separate SetPosition() call to do it.
|
||||
|
||||
August 2, 2008 (Changes by Graf Zahl)
|
||||
- Added Gez's submission for custom bridge things.
|
||||
- Fixed: ASpecialSpot must check the array's size before dividing by it.
|
||||
- Fixed: The mugshot drawe ignored the accuracy parameter.
|
||||
- Fixed: The Alt HUD's weapon drawer didn't check properly for invalid icons.
|
||||
- Added DECORATE conversions for Hexen's Cleric Mace, Firedemon and fog by
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -107,6 +107,7 @@ ACTOR(DamageChildren)
|
|||
ACTOR(CheckForReload)
|
||||
ACTOR(ResetReloadCounter)
|
||||
ACTOR(ClearReFire)
|
||||
ACTOR(SpawnSingleItem)
|
||||
|
||||
// Heretic stuff
|
||||
ACTOR(Feathers)
|
||||
|
@ -151,7 +152,37 @@ ACTOR(FireGoldWandPL2)
|
|||
ACTOR(FireCrossbowPL1)
|
||||
ACTOR(FireCrossbowPL2)
|
||||
ACTOR(GauntletAttack)
|
||||
ACTOR(FireMacePL1)
|
||||
ACTOR(FireMacePL2)
|
||||
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)
|
||||
ACTOR(BatSpawn)
|
||||
ACTOR(BatMove)
|
||||
ACTOR(BishopDecide)
|
||||
ACTOR(BishopDoBlur)
|
||||
ACTOR(BishopSpawnBlur)
|
||||
ACTOR(BishopPainBlur)
|
||||
ACTOR(BishopChase)
|
||||
ACTOR(BishopAttack)
|
||||
ACTOR(BishopAttack2)
|
||||
ACTOR(BishopPuff)
|
||||
WEAPON(CFlameAttack)
|
||||
WEAPON(CFlameRotate)
|
||||
ACTOR(CFlamePuff)
|
||||
WEAPON(CFlameMissile)
|
||||
WEAPON(CMaceAttack)
|
||||
ACTOR(FiredRocks)
|
||||
ACTOR(FiredChase)
|
||||
|
@ -160,9 +191,20 @@ ACTOR(FiredSplotch)
|
|||
ACTOR(SmBounce)
|
||||
ACTOR(FogSpawn)
|
||||
ACTOR(FogMove)
|
||||
ACTOR(Summon)
|
||||
ACTOR(PoisonBagInit)
|
||||
ACTOR(CheckThrowBomb)
|
||||
ACTOR(CheckThrowBomb2)
|
||||
ACTOR(ClassBossHealth)
|
||||
ACTOR(ClericAttack)
|
||||
ACTOR(FighterAttack)
|
||||
ACTOR(MageAttack)
|
||||
|
||||
// Special code pointers for Strife's player - not to be used elsewhere!
|
||||
ACTOR(ItBurnsItBurns)
|
||||
ACTOR(CrispyPlayer)
|
||||
ACTOR(DropFire)
|
||||
|
||||
// Special code pointers for bridge things
|
||||
ACTOR(BridgeInit)
|
||||
ACTOR(BridgeOrbit)
|
|
@ -14,7 +14,6 @@
|
|||
#include "p_enemy.h"
|
||||
#include "gi.h"
|
||||
#include "r_translate.h"
|
||||
#include "a_specialspot.h"
|
||||
#include "thingdef/thingdef.h"
|
||||
|
||||
static FRandom pr_sap ("StaffAtkPL1");
|
||||
|
@ -22,7 +21,6 @@ static FRandom pr_sap2 ("StaffAtkPL2");
|
|||
static FRandom pr_fgw ("FireWandPL1");
|
||||
static FRandom pr_fgw2 ("FireWandPL2");
|
||||
static FRandom pr_boltspark ("BoltSpark");
|
||||
static FRandom pr_spawnmace ("SpawnMace");
|
||||
static FRandom pr_macerespawn ("MaceRespawn");
|
||||
static FRandom pr_maceatk ("FireMacePL1");
|
||||
static FRandom pr_gatk ("GauntletAttack");
|
||||
|
@ -343,212 +341,16 @@ void A_GauntletAttack (AActor *actor)
|
|||
|
||||
#define MAGIC_JUNK 1234
|
||||
|
||||
void A_FireMacePL1B (AActor *);
|
||||
void A_FireMacePL1 (AActor *);
|
||||
void A_MacePL1Check (AActor *);
|
||||
void A_MaceBallImpact (AActor *);
|
||||
void A_MaceBallImpact2 (AActor *);
|
||||
void A_FireMacePL2 (AActor *);
|
||||
void A_DeathBallImpact (AActor *);
|
||||
|
||||
// The mace itself ----------------------------------------------------------
|
||||
|
||||
class AMace : public AHereticWeapon
|
||||
{
|
||||
DECLARE_ACTOR (AMace, AHereticWeapon)
|
||||
protected:
|
||||
bool DoRespawn ();
|
||||
};
|
||||
|
||||
class AMacePowered : public AMace
|
||||
{
|
||||
DECLARE_STATELESS_ACTOR (AMacePowered, AMace)
|
||||
};
|
||||
|
||||
FState AMace::States[] =
|
||||
{
|
||||
#define S_WMCE 0
|
||||
S_NORMAL (WMCE, 'A', -1, NULL , NULL),
|
||||
|
||||
#define S_MACEREADY (S_WMCE+1)
|
||||
S_NORMAL (MACE, 'A', 1, A_WeaponReady , &States[S_MACEREADY]),
|
||||
|
||||
#define S_MACEDOWN (S_MACEREADY+1)
|
||||
S_NORMAL (MACE, 'A', 1, A_Lower , &States[S_MACEDOWN]),
|
||||
|
||||
#define S_MACEUP (S_MACEDOWN+1)
|
||||
S_NORMAL (MACE, 'A', 1, A_Raise , &States[S_MACEUP]),
|
||||
|
||||
#define S_MACEATK1 (S_MACEUP+1)
|
||||
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK1+1]),
|
||||
S_NORMAL (MACE, 'C', 3, A_FireMacePL1 , &States[S_MACEATK1+2]),
|
||||
S_NORMAL (MACE, 'D', 3, A_FireMacePL1 , &States[S_MACEATK1+3]),
|
||||
S_NORMAL (MACE, 'E', 3, A_FireMacePL1 , &States[S_MACEATK1+4]),
|
||||
S_NORMAL (MACE, 'F', 3, A_FireMacePL1 , &States[S_MACEATK1+5]),
|
||||
S_NORMAL (MACE, 'C', 4, A_ReFire , &States[S_MACEATK1+6]),
|
||||
S_NORMAL (MACE, 'D', 4, NULL , &States[S_MACEATK1+7]),
|
||||
S_NORMAL (MACE, 'E', 4, NULL , &States[S_MACEATK1+8]),
|
||||
S_NORMAL (MACE, 'F', 4, NULL , &States[S_MACEATK1+9]),
|
||||
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEREADY]),
|
||||
|
||||
#define S_MACEATK2 (S_MACEATK1+10)
|
||||
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK2+1]),
|
||||
S_NORMAL (MACE, 'D', 4, A_FireMacePL2 , &States[S_MACEATK2+2]),
|
||||
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK2+3]),
|
||||
S_NORMAL (MACE, 'A', 8, A_ReFire , &States[S_MACEREADY])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMace, Heretic, -1, 31)
|
||||
PROP_Flags (MF_SPECIAL)
|
||||
PROP_SpawnState (0)
|
||||
|
||||
PROP_Weapon_SelectionOrder (1400)
|
||||
PROP_Weapon_Flags (WIF_BOT_REACTION_SKILL_THING|WIF_BOT_EXPLOSIVE)
|
||||
PROP_Weapon_AmmoUse1 (USE_MACE_AMMO_1)
|
||||
PROP_Weapon_AmmoGive1 (50)
|
||||
PROP_Weapon_UpState (S_MACEUP)
|
||||
PROP_Weapon_DownState (S_MACEDOWN)
|
||||
PROP_Weapon_ReadyState (S_MACEREADY)
|
||||
PROP_Weapon_AtkState (S_MACEATK1)
|
||||
PROP_Weapon_HoldAtkState (S_MACEATK1+1)
|
||||
PROP_Weapon_YAdjust (15)
|
||||
PROP_Weapon_MoveCombatDist (27000000)
|
||||
PROP_Weapon_AmmoType1 ("MaceAmmo")
|
||||
PROP_Weapon_SisterType ("MacePowered")
|
||||
PROP_Weapon_ProjectileType ("MaceFX2")
|
||||
PROP_Inventory_PickupMessage("$TXT_WPNMACE")
|
||||
END_DEFAULTS
|
||||
|
||||
IMPLEMENT_STATELESS_ACTOR (AMacePowered, Heretic, -1, 0)
|
||||
PROP_Weapon_Flags (WIF_POWERED_UP|WIF_BOT_REACTION_SKILL_THING|WIF_BOT_EXPLOSIVE)
|
||||
PROP_Weapon_AmmoUse1 (USE_MACE_AMMO_2)
|
||||
PROP_Weapon_AmmoGive1 (0)
|
||||
PROP_Weapon_AtkState (S_MACEATK2)
|
||||
PROP_Weapon_HoldAtkState (S_MACEATK2)
|
||||
PROP_Weapon_SisterType ("Mace")
|
||||
PROP_Weapon_ProjectileType ("MaceFX4")
|
||||
END_DEFAULTS
|
||||
|
||||
// Mace FX1 -----------------------------------------------------------------
|
||||
|
||||
class AMaceFX1 : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AMaceFX1, AActor)
|
||||
};
|
||||
|
||||
FState AMaceFX1::States[] =
|
||||
{
|
||||
#define S_MACEFX1 0
|
||||
S_NORMAL (FX02, 'A', 4, A_MacePL1Check , &States[S_MACEFX1+1]),
|
||||
S_NORMAL (FX02, 'B', 4, A_MacePL1Check , &States[S_MACEFX1+0]),
|
||||
|
||||
#define S_MACEFXI1 (S_MACEFX1+2)
|
||||
S_BRIGHT (FX02, 'F', 4, A_MaceBallImpact , &States[S_MACEFXI1+1]),
|
||||
S_BRIGHT (FX02, 'G', 4, NULL , &States[S_MACEFXI1+2]),
|
||||
S_BRIGHT (FX02, 'H', 4, NULL , &States[S_MACEFXI1+3]),
|
||||
S_BRIGHT (FX02, 'I', 4, NULL , &States[S_MACEFXI1+4]),
|
||||
S_BRIGHT (FX02, 'J', 4, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMaceFX1, Heretic, -1, 154)
|
||||
PROP_RadiusFixed (8)
|
||||
PROP_HeightFixed (6)
|
||||
PROP_SpeedFixed (20)
|
||||
PROP_Damage (2)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
||||
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
|
||||
PROP_Flags3 (MF3_WARNBOT)
|
||||
|
||||
PROP_SpawnState (S_MACEFX1)
|
||||
PROP_DeathState (S_MACEFXI1)
|
||||
|
||||
PROP_SeeSound ("weapons/maceshoot")
|
||||
END_DEFAULTS
|
||||
|
||||
// Mace FX2 -----------------------------------------------------------------
|
||||
|
||||
class AMaceFX2 : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AMaceFX2, AActor)
|
||||
};
|
||||
|
||||
FState AMaceFX2::States[] =
|
||||
{
|
||||
#define S_MACEFX2 0
|
||||
S_NORMAL (FX02, 'C', 4, NULL , &States[S_MACEFX2+1]),
|
||||
S_NORMAL (FX02, 'D', 4, NULL , &States[S_MACEFX2+0]),
|
||||
|
||||
#define S_MACEFXI2 (S_MACEFX2+2)
|
||||
S_BRIGHT (FX02, 'F', 4, A_MaceBallImpact2 , &AMaceFX1::States[S_MACEFXI1+1])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMaceFX2, Heretic, -1, 156)
|
||||
PROP_RadiusFixed (8)
|
||||
PROP_HeightFixed (6)
|
||||
PROP_SpeedFixed (10)
|
||||
PROP_Damage (6)
|
||||
PROP_Gravity (FRACUNIT/8)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
||||
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
|
||||
|
||||
PROP_SpawnState (S_MACEFX2)
|
||||
PROP_DeathState (S_MACEFXI2)
|
||||
END_DEFAULTS
|
||||
|
||||
// Mace FX3 -----------------------------------------------------------------
|
||||
|
||||
class AMaceFX3 : public AMaceFX1
|
||||
{
|
||||
DECLARE_ACTOR (AMaceFX3, AMaceFX1)
|
||||
};
|
||||
|
||||
FState AMaceFX3::States[] =
|
||||
{
|
||||
#define S_MACEFX3 0
|
||||
S_NORMAL (FX02, 'A', 4, NULL , &States[S_MACEFX3+1]),
|
||||
S_NORMAL (FX02, 'B', 4, NULL , &States[S_MACEFX3+0])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMaceFX3, Heretic, -1, 155)
|
||||
PROP_SpeedFixed (7)
|
||||
PROP_Damage (4)
|
||||
PROP_Gravity (FRACUNIT/8)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
||||
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
|
||||
|
||||
PROP_SpawnState (S_MACEFX3)
|
||||
END_DEFAULTS
|
||||
|
||||
// Mace FX4 -----------------------------------------------------------------
|
||||
|
||||
class AMaceFX4 : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AMaceFX4, AActor)
|
||||
DECLARE_CLASS (AMaceFX4, AActor)
|
||||
public:
|
||||
int DoSpecialDamage (AActor *target, int damage);
|
||||
};
|
||||
|
||||
FState AMaceFX4::States[] =
|
||||
{
|
||||
#define S_MACEFX4 0
|
||||
S_NORMAL (FX02, 'E', 99, NULL , &States[S_MACEFX4+0]),
|
||||
|
||||
#define S_MACEFXI4 (S_MACEFX4+1)
|
||||
S_BRIGHT (FX02, 'C', 4, A_DeathBallImpact , &AMaceFX1::States[S_MACEFXI1+1])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMaceFX4, Heretic, -1, 153)
|
||||
PROP_RadiusFixed (8)
|
||||
PROP_HeightFixed (6)
|
||||
PROP_SpeedFixed (7)
|
||||
PROP_Damage (18)
|
||||
PROP_Gravity (FRACUNIT/8)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
||||
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_TELESTOMP|MF2_PCROSS|MF2_IMPACT)
|
||||
|
||||
PROP_SpawnState (S_MACEFX4)
|
||||
PROP_DeathState (S_MACEFXI4)
|
||||
END_DEFAULTS
|
||||
IMPLEMENT_CLASS (AMaceFX4)
|
||||
|
||||
int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
|
||||
{
|
||||
|
@ -570,79 +372,6 @@ int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
|
|||
return 1000000; // Something's gonna die
|
||||
}
|
||||
|
||||
// Mace spawn spot ----------------------------------------------------------
|
||||
|
||||
void A_SpawnMace (AActor *);
|
||||
|
||||
class AMaceSpawner : public ASpecialSpot
|
||||
{
|
||||
DECLARE_ACTOR (AMaceSpawner, ASpecialSpot)
|
||||
};
|
||||
|
||||
FState AMaceSpawner::States[] =
|
||||
{
|
||||
S_NORMAL (TNT1, 'A', 1, NULL, &States[1]),
|
||||
S_NORMAL (TNT1, 'A', -1, A_SpawnMace, NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMaceSpawner, Heretic, 2002, 0)
|
||||
PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
|
||||
// Every mace spawn spot will execute this action. The first one
|
||||
// will build a list of all mace spots in the level and spawn a
|
||||
// mace. The rest of the spots will do nothing.
|
||||
|
||||
void A_SpawnMace (AActor *self)
|
||||
{
|
||||
if (self->target != NULL)
|
||||
{ // Another spot already did it
|
||||
return;
|
||||
}
|
||||
|
||||
AActor *spot = NULL;
|
||||
DSpotState *state = DSpotState::GetSpotState();
|
||||
|
||||
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_TYPE(self), true);
|
||||
if (spot == NULL) return;
|
||||
|
||||
if (!deathmatch && pr_spawnmace() < 64)
|
||||
{ // Sometimes doesn't show up if not in deathmatch
|
||||
return;
|
||||
}
|
||||
|
||||
AActor *mace = Spawn<AMace> (self->x, self->y, self->z, ALLOW_REPLACE);
|
||||
|
||||
if (mace)
|
||||
{
|
||||
mace->SetOrigin (spot->x, spot->y, spot->z);
|
||||
mace->z = mace->floorz;
|
||||
// We want this mace to respawn.
|
||||
mace->flags &= ~MF_DROPPED;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Generalize this so that it doesn't depend on item specific implementation!
|
||||
|
||||
// AMace::DoRespawn
|
||||
// Moves the mace to a different spot when it respawns
|
||||
|
||||
bool AMace::DoRespawn ()
|
||||
{
|
||||
AActor *spot = NULL;
|
||||
DSpotState *state = DSpotState::GetSpotState();
|
||||
|
||||
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_CLASS(AMaceSpawner));
|
||||
if (spot != NULL)
|
||||
{
|
||||
SetOrigin (spot->x, spot->y, spot->z);
|
||||
z = floorz;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// PROC A_FireMacePL1B
|
||||
|
@ -666,7 +395,7 @@ void A_FireMacePL1B (AActor *actor)
|
|||
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
||||
return;
|
||||
}
|
||||
ball = Spawn<AMaceFX2> (actor->x, actor->y, actor->z + 28*FRACUNIT
|
||||
ball = Spawn("MaceFX2", actor->x, actor->y, actor->z + 28*FRACUNIT
|
||||
- actor->floorclip, ALLOW_REPLACE);
|
||||
ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/
|
||||
finetangent[FINEANGLES/4-(actor->pitch>>ANGLETOFINESHIFT)];
|
||||
|
@ -710,7 +439,7 @@ void A_FireMacePL1 (AActor *actor)
|
|||
}
|
||||
player->psprites[ps_weapon].sx = ((pr_maceatk()&3)-2)*FRACUNIT;
|
||||
player->psprites[ps_weapon].sy = WEAPONTOP+(pr_maceatk()&3)*FRACUNIT;
|
||||
ball = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(AMaceFX1),
|
||||
ball = P_SpawnPlayerMissile (actor, PClass::FindClass("MaceFX1"),
|
||||
actor->angle+(((pr_maceatk()&7)-4)<<24));
|
||||
if (ball)
|
||||
{
|
||||
|
@ -812,7 +541,7 @@ void A_MaceBallImpact2 (AActor *ball)
|
|||
ball->momz = (ball->momz * 192) >> 8;
|
||||
ball->SetState (ball->SpawnState);
|
||||
|
||||
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
||||
tiny = Spawn("MaceFX3", ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
||||
angle = ball->angle+ANG90;
|
||||
tiny->target = ball->target;
|
||||
tiny->angle = angle;
|
||||
|
@ -824,7 +553,7 @@ void A_MaceBallImpact2 (AActor *ball)
|
|||
tiny->momz = ball->momz;
|
||||
P_CheckMissileSpawn (tiny);
|
||||
|
||||
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
||||
tiny = Spawn("MaceFX3", ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
||||
angle = ball->angle-ANG90;
|
||||
tiny->target = ball->target;
|
||||
tiny->angle = angle;
|
||||
|
@ -975,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)
|
||||
{
|
||||
|
@ -1106,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)
|
||||
{
|
||||
|
@ -1183,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
|
||||
|
@ -1248,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
|
||||
|
@ -1356,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1376,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)
|
||||
{
|
||||
|
@ -1553,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)
|
||||
{
|
||||
|
@ -1602,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);
|
||||
|
@ -1640,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)
|
||||
{
|
||||
|
@ -1822,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)
|
||||
{
|
||||
|
|
|
@ -7,77 +7,6 @@
|
|||
static FRandom pr_batspawn ("BatSpawn");
|
||||
static FRandom pr_batmove ("BatMove");
|
||||
|
||||
void A_BatSpawnInit (AActor *);
|
||||
void A_BatSpawn (AActor *);
|
||||
void A_BatMove (AActor *);
|
||||
|
||||
// Bat Spawner --------------------------------------------------------------
|
||||
|
||||
class ABatSpawner : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABatSpawner, AActor)
|
||||
public:
|
||||
void Activate (AActor *activator);
|
||||
void Deactivate (AActor *activator);
|
||||
};
|
||||
|
||||
FState ABatSpawner::States[] =
|
||||
{
|
||||
#define S_SPAWNBATS1 0
|
||||
S_NORMAL (TNT1, 'A', 2, NULL , &States[S_SPAWNBATS1+1]),
|
||||
S_NORMAL (TNT1, 'A', 2, A_BatSpawnInit , &States[S_SPAWNBATS1+2]),
|
||||
S_NORMAL (TNT1, 'A', 2, A_BatSpawn , &States[S_SPAWNBATS1+2]),
|
||||
|
||||
#define S_SPAWNBATS_OFF (S_SPAWNBATS1+3)
|
||||
S_NORMAL (TNT1, 'A', -1, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABatSpawner, Hexen, 10225, 0)
|
||||
PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_None)
|
||||
|
||||
PROP_SpawnState (S_SPAWNBATS1)
|
||||
END_DEFAULTS
|
||||
|
||||
void ABatSpawner::Activate (AActor *activator)
|
||||
{
|
||||
SetState (&States[S_SPAWNBATS1]);
|
||||
}
|
||||
|
||||
void ABatSpawner::Deactivate (AActor *activator)
|
||||
{
|
||||
SetState (&States[S_SPAWNBATS_OFF]);
|
||||
}
|
||||
|
||||
// Bat ----------------------------------------------------------------------
|
||||
|
||||
class ABat : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABat, AActor)
|
||||
};
|
||||
|
||||
FState ABat::States[] =
|
||||
{
|
||||
#define S_BAT1 0
|
||||
S_NORMAL (ABAT, 'A', 2, A_BatMove , &States[S_BAT1+1]),
|
||||
S_NORMAL (ABAT, 'B', 2, A_BatMove , &States[S_BAT1+2]),
|
||||
S_NORMAL (ABAT, 'C', 2, A_BatMove , &States[S_BAT1]),
|
||||
|
||||
#define S_BAT_DEATH (S_BAT1+3)
|
||||
S_NORMAL (ABAT, 'A', 2, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABat, Hexen, -1, 0)
|
||||
PROP_SpeedFixed (5)
|
||||
PROP_RadiusFixed (3)
|
||||
PROP_HeightFixed (3)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
|
||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_PASSMOBJ)
|
||||
|
||||
PROP_SpawnState (S_BAT1)
|
||||
PROP_DeathState (S_BAT_DEATH)
|
||||
END_DEFAULTS
|
||||
|
||||
//===========================================================================
|
||||
// Bat Spawner Variables
|
||||
// special1 frequency counter
|
||||
|
@ -111,7 +40,7 @@ void A_BatSpawn (AActor *actor)
|
|||
delta = actor->args[1];
|
||||
if (delta==0) delta=1;
|
||||
angle = actor->angle + (((pr_batspawn()%delta)-(delta>>1))<<24);
|
||||
mo = P_SpawnMissileAngle (actor, RUNTIME_CLASS(ABat), angle, 0);
|
||||
mo = P_SpawnMissileAngle (actor, PClass::FindClass ("Bat"), angle, 0);
|
||||
if (mo)
|
||||
{
|
||||
mo->args[0] = pr_batspawn()&63; // floatbob index
|
||||
|
|
|
@ -14,216 +14,6 @@ static FRandom pr_doblur ("BishopDoBlur");
|
|||
static FRandom pr_sblur ("BishopSpawnBlur");
|
||||
static FRandom pr_pain ("BishopPainBlur");
|
||||
|
||||
void A_BishopDecide (AActor *);
|
||||
void A_BishopDoBlur (AActor *);
|
||||
void A_BishopSpawnBlur (AActor *);
|
||||
void A_BishopPainBlur (AActor *);
|
||||
void A_BishopChase (AActor *);
|
||||
void A_BishopAttack (AActor *);
|
||||
void A_BishopAttack2 (AActor *);
|
||||
void A_BishopPuff (AActor *);
|
||||
void A_SetAltShadow (AActor *);
|
||||
void A_BishopMissileWeave (AActor *);
|
||||
void A_BishopMissileSeek (AActor *);
|
||||
|
||||
// Bishop -------------------------------------------------------------------
|
||||
|
||||
FState ABishop::States[] =
|
||||
{
|
||||
#define S_BISHOP_LOOK 0
|
||||
S_NORMAL (BISH, 'A', 10, A_Look , &States[S_BISHOP_LOOK+0]),
|
||||
|
||||
#define S_BISHOP_BLUR (S_BISHOP_LOOK+1)
|
||||
S_NORMAL (BISH, 'A', 2, A_BishopDoBlur , &States[S_BISHOP_BLUR+1]),
|
||||
S_NORMAL (BISH, 'A', 4, A_BishopSpawnBlur , &States[S_BISHOP_BLUR+1]),
|
||||
|
||||
#define S_BISHOP_WALK (S_BISHOP_BLUR+2)
|
||||
S_NORMAL (BISH, 'A', 2, A_Chase , &States[S_BISHOP_WALK+1]),
|
||||
S_NORMAL (BISH, 'A', 2, A_BishopChase , &States[S_BISHOP_WALK+2]),
|
||||
S_NORMAL (BISH, 'A', 2, NULL , &States[S_BISHOP_WALK+3]),
|
||||
S_NORMAL (BISH, 'B', 2, A_BishopChase , &States[S_BISHOP_WALK+4]),
|
||||
S_NORMAL (BISH, 'B', 2, A_Chase , &States[S_BISHOP_WALK+5]),
|
||||
S_NORMAL (BISH, 'B', 2, A_BishopChase , &States[S_BISHOP_WALK+6]), // S_BISHOP_DECIDE
|
||||
|
||||
#define S_BISHOP_DECIDE (S_BISHOP_WALK+6)
|
||||
S_NORMAL (BISH, 'A', 1, A_BishopDecide , &States[S_BISHOP_WALK+0]),
|
||||
|
||||
#define S_BISHOP_ATK (S_BISHOP_DECIDE+1)
|
||||
S_NORMAL (BISH, 'A', 3, A_FaceTarget , &States[S_BISHOP_ATK+1]),
|
||||
S_BRIGHT (BISH, 'D', 3, A_FaceTarget , &States[S_BISHOP_ATK+2]),
|
||||
S_BRIGHT (BISH, 'E', 3, A_FaceTarget , &States[S_BISHOP_ATK+3]),
|
||||
S_BRIGHT (BISH, 'F', 3, A_BishopAttack , &States[S_BISHOP_ATK+4]),
|
||||
S_BRIGHT (BISH, 'F', 5, A_BishopAttack2 , &States[S_BISHOP_ATK+4]),
|
||||
|
||||
#define S_BISHOP_PAIN (S_BISHOP_ATK+5)
|
||||
S_NORMAL (BISH, 'C', 6, A_Pain , &States[S_BISHOP_PAIN+1]),
|
||||
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+2]),
|
||||
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+3]),
|
||||
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+4]),
|
||||
S_NORMAL (BISH, 'C', 0, NULL , &States[S_BISHOP_WALK+0]),
|
||||
|
||||
#define S_BISHOP_DEATH (S_BISHOP_PAIN+5)
|
||||
S_NORMAL (BISH, 'G', 6, NULL , &States[S_BISHOP_DEATH+1]),
|
||||
S_BRIGHT (BISH, 'H', 6, A_Scream , &States[S_BISHOP_DEATH+2]),
|
||||
S_BRIGHT (BISH, 'I', 5, A_NoBlocking , &States[S_BISHOP_DEATH+3]),
|
||||
S_BRIGHT (BISH, 'J', 5, A_Explode , &States[S_BISHOP_DEATH+4]),
|
||||
S_BRIGHT (BISH, 'K', 5, NULL , &States[S_BISHOP_DEATH+5]),
|
||||
S_BRIGHT (BISH, 'L', 4, NULL , &States[S_BISHOP_DEATH+6]),
|
||||
S_BRIGHT (BISH, 'M', 4, NULL , &States[S_BISHOP_DEATH+7]),
|
||||
S_NORMAL (BISH, 'N', 4, A_BishopPuff , &States[S_BISHOP_DEATH+8]),
|
||||
S_NORMAL (BISH, 'O', 4, A_QueueCorpse , &States[S_BISHOP_DEATH+9]),
|
||||
S_NORMAL (BISH, 'P', -1, NULL , NULL),
|
||||
|
||||
#define S_BISHOP_ICE (S_BISHOP_DEATH+10)
|
||||
S_NORMAL (BISH, 'X', 5, A_FreezeDeath , &States[S_BISHOP_ICE+1]),
|
||||
S_NORMAL (BISH, 'X', 1, A_FreezeDeathChunks , &States[S_BISHOP_ICE+1])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABishop, Hexen, 114, 19)
|
||||
PROP_SpawnHealth (130)
|
||||
PROP_RadiusFixed (22)
|
||||
PROP_HeightFixed (65)
|
||||
PROP_SpeedFixed (10)
|
||||
PROP_PainChance (110)
|
||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY|MF_NOBLOOD)
|
||||
PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP)
|
||||
PROP_Flags3 (MF3_DONTOVERLAP)
|
||||
PROP_Flags4 (MF4_NOTARGETSWITCH)
|
||||
|
||||
PROP_SpawnState (S_BISHOP_LOOK)
|
||||
PROP_SeeState (S_BISHOP_WALK)
|
||||
PROP_PainState (S_BISHOP_PAIN)
|
||||
PROP_MissileState (S_BISHOP_ATK)
|
||||
PROP_DeathState (S_BISHOP_DEATH)
|
||||
PROP_IDeathState (S_BISHOP_ICE)
|
||||
|
||||
PROP_SeeSound ("BishopSight")
|
||||
PROP_AttackSound ("BishopAttack")
|
||||
PROP_PainSound ("BishopPain")
|
||||
PROP_DeathSound ("BishopDeath")
|
||||
PROP_ActiveSound ("BishopActiveSounds")
|
||||
PROP_Obituary("$OB_BISHOP")
|
||||
END_DEFAULTS
|
||||
|
||||
void ABishop::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
|
||||
{ // Bishop radius death
|
||||
damage = 25 + (pr_boom() & 15);
|
||||
}
|
||||
|
||||
// Bishop puff --------------------------------------------------------------
|
||||
|
||||
class ABishopPuff : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABishopPuff, AActor)
|
||||
};
|
||||
|
||||
FState ABishopPuff::States[] =
|
||||
{
|
||||
S_NORMAL (BISH, 'Q', 5, NULL , &States[1]),
|
||||
S_NORMAL (BISH, 'R', 5, NULL , &States[2]),
|
||||
S_NORMAL (BISH, 'S', 5, NULL , &States[3]),
|
||||
S_NORMAL (BISH, 'T', 5, NULL , &States[4]),
|
||||
S_NORMAL (BISH, 'U', 6, NULL , &States[5]),
|
||||
S_NORMAL (BISH, 'V', 6, NULL , &States[6]),
|
||||
S_NORMAL (BISH, 'W', 5, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABishopPuff, Hexen, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Translucent)
|
||||
PROP_Alpha (HX_SHADOW)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
// Bishop blur --------------------------------------------------------------
|
||||
|
||||
class ABishopBlur : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABishopBlur, AActor)
|
||||
};
|
||||
|
||||
FState ABishopBlur::States[] =
|
||||
{
|
||||
S_NORMAL (BISH, 'A', 16, NULL , &States[1]),
|
||||
S_NORMAL (BISH, 'A', 8, A_SetAltShadow , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABishopBlur, Hexen, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Translucent)
|
||||
PROP_Alpha (HX_SHADOW)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
// Bishop pain blur ---------------------------------------------------------
|
||||
|
||||
class ABishopPainBlur : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABishopPainBlur, AActor)
|
||||
};
|
||||
|
||||
FState ABishopPainBlur::States[] =
|
||||
{
|
||||
S_NORMAL (BISH, 'C', 8, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABishopPainBlur, Hexen, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Translucent)
|
||||
PROP_Alpha (HX_SHADOW)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
// Bishop FX ----------------------------------------------------------------
|
||||
|
||||
class ABishopFX : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABishopFX, AActor)
|
||||
public:
|
||||
int DoSpecialDamage (AActor *target, int damage);
|
||||
};
|
||||
|
||||
FState ABishopFX::States[] =
|
||||
{
|
||||
#define S_BISHFX1 0
|
||||
S_BRIGHT (BPFX, 'A', 1, A_BishopMissileWeave , &States[S_BISHFX1+1]),
|
||||
S_BRIGHT (BPFX, 'B', 1, A_BishopMissileWeave , &States[S_BISHFX1+2]),
|
||||
S_BRIGHT (BPFX, 'A', 1, A_BishopMissileWeave , &States[S_BISHFX1+3]),
|
||||
S_BRIGHT (BPFX, 'B', 1, A_BishopMissileWeave , &States[S_BISHFX1+4]),
|
||||
S_BRIGHT (BPFX, 'B', 0, A_BishopMissileSeek , &States[S_BISHFX1+0]),
|
||||
|
||||
#define S_BISHFXI1 (S_BISHFX1+5)
|
||||
S_BRIGHT (BPFX, 'C', 4, NULL , &States[S_BISHFXI1+1]),
|
||||
S_BRIGHT (BPFX, 'D', 4, NULL , &States[S_BISHFXI1+2]),
|
||||
S_BRIGHT (BPFX, 'E', 4, NULL , &States[S_BISHFXI1+3]),
|
||||
S_BRIGHT (BPFX, 'F', 4, NULL , &States[S_BISHFXI1+4]),
|
||||
S_BRIGHT (BPFX, 'G', 3, NULL , &States[S_BISHFXI1+5]),
|
||||
S_BRIGHT (BPFX, 'H', 3, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABishopFX, Hexen, -1, 0)
|
||||
PROP_RadiusFixed (10)
|
||||
PROP_HeightFixed (6)
|
||||
PROP_SpeedFixed (10)
|
||||
PROP_Damage (1)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_SEEKERMISSILE)
|
||||
PROP_RenderStyle (STYLE_Add)
|
||||
|
||||
PROP_SpawnState (S_BISHFX1)
|
||||
PROP_DeathState (S_BISHFXI1)
|
||||
|
||||
PROP_DeathSound ("BishopMissileExplode")
|
||||
END_DEFAULTS
|
||||
|
||||
int ABishopFX::DoSpecialDamage (AActor *target, int damage)
|
||||
{ // Bishops are just too nasty
|
||||
return damage >> 1;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_BishopAttack
|
||||
|
@ -264,7 +54,7 @@ void A_BishopAttack2 (AActor *actor)
|
|||
actor->SetState (actor->SeeState);
|
||||
return;
|
||||
}
|
||||
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ABishopFX));
|
||||
mo = P_SpawnMissile (actor, actor->target, PClass::FindClass("BishopFX"));
|
||||
if (mo != NULL)
|
||||
{
|
||||
mo->tracer = actor->target;
|
||||
|
@ -302,17 +92,6 @@ void A_BishopMissileWeave (AActor *actor)
|
|||
actor->special2 = weaveZ + (weaveXY<<16);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_BishopMissileSeek
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_BishopMissileSeek (AActor *actor)
|
||||
{
|
||||
P_SeekerMissile (actor, ANGLE_1*2, ANGLE_1*3);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_BishopDecide
|
||||
|
@ -327,7 +106,7 @@ void A_BishopDecide (AActor *actor)
|
|||
}
|
||||
else
|
||||
{
|
||||
actor->SetState (&ABishop::States[S_BISHOP_BLUR]);
|
||||
actor->SetState (actor->FindState ("Blur"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,7 +157,7 @@ void A_BishopSpawnBlur (AActor *actor)
|
|||
actor->SetState (actor->MissileState);
|
||||
}
|
||||
}
|
||||
mo = Spawn<ABishopBlur> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
mo = Spawn ("BishopBlur", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
mo->angle = actor->angle;
|
||||
|
@ -408,7 +187,7 @@ void A_BishopPuff (AActor *actor)
|
|||
{
|
||||
AActor *mo;
|
||||
|
||||
mo = Spawn<ABishopPuff> (actor->x, actor->y, actor->z + 40*FRACUNIT, ALLOW_REPLACE);
|
||||
mo = Spawn ("BishopPuff", actor->x, actor->y, actor->z + 40*FRACUNIT, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
mo->momz = FRACUNIT/2;
|
||||
|
@ -427,27 +206,15 @@ void A_BishopPainBlur (AActor *actor)
|
|||
|
||||
if (pr_pain() < 64)
|
||||
{
|
||||
actor->SetState (&ABishop::States[S_BISHOP_BLUR]);
|
||||
actor->SetState (actor->FindState ("Blur"));
|
||||
return;
|
||||
}
|
||||
fixed_t x = actor->x + (pr_pain.Random2()<<12);
|
||||
fixed_t y = actor->y + (pr_pain.Random2()<<12);
|
||||
fixed_t z = actor->z + (pr_pain.Random2()<<11);
|
||||
mo = Spawn<ABishopPainBlur> (x, y, z, ALLOW_REPLACE);
|
||||
mo = Spawn ("BishopPainBlur", x, y, z, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
mo->angle = actor->angle;
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// A_SetAltShadow
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void A_SetAltShadow (AActor *actor)
|
||||
{
|
||||
actor->alpha = HX_ALTSHADOW;
|
||||
actor->RenderStyle = STYLE_Translucent;
|
||||
}
|
||||
|
|
|
@ -14,64 +14,14 @@
|
|||
|
||||
class AArtiBlastRadius : public AInventory
|
||||
{
|
||||
DECLARE_ACTOR (AArtiBlastRadius, AInventory)
|
||||
DECLARE_CLASS (AArtiBlastRadius, AInventory)
|
||||
public:
|
||||
bool Use (bool pickup);
|
||||
protected:
|
||||
void BlastActor (AActor *victim, fixed_t strength);
|
||||
};
|
||||
FState AArtiBlastRadius::States[] =
|
||||
{
|
||||
S_BRIGHT (BLST, 'A', 4, NULL , &States[1]),
|
||||
S_BRIGHT (BLST, 'B', 4, NULL , &States[2]),
|
||||
S_BRIGHT (BLST, 'C', 4, NULL , &States[3]),
|
||||
S_BRIGHT (BLST, 'D', 4, NULL , &States[4]),
|
||||
S_BRIGHT (BLST, 'E', 4, NULL , &States[5]),
|
||||
S_BRIGHT (BLST, 'F', 4, NULL , &States[6]),
|
||||
S_BRIGHT (BLST, 'G', 4, NULL , &States[7]),
|
||||
S_BRIGHT (BLST, 'H', 4, NULL , &States[0]),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AArtiBlastRadius, Hexen, 10110, 74)
|
||||
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 ("ARTIBLST")
|
||||
PROP_Inventory_PickupSound ("misc/p_pkup")
|
||||
PROP_Inventory_PickupMessage("$TXT_ARTIBLASTRADIUS")
|
||||
END_DEFAULTS
|
||||
|
||||
// Blast Effect -------------------------------------------------------------
|
||||
|
||||
class ABlastEffect : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABlastEffect, AActor)
|
||||
};
|
||||
|
||||
FState ABlastEffect::States[] =
|
||||
{
|
||||
S_NORMAL (RADE, 'A', 4, NULL , &States[1]),
|
||||
S_NORMAL (RADE, 'B', 4, NULL , &States[2]),
|
||||
S_NORMAL (RADE, 'C', 4, NULL , &States[3]),
|
||||
S_NORMAL (RADE, 'D', 4, NULL , &States[4]),
|
||||
S_NORMAL (RADE, 'E', 4, NULL , &States[5]),
|
||||
S_NORMAL (RADE, 'F', 4, NULL , &States[6]),
|
||||
S_NORMAL (RADE, 'G', 4, NULL , &States[7]),
|
||||
S_NORMAL (RADE, 'H', 4, NULL , &States[8]),
|
||||
S_NORMAL (RADE, 'I', 4, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABlastEffect, Any, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP)
|
||||
PROP_Flags2 (MF2_NOTELEPORT)
|
||||
PROP_RenderStyle (STYLE_Translucent)
|
||||
PROP_Alpha (TRANSLUC66)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
IMPLEMENT_CLASS (AArtiBlastRadius)
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
|
@ -182,7 +132,7 @@ void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength)
|
|||
x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]);
|
||||
y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]);
|
||||
z = victim->z - victim->floorclip + (victim->height>>1);
|
||||
mo = Spawn<ABlastEffect> (x, y, z, ALLOW_REPLACE);
|
||||
mo = Spawn ("BlastEffect", x, y, z, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
mo->momx = victim->momx;
|
||||
|
|
|
@ -10,35 +10,12 @@
|
|||
|
||||
class AArtiBoostArmor : public AInventory
|
||||
{
|
||||
DECLARE_ACTOR (AArtiBoostArmor, AInventory)
|
||||
DECLARE_CLASS (AArtiBoostArmor, AInventory)
|
||||
public:
|
||||
bool Use (bool pickup);
|
||||
};
|
||||
|
||||
FState AArtiBoostArmor::States[] =
|
||||
{
|
||||
#define S_ARTI_ARMOR1 0
|
||||
S_BRIGHT (BRAC, 'A', 4, NULL , &States[1]),
|
||||
S_BRIGHT (BRAC, 'B', 4, NULL , &States[2]),
|
||||
S_BRIGHT (BRAC, 'C', 4, NULL , &States[3]),
|
||||
S_BRIGHT (BRAC, 'D', 4, NULL , &States[4]),
|
||||
S_BRIGHT (BRAC, 'E', 4, NULL , &States[5]),
|
||||
S_BRIGHT (BRAC, 'F', 4, NULL , &States[6]),
|
||||
S_BRIGHT (BRAC, 'G', 4, NULL , &States[7]),
|
||||
S_BRIGHT (BRAC, 'H', 4, NULL , &States[0]),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AArtiBoostArmor, Hexen, 8041, 22)
|
||||
PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
|
||||
PROP_Flags2 (MF2_FLOATBOB)
|
||||
PROP_SpawnState (0)
|
||||
PROP_Inventory_DefMaxAmount
|
||||
PROP_Inventory_PickupFlash (1)
|
||||
PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND)
|
||||
PROP_Inventory_Icon ("ARTIBRAC")
|
||||
PROP_Inventory_PickupSound ("misc/p_pkup")
|
||||
PROP_Inventory_PickupMessage("$TXT_ARTIBOOSTARMOR")
|
||||
END_DEFAULTS
|
||||
IMPLEMENT_CLASS (AArtiBoostArmor)
|
||||
|
||||
bool AArtiBoostArmor::Use (bool pickup)
|
||||
{
|
||||
|
|
|
@ -1,138 +0,0 @@
|
|||
#include "actor.h"
|
||||
#include "info.h"
|
||||
#include "p_local.h"
|
||||
#include "s_sound.h"
|
||||
#include "p_enemy.h"
|
||||
#include "a_action.h"
|
||||
#include "m_random.h"
|
||||
|
||||
void A_ClericAttack (AActor *);
|
||||
void A_ClericBurnScream (AActor *);
|
||||
|
||||
// Cleric Boss (Traductus) --------------------------------------------------
|
||||
|
||||
class AClericBoss : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AClericBoss, AActor)
|
||||
};
|
||||
|
||||
FState AClericBoss::States[] =
|
||||
{
|
||||
#define S_CLERIC 0
|
||||
S_NORMAL (CLER, 'A', 2, NULL , &States[S_CLERIC+1]),
|
||||
S_NORMAL (CLER, 'A', 3, A_ClassBossHealth , &States[S_CLERIC+2]),
|
||||
S_NORMAL (CLER, 'A', 5, A_Look , &States[S_CLERIC+2]),
|
||||
|
||||
#define S_CLERIC_RUN1 (S_CLERIC+3)
|
||||
S_NORMAL (CLER, 'A', 4, A_FastChase , &States[S_CLERIC_RUN1+1]),
|
||||
S_NORMAL (CLER, 'B', 4, A_FastChase , &States[S_CLERIC_RUN1+2]),
|
||||
S_NORMAL (CLER, 'C', 4, A_FastChase , &States[S_CLERIC_RUN1+3]),
|
||||
S_NORMAL (CLER, 'D', 4, A_FastChase , &States[S_CLERIC_RUN1]),
|
||||
|
||||
#define S_CLERIC_PAIN (S_CLERIC_RUN1+4)
|
||||
S_NORMAL (CLER, 'H', 4, NULL , &States[S_CLERIC_PAIN+1]),
|
||||
S_NORMAL (CLER, 'H', 4, A_Pain , &States[S_CLERIC_RUN1]),
|
||||
|
||||
#define S_CLERIC_ATK1 (S_CLERIC_PAIN+2)
|
||||
S_NORMAL (CLER, 'E', 8, A_FaceTarget , &States[S_CLERIC_ATK1+1]),
|
||||
S_NORMAL (CLER, 'F', 8, A_FaceTarget , &States[S_CLERIC_ATK1+2]),
|
||||
S_NORMAL (CLER, 'G', 10, A_ClericAttack , &States[S_CLERIC_RUN1]),
|
||||
|
||||
#define S_CLERIC_DIE1 (S_CLERIC_ATK1+3)
|
||||
S_NORMAL (CLER, 'I', 6, NULL , &States[S_CLERIC_DIE1+1]),
|
||||
S_NORMAL (CLER, 'K', 6, A_Scream , &States[S_CLERIC_DIE1+2]),
|
||||
S_NORMAL (CLER, 'L', 6, NULL , &States[S_CLERIC_DIE1+3]),
|
||||
S_NORMAL (CLER, 'L', 6, NULL , &States[S_CLERIC_DIE1+4]),
|
||||
S_NORMAL (CLER, 'M', 6, A_NoBlocking , &States[S_CLERIC_DIE1+5]),
|
||||
S_NORMAL (CLER, 'N', 6, NULL , &States[S_CLERIC_DIE1+6]),
|
||||
S_NORMAL (CLER, 'O', 6, NULL , &States[S_CLERIC_DIE1+7]),
|
||||
S_NORMAL (CLER, 'P', 6, NULL , &States[S_CLERIC_DIE1+8]),
|
||||
S_NORMAL (CLER, 'Q', -1, NULL , NULL),
|
||||
|
||||
#define S_CLERIC_XDIE1 (S_CLERIC_DIE1+9)
|
||||
S_NORMAL (CLER, 'R', 5, A_Scream , &States[S_CLERIC_XDIE1+1]),
|
||||
S_NORMAL (CLER, 'S', 5, NULL , &States[S_CLERIC_XDIE1+2]),
|
||||
S_NORMAL (CLER, 'T', 5, A_NoBlocking , &States[S_CLERIC_XDIE1+3]),
|
||||
S_NORMAL (CLER, 'U', 5, NULL , &States[S_CLERIC_XDIE1+4]),
|
||||
S_NORMAL (CLER, 'V', 5, NULL , &States[S_CLERIC_XDIE1+5]),
|
||||
S_NORMAL (CLER, 'W', 5, NULL , &States[S_CLERIC_XDIE1+6]),
|
||||
S_NORMAL (CLER, 'X', 5, NULL , &States[S_CLERIC_XDIE1+7]),
|
||||
S_NORMAL (CLER, 'Y', 5, NULL , &States[S_CLERIC_XDIE1+8]),
|
||||
S_NORMAL (CLER, 'Z', 5, NULL , &States[S_CLERIC_XDIE1+9]),
|
||||
S_NORMAL (CLER, '[', -1, NULL , NULL),
|
||||
|
||||
#define S_CLERIC_ICE (S_CLERIC_XDIE1+10)
|
||||
S_NORMAL (CLER, '\\', 5, A_FreezeDeath , &States[S_CLERIC_ICE+1]),
|
||||
S_NORMAL (CLER, '\\', 1, A_FreezeDeathChunks , &States[S_CLERIC_ICE+1]),
|
||||
|
||||
#define S_CLERIC_BURN (S_CLERIC_ICE+2)
|
||||
S_BRIGHT (FDTH, 'C', 5, A_ClericBurnScream , &States[S_CLERIC_BURN+1]),
|
||||
S_BRIGHT (FDTH, 'D', 4, NULL , &States[S_CLERIC_BURN+2]),
|
||||
S_BRIGHT (FDTH, 'G', 5, NULL , &States[S_CLERIC_BURN+3]),
|
||||
S_BRIGHT (FDTH, 'H', 4, A_Scream , &States[S_CLERIC_BURN+4]),
|
||||
S_BRIGHT (FDTH, 'I', 5, NULL , &States[S_CLERIC_BURN+5]),
|
||||
S_BRIGHT (FDTH, 'J', 4, NULL , &States[S_CLERIC_BURN+6]),
|
||||
S_BRIGHT (FDTH, 'K', 5, NULL , &States[S_CLERIC_BURN+7]),
|
||||
S_BRIGHT (FDTH, 'L', 4, NULL , &States[S_CLERIC_BURN+8]),
|
||||
S_BRIGHT (FDTH, 'M', 5, NULL , &States[S_CLERIC_BURN+9]),
|
||||
S_BRIGHT (FDTH, 'N', 4, NULL , &States[S_CLERIC_BURN+10]),
|
||||
S_BRIGHT (FDTH, 'O', 5, NULL , &States[S_CLERIC_BURN+11]),
|
||||
S_BRIGHT (FDTH, 'P', 4, NULL , &States[S_CLERIC_BURN+12]),
|
||||
S_BRIGHT (FDTH, 'Q', 5, NULL , &States[S_CLERIC_BURN+13]),
|
||||
S_BRIGHT (FDTH, 'R', 4, NULL , &States[S_CLERIC_BURN+14]),
|
||||
S_BRIGHT (FDTH, 'S', 5, A_NoBlocking , &States[S_CLERIC_BURN+15]),
|
||||
S_BRIGHT (FDTH, 'T', 4, NULL , &States[S_CLERIC_BURN+16]),
|
||||
S_BRIGHT (FDTH, 'U', 5, NULL , &States[S_CLERIC_BURN+17]),
|
||||
S_BRIGHT (FDTH, 'V', 4, NULL , NULL),
|
||||
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AClericBoss, Hexen, 10101, 0)
|
||||
PROP_SpawnHealth (800)
|
||||
PROP_PainChance (50)
|
||||
PROP_SpeedFixed (25)
|
||||
PROP_RadiusFixed (16)
|
||||
PROP_HeightFixed (64)
|
||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
||||
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
|
||||
PROP_Flags3 (MF3_DONTMORPH)
|
||||
|
||||
PROP_SpawnState (S_CLERIC)
|
||||
PROP_SeeState (S_CLERIC_RUN1)
|
||||
PROP_PainState (S_CLERIC_PAIN)
|
||||
PROP_MeleeState (S_CLERIC_ATK1)
|
||||
PROP_MissileState (S_CLERIC_ATK1)
|
||||
PROP_DeathState (S_CLERIC_DIE1)
|
||||
PROP_XDeathState (S_CLERIC_XDIE1)
|
||||
PROP_BDeathState (S_CLERIC_BURN)
|
||||
PROP_IDeathState (S_CLERIC_ICE)
|
||||
|
||||
PROP_PainSound ("PlayerClericPain")
|
||||
PROP_DeathSound ("PlayerClericCrazyDeath")
|
||||
PROP_Obituary ("$OB_CBOSS")
|
||||
END_DEFAULTS
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_ClericAttack
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_ClericAttack (AActor *actor)
|
||||
{
|
||||
extern void A_CHolyAttack3 (AActor *actor);
|
||||
|
||||
if (!actor->target) return;
|
||||
A_CHolyAttack3 (actor);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_ClericBurnScream
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_ClericBurnScream (AActor *actor)
|
||||
{
|
||||
S_Sound (actor, CHAN_BODY, "PlayerClericBurnDeath", 1, ATTN_NORM);
|
||||
}
|
|
@ -22,270 +22,17 @@ void A_CFlameRotate (AActor *);
|
|||
void A_CFlamePuff (AActor *);
|
||||
void A_CFlameMissile (AActor *);
|
||||
|
||||
// The Cleric's Flame Strike ------------------------------------------------
|
||||
|
||||
class ACWeapFlame : public AClericWeapon
|
||||
{
|
||||
DECLARE_ACTOR (ACWeapFlame, AClericWeapon)
|
||||
};
|
||||
|
||||
FState ACWeapFlame::States[] =
|
||||
{
|
||||
#define S_CFLAME1 0
|
||||
S_BRIGHT (WCFM, 'A', 4, NULL , &States[S_CFLAME1+1]),
|
||||
S_BRIGHT (WCFM, 'B', 4, NULL , &States[S_CFLAME1+2]),
|
||||
S_BRIGHT (WCFM, 'C', 4, NULL , &States[S_CFLAME1+3]),
|
||||
S_BRIGHT (WCFM, 'D', 4, NULL , &States[S_CFLAME1+4]),
|
||||
S_BRIGHT (WCFM, 'E', 4, NULL , &States[S_CFLAME1+5]),
|
||||
S_BRIGHT (WCFM, 'F', 4, NULL , &States[S_CFLAME1+6]),
|
||||
S_BRIGHT (WCFM, 'G', 4, NULL , &States[S_CFLAME1+7]),
|
||||
S_BRIGHT (WCFM, 'H', 4, NULL , &States[S_CFLAME1]),
|
||||
|
||||
#define S_CFLAMEREADY (S_CFLAME1+8)
|
||||
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+1]),
|
||||
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+2]),
|
||||
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+3]),
|
||||
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+4]),
|
||||
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+5]),
|
||||
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+6]),
|
||||
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+7]),
|
||||
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+8]),
|
||||
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+9]),
|
||||
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+10]),
|
||||
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+11]),
|
||||
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY]),
|
||||
|
||||
#define S_CFLAMEDOWN (S_CFLAMEREADY+12)
|
||||
S_NORMAL (CFLM, 'A', 1, A_Lower , &States[S_CFLAMEDOWN]),
|
||||
|
||||
#define S_CFLAMEUP (S_CFLAMEDOWN+1)
|
||||
S_NORMAL (CFLM, 'A', 1, A_Raise , &States[S_CFLAMEUP]),
|
||||
|
||||
#define S_CFLAMEATK (S_CFLAMEUP+1)
|
||||
S_NORMAL2 (CFLM, 'A', 2, NULL , &States[S_CFLAMEATK+1], 0, 40),
|
||||
S_NORMAL2 (CFLM, 'D', 2, NULL , &States[S_CFLAMEATK+2], 0, 50),
|
||||
S_NORMAL2 (CFLM, 'D', 2, NULL , &States[S_CFLAMEATK+3], 0, 36),
|
||||
S_BRIGHT (CFLM, 'E', 4, NULL , &States[S_CFLAMEATK+4]),
|
||||
S_BRIGHT (CFLM, 'F', 4, A_CFlameAttack , &States[S_CFLAMEATK+5]),
|
||||
S_BRIGHT (CFLM, 'E', 4, NULL , &States[S_CFLAMEATK+6]),
|
||||
S_NORMAL2 (CFLM, 'G', 2, NULL , &States[S_CFLAMEATK+7], 0, 40),
|
||||
S_NORMAL (CFLM, 'G', 2, NULL , &States[S_CFLAMEREADY]),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ACWeapFlame, Hexen, 8009, 0)
|
||||
PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
|
||||
PROP_SpawnState (S_CFLAME1)
|
||||
|
||||
PROP_Weapon_SelectionOrder (1000)
|
||||
PROP_Weapon_AmmoUse1 (4)
|
||||
PROP_Weapon_AmmoGive1 (25)
|
||||
PROP_Weapon_UpState (S_CFLAMEUP)
|
||||
PROP_Weapon_DownState (S_CFLAMEDOWN)
|
||||
PROP_Weapon_ReadyState (S_CFLAMEREADY)
|
||||
PROP_Weapon_AtkState (S_CFLAMEATK)
|
||||
PROP_Weapon_Kickback (150)
|
||||
PROP_Weapon_YAdjust (10)
|
||||
PROP_Weapon_MoveCombatDist (27000000)
|
||||
PROP_Weapon_AmmoType1 ("Mana2")
|
||||
PROP_Weapon_ProjectileType ("CFlameMissile")
|
||||
PROP_Inventory_PickupMessage("$TXT_WEAPON_C3")
|
||||
END_DEFAULTS
|
||||
|
||||
// Floor Flame --------------------------------------------------------------
|
||||
|
||||
class ACFlameFloor : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ACFlameFloor, AActor)
|
||||
};
|
||||
|
||||
FState ACFlameFloor::States[] =
|
||||
{
|
||||
S_BRIGHT (CFFX, 'N', 5, NULL , &States[1]),
|
||||
S_BRIGHT (CFFX, 'O', 4, NULL , &States[2]),
|
||||
S_BRIGHT (CFFX, 'P', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ACFlameFloor, Hexen, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Add)
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
// Flame Puff ---------------------------------------------------------------
|
||||
|
||||
class AFlamePuff : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AFlamePuff, AActor)
|
||||
};
|
||||
|
||||
FState AFlamePuff::States[] =
|
||||
{
|
||||
S_BRIGHT (CFFX, 'A', 3, NULL , &States[1]),
|
||||
S_BRIGHT (CFFX, 'B', 3, NULL , &States[2]),
|
||||
S_BRIGHT (CFFX, 'C', 3, NULL , &States[3]),
|
||||
S_BRIGHT (CFFX, 'D', 4, NULL , &States[4]),
|
||||
S_BRIGHT (CFFX, 'E', 3, NULL , &States[5]),
|
||||
S_BRIGHT (CFFX, 'F', 4, NULL , &States[6]),
|
||||
S_BRIGHT (CFFX, 'G', 3, NULL , &States[7]),
|
||||
S_BRIGHT (CFFX, 'H', 4, NULL , &States[8]),
|
||||
S_BRIGHT (CFFX, 'I', 3, NULL , &States[9]),
|
||||
S_BRIGHT (CFFX, 'J', 4, NULL , &States[10]),
|
||||
S_BRIGHT (CFFX, 'K', 3, NULL , &States[11]),
|
||||
S_BRIGHT (CFFX, 'L', 4, NULL , &States[12]),
|
||||
S_BRIGHT (CFFX, 'M', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AFlamePuff, Hexen, -1, 0)
|
||||
PROP_RadiusFixed (1)
|
||||
PROP_HeightFixed (1)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Add)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
|
||||
PROP_SeeSound ("ClericFlameExplode")
|
||||
PROP_AttackSound ("ClericFlameExplode")
|
||||
END_DEFAULTS
|
||||
|
||||
// Flame Puff 2 -------------------------------------------------------------
|
||||
|
||||
class AFlamePuff2 : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AFlamePuff2, AActor)
|
||||
};
|
||||
|
||||
FState AFlamePuff2::States[] =
|
||||
{
|
||||
S_BRIGHT (CFFX, 'A', 3, NULL , &States[1]),
|
||||
S_BRIGHT (CFFX, 'B', 3, NULL , &States[2]),
|
||||
S_BRIGHT (CFFX, 'C', 3, NULL , &States[3]),
|
||||
S_BRIGHT (CFFX, 'D', 4, NULL , &States[4]),
|
||||
S_BRIGHT (CFFX, 'E', 3, NULL , &States[5]),
|
||||
S_BRIGHT (CFFX, 'F', 4, NULL , &States[6]),
|
||||
S_BRIGHT (CFFX, 'G', 3, NULL , &States[7]),
|
||||
S_BRIGHT (CFFX, 'H', 4, NULL , &States[8]),
|
||||
S_BRIGHT (CFFX, 'I', 3, NULL , &States[9]),
|
||||
S_BRIGHT (CFFX, 'C', 3, NULL , &States[10]),
|
||||
S_BRIGHT (CFFX, 'D', 4, NULL , &States[11]),
|
||||
S_BRIGHT (CFFX, 'E', 3, NULL , &States[12]),
|
||||
S_BRIGHT (CFFX, 'F', 4, NULL , &States[13]),
|
||||
S_BRIGHT (CFFX, 'G', 3, NULL , &States[14]),
|
||||
S_BRIGHT (CFFX, 'H', 4, NULL , &States[15]),
|
||||
S_BRIGHT (CFFX, 'I', 3, NULL , &States[16]),
|
||||
S_BRIGHT (CFFX, 'J', 4, NULL , &States[17]),
|
||||
S_BRIGHT (CFFX, 'K', 3, NULL , &States[18]),
|
||||
S_BRIGHT (CFFX, 'L', 4, NULL , &States[19]),
|
||||
S_BRIGHT (CFFX, 'M', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AFlamePuff2, Hexen, -1, 0)
|
||||
PROP_RadiusFixed (1)
|
||||
PROP_HeightFixed (1)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_RenderStyle (STYLE_Add)
|
||||
|
||||
PROP_SpawnState (0)
|
||||
|
||||
PROP_SeeSound ("ClericFlameExplode")
|
||||
PROP_AttackSound ("ClericFlameExplode")
|
||||
END_DEFAULTS
|
||||
|
||||
// Circle Flame -------------------------------------------------------------
|
||||
|
||||
class ACircleFlame : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ACircleFlame, AActor)
|
||||
public:
|
||||
void GetExplodeParms (int &damage, int &dist, bool &hurtSource);
|
||||
};
|
||||
|
||||
FState ACircleFlame::States[] =
|
||||
{
|
||||
#define S_CIRCLE_FLAME1 0
|
||||
S_BRIGHT (CFCF, 'A', 4, NULL , &States[S_CIRCLE_FLAME1+1]),
|
||||
S_BRIGHT (CFCF, 'B', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+2]),
|
||||
S_BRIGHT (CFCF, 'C', 2, NULL , &States[S_CIRCLE_FLAME1+3]),
|
||||
S_BRIGHT (CFCF, 'D', 1, NULL , &States[S_CIRCLE_FLAME1+4]),
|
||||
S_BRIGHT (CFCF, 'E', 2, NULL , &States[S_CIRCLE_FLAME1+5]),
|
||||
S_BRIGHT (CFCF, 'F', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+6]),
|
||||
S_BRIGHT (CFCF, 'G', 1, NULL , &States[S_CIRCLE_FLAME1+7]),
|
||||
S_BRIGHT (CFCF, 'H', 2, NULL , &States[S_CIRCLE_FLAME1+8]),
|
||||
S_BRIGHT (CFCF, 'I', 2, NULL , &States[S_CIRCLE_FLAME1+9]),
|
||||
S_BRIGHT (CFCF, 'J', 1, A_CFlameRotate , &States[S_CIRCLE_FLAME1+10]),
|
||||
S_BRIGHT (CFCF, 'K', 2, NULL , &States[S_CIRCLE_FLAME1+11]),
|
||||
S_BRIGHT (CFCF, 'L', 3, NULL , &States[S_CIRCLE_FLAME1+12]),
|
||||
S_BRIGHT (CFCF, 'M', 3, NULL , &States[S_CIRCLE_FLAME1+13]),
|
||||
S_BRIGHT (CFCF, 'N', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+14]),
|
||||
S_BRIGHT (CFCF, 'O', 3, NULL , &States[S_CIRCLE_FLAME1+15]),
|
||||
S_BRIGHT (CFCF, 'P', 2, NULL , NULL),
|
||||
|
||||
#define S_CIRCLE_FLAME_X1 (S_CIRCLE_FLAME1+16)
|
||||
S_BRIGHT (CFCF, 'Q', 3, NULL , &States[S_CIRCLE_FLAME_X1+1]),
|
||||
S_BRIGHT (CFCF, 'R', 3, NULL , &States[S_CIRCLE_FLAME_X1+2]),
|
||||
S_BRIGHT (CFCF, 'S', 3, A_Explode , &States[S_CIRCLE_FLAME_X1+3]),
|
||||
S_BRIGHT (CFCF, 'T', 3, NULL , &States[S_CIRCLE_FLAME_X1+4]),
|
||||
S_BRIGHT (CFCF, 'U', 3, NULL , &States[S_CIRCLE_FLAME_X1+5]),
|
||||
S_BRIGHT (CFCF, 'V', 3, NULL , &States[S_CIRCLE_FLAME_X1+6]),
|
||||
S_BRIGHT (CFCF, 'W', 3, NULL , &States[S_CIRCLE_FLAME_X1+7]),
|
||||
S_BRIGHT (CFCF, 'X', 3, NULL , &States[S_CIRCLE_FLAME_X1+8]),
|
||||
S_BRIGHT (CFCF, 'Y', 3, NULL , &States[S_CIRCLE_FLAME_X1+9]),
|
||||
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ACircleFlame, Hexen, -1, 0)
|
||||
PROP_RadiusFixed (6)
|
||||
PROP_Damage (2)
|
||||
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_CIRCLE_FLAME1)
|
||||
PROP_DeathState (S_CIRCLE_FLAME_X1)
|
||||
|
||||
PROP_DeathSound ("ClericFlameCircle")
|
||||
END_DEFAULTS
|
||||
|
||||
void ACircleFlame::GetExplodeParms (int &damage, int &dist, bool &hurtSource)
|
||||
{
|
||||
damage = 20;
|
||||
hurtSource = false;
|
||||
}
|
||||
|
||||
// Flame Missile ------------------------------------------------------------
|
||||
|
||||
class ACFlameMissile : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ACFlameMissile, AActor)
|
||||
DECLARE_CLASS (ACFlameMissile, AActor)
|
||||
public:
|
||||
void BeginPlay ();
|
||||
void Tick ();
|
||||
};
|
||||
|
||||
FState ACFlameMissile::States[] =
|
||||
{
|
||||
#define S_CFLAME_MISSILE1 0
|
||||
S_BRIGHT (CFFX, 'A', 4, NULL , &States[S_CFLAME_MISSILE1+1]),
|
||||
S_NORMAL (CFFX, 'A', 1, A_CFlamePuff , &AFlamePuff::States[0]),
|
||||
|
||||
#define S_CFLAME_MISSILE_X (S_CFLAME_MISSILE1+2)
|
||||
S_BRIGHT (CFFX, 'A', 1, A_CFlameMissile , &AFlamePuff::States[0]),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ACFlameMissile, Hexen, -1, 0)
|
||||
PROP_SpeedFixed (200)
|
||||
PROP_RadiusFixed (14)
|
||||
PROP_HeightFixed (8)
|
||||
PROP_Damage (8)
|
||||
PROP_DamageType (NAME_Fire)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
|
||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
|
||||
PROP_RenderFlags (RF_INVISIBLE)
|
||||
PROP_RenderStyle (STYLE_Add)
|
||||
|
||||
PROP_SpawnState (S_CFLAME_MISSILE1)
|
||||
PROP_DeathState (S_CFLAME_MISSILE_X)
|
||||
END_DEFAULTS
|
||||
IMPLEMENT_CLASS (ACFlameMissile)
|
||||
|
||||
void ACFlameMissile::BeginPlay ()
|
||||
{
|
||||
|
@ -347,7 +94,7 @@ void ACFlameMissile::Tick ()
|
|||
{
|
||||
newz = floorz;
|
||||
}
|
||||
mo = Spawn<ACFlameFloor> (x, y, newz, ALLOW_REPLACE);
|
||||
mo = Spawn ("CFlameFloor", x, y, newz, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
mo->angle = angle;
|
||||
|
@ -432,7 +179,7 @@ void A_CFlameMissile (AActor *actor)
|
|||
{
|
||||
an = (i*ANG45)>>ANGLETOFINESHIFT;
|
||||
an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT;
|
||||
mo = Spawn<ACircleFlame> (BlockingMobj->x+FixedMul(dist, finecosine[an]),
|
||||
mo = Spawn ("CircleFlame", BlockingMobj->x+FixedMul(dist, finecosine[an]),
|
||||
BlockingMobj->y+FixedMul(dist, finesine[an]),
|
||||
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
|
@ -443,7 +190,7 @@ void A_CFlameMissile (AActor *actor)
|
|||
mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);
|
||||
mo->tics -= pr_missile()&3;
|
||||
}
|
||||
mo = Spawn<ACircleFlame> (BlockingMobj->x-FixedMul(dist, finecosine[an]),
|
||||
mo = Spawn ("CircleFlame", BlockingMobj->x-FixedMul(dist, finecosine[an]),
|
||||
BlockingMobj->y-FixedMul(dist, finesine[an]),
|
||||
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
||||
if(mo)
|
||||
|
@ -455,7 +202,7 @@ void A_CFlameMissile (AActor *actor)
|
|||
mo->tics -= pr_missile()&3;
|
||||
}
|
||||
}
|
||||
actor->SetState (&AFlamePuff2::States[0]);
|
||||
actor->SetState (actor->SpawnState);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -913,3 +913,18 @@ void A_DropWraithvergePieces (AActor *actor)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_ClericAttack
|
||||
// (for the ClericBoss)
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_ClericAttack (AActor *actor)
|
||||
{
|
||||
extern void A_CHolyAttack3 (AActor *actor);
|
||||
|
||||
if (!actor->target) return;
|
||||
A_CHolyAttack3 (actor);
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
#include "actor.h"
|
||||
#include "info.h"
|
||||
#include "p_local.h"
|
||||
#include "s_sound.h"
|
||||
#include "p_enemy.h"
|
||||
#include "a_action.h"
|
||||
#include "m_random.h"
|
||||
|
||||
void A_FighterAttack (AActor *);
|
||||
void A_FighterBurnScream (AActor *);
|
||||
|
||||
// Fighter Boss (Zedek) -----------------------------------------------------
|
||||
|
||||
class AFighterBoss : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AFighterBoss, AActor)
|
||||
};
|
||||
|
||||
FState AFighterBoss::States[] =
|
||||
{
|
||||
#define S_FIGHTER 0
|
||||
S_NORMAL (PLAY, 'A', 2, NULL , &States[S_FIGHTER+1]),
|
||||
S_NORMAL (PLAY, 'A', 3, A_ClassBossHealth , &States[S_FIGHTER+2]),
|
||||
S_NORMAL (PLAY, 'A', 5, A_Look , &States[S_FIGHTER+2]),
|
||||
|
||||
#define S_FIGHTER_RUN1 (S_FIGHTER+3)
|
||||
S_NORMAL (PLAY, 'A', 4, A_FastChase , &States[S_FIGHTER_RUN1+1]),
|
||||
S_NORMAL (PLAY, 'B', 4, A_FastChase , &States[S_FIGHTER_RUN1+2]),
|
||||
S_NORMAL (PLAY, 'C', 4, A_FastChase , &States[S_FIGHTER_RUN1+3]),
|
||||
S_NORMAL (PLAY, 'D', 4, A_FastChase , &States[S_FIGHTER_RUN1]),
|
||||
|
||||
#define S_FIGHTER_PAIN (S_FIGHTER_RUN1+4)
|
||||
S_NORMAL (PLAY, 'G', 4, NULL , &States[S_FIGHTER_PAIN+1]),
|
||||
S_NORMAL (PLAY, 'G', 4, A_Pain , &States[S_FIGHTER_RUN1]),
|
||||
|
||||
#define S_FIGHTER_ATK1 (S_FIGHTER_PAIN+2)
|
||||
S_NORMAL (PLAY, 'E', 8, A_FaceTarget , &States[S_FIGHTER_ATK1+1]),
|
||||
S_NORMAL (PLAY, 'F', 8, A_FighterAttack , &States[S_FIGHTER_RUN1]),
|
||||
|
||||
#define S_FIGHTER_DIE1 (S_FIGHTER_ATK1+2)
|
||||
S_NORMAL (PLAY, 'H', 6, NULL , &States[S_FIGHTER_DIE1+1]),
|
||||
S_NORMAL (PLAY, 'I', 6, A_Scream , &States[S_FIGHTER_DIE1+2]),
|
||||
S_NORMAL (PLAY, 'J', 6, NULL , &States[S_FIGHTER_DIE1+3]),
|
||||
S_NORMAL (PLAY, 'K', 6, NULL , &States[S_FIGHTER_DIE1+4]),
|
||||
S_NORMAL (PLAY, 'L', 6, A_NoBlocking , &States[S_FIGHTER_DIE1+5]),
|
||||
S_NORMAL (PLAY, 'M', 6, NULL , &States[S_FIGHTER_DIE1+6]),
|
||||
S_NORMAL (PLAY, 'N', -1, NULL , NULL),
|
||||
|
||||
#define S_FIGHTER_XDIE1 (S_FIGHTER_DIE1+7)
|
||||
S_NORMAL (PLAY, 'O', 5, A_Scream , &States[S_FIGHTER_XDIE1+1]),
|
||||
S_NORMAL (PLAY, 'P', 5, A_SkullPop , &States[S_FIGHTER_XDIE1+2]),
|
||||
S_NORMAL (PLAY, 'R', 5, A_NoBlocking , &States[S_FIGHTER_XDIE1+3]),
|
||||
S_NORMAL (PLAY, 'S', 5, NULL , &States[S_FIGHTER_XDIE1+4]),
|
||||
S_NORMAL (PLAY, 'T', 5, NULL , &States[S_FIGHTER_XDIE1+5]),
|
||||
S_NORMAL (PLAY, 'U', 5, NULL , &States[S_FIGHTER_XDIE1+6]),
|
||||
S_NORMAL (PLAY, 'V', 5, NULL , &States[S_FIGHTER_XDIE1+7]),
|
||||
S_NORMAL (PLAY, 'W', -1, NULL , NULL),
|
||||
|
||||
#define S_FIGHTER_ICE (S_FIGHTER_XDIE1+8)
|
||||
S_NORMAL (PLAY, 'X', 5, A_FreezeDeath , &States[S_FIGHTER_ICE+1]),
|
||||
S_NORMAL (PLAY, 'X', 1, A_FreezeDeathChunks , &States[S_FIGHTER_ICE+1]),
|
||||
|
||||
#define S_FIGHTER_BURN (S_FIGHTER_ICE+2)
|
||||
S_BRIGHT (FDTH, 'A', 5, A_FighterBurnScream , &States[S_FIGHTER_BURN+1]),
|
||||
S_BRIGHT (FDTH, 'B', 4, NULL , &States[S_FIGHTER_BURN+2]),
|
||||
S_BRIGHT (FDTH, 'G', 5, NULL , &States[S_FIGHTER_BURN+3]),
|
||||
S_BRIGHT (FDTH, 'H', 4, A_Scream , &States[S_FIGHTER_BURN+4]),
|
||||
S_BRIGHT (FDTH, 'I', 5, NULL , &States[S_FIGHTER_BURN+5]),
|
||||
S_BRIGHT (FDTH, 'J', 4, NULL , &States[S_FIGHTER_BURN+6]),
|
||||
S_BRIGHT (FDTH, 'K', 5, NULL , &States[S_FIGHTER_BURN+7]),
|
||||
S_BRIGHT (FDTH, 'L', 4, NULL , &States[S_FIGHTER_BURN+8]),
|
||||
S_BRIGHT (FDTH, 'M', 5, NULL , &States[S_FIGHTER_BURN+9]),
|
||||
S_BRIGHT (FDTH, 'N', 4, NULL , &States[S_FIGHTER_BURN+10]),
|
||||
S_BRIGHT (FDTH, 'O', 5, NULL , &States[S_FIGHTER_BURN+11]),
|
||||
S_BRIGHT (FDTH, 'P', 4, NULL , &States[S_FIGHTER_BURN+12]),
|
||||
S_BRIGHT (FDTH, 'Q', 5, NULL , &States[S_FIGHTER_BURN+13]),
|
||||
S_BRIGHT (FDTH, 'R', 4, NULL , &States[S_FIGHTER_BURN+14]),
|
||||
S_BRIGHT (FDTH, 'S', 5, A_NoBlocking , &States[S_FIGHTER_BURN+15]),
|
||||
S_BRIGHT (FDTH, 'T', 4, NULL , &States[S_FIGHTER_BURN+16]),
|
||||
S_BRIGHT (FDTH, 'U', 5, NULL , &States[S_FIGHTER_BURN+17]),
|
||||
S_BRIGHT (FDTH, 'V', 4, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AFighterBoss, Hexen, 10100, 0)
|
||||
PROP_SpawnHealth (800)
|
||||
PROP_PainChance (50)
|
||||
PROP_SpeedFixed (25)
|
||||
PROP_RadiusFixed (16)
|
||||
PROP_HeightFixed (64)
|
||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
||||
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
|
||||
PROP_Flags3 (MF3_DONTMORPH)
|
||||
|
||||
PROP_SpawnState (S_FIGHTER)
|
||||
PROP_SeeState (S_FIGHTER_RUN1)
|
||||
PROP_PainState (S_FIGHTER_PAIN)
|
||||
PROP_MeleeState (S_FIGHTER_ATK1)
|
||||
PROP_MissileState (S_FIGHTER_ATK1)
|
||||
PROP_DeathState (S_FIGHTER_DIE1)
|
||||
PROP_XDeathState (S_FIGHTER_XDIE1)
|
||||
PROP_IDeathState (S_FIGHTER_ICE)
|
||||
PROP_BDeathState (S_FIGHTER_BURN)
|
||||
|
||||
PROP_PainSound ("PlayerFighterPain")
|
||||
PROP_DeathSound ("PlayerFighterCrazyDeath")
|
||||
PROP_Obituary ("$OB_FBOSS")
|
||||
END_DEFAULTS
|
||||
|
||||
void A_FighterAttack (AActor *actor)
|
||||
{
|
||||
extern void A_FSwordAttack2 (AActor *actor);
|
||||
|
||||
if (!actor->target) return;
|
||||
A_FSwordAttack2 (actor);
|
||||
}
|
||||
|
||||
void A_FighterBurnScream (AActor *actor)
|
||||
{
|
||||
S_Sound (actor, CHAN_BODY, "PlayerFighterBurnDeath", 1, ATTN_NORM);
|
||||
}
|
|
@ -325,24 +325,6 @@ void A_FSwordAttack (AActor *actor)
|
|||
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_FSwordAttack2
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_FSwordAttack2 (AActor *actor)
|
||||
{
|
||||
angle_t angle = actor->angle;
|
||||
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/4, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/8, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/8, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/4, 0);
|
||||
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_FSwordFlames
|
||||
|
@ -397,3 +379,24 @@ void AFighterWeaponPiece::BeginPlay ()
|
|||
Super::BeginPlay ();
|
||||
FourthWeaponClass = RUNTIME_CLASS(AFWeapQuietus);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_FighterAttack
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_FighterAttack (AActor *actor)
|
||||
{
|
||||
if (!actor->target) return;
|
||||
|
||||
angle_t angle = actor->angle;
|
||||
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/4, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/8, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/8, 0);
|
||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/4, 0);
|
||||
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,30 +21,6 @@ void A_PoisonBagCheck (AActor *);
|
|||
void A_CheckThrowBomb (AActor *);
|
||||
void A_CheckThrowBomb2 (AActor *);
|
||||
|
||||
// Poison Bag (Flechette used by Cleric) ------------------------------------
|
||||
|
||||
class APoisonBag : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (APoisonBag, AActor)
|
||||
};
|
||||
|
||||
FState APoisonBag::States[] =
|
||||
{
|
||||
#define S_POISONBAG1 0
|
||||
S_BRIGHT (PSBG, 'A', 18, NULL , &States[S_POISONBAG1+1]),
|
||||
S_BRIGHT (PSBG, 'B', 4, NULL , &States[S_POISONBAG1+2]),
|
||||
S_NORMAL (PSBG, 'C', 3, NULL , &States[S_POISONBAG1+3]),
|
||||
S_NORMAL (PSBG, 'C', 1, A_PoisonBagInit , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (APoisonBag, Hexen, -1, 0)
|
||||
PROP_RadiusFixed (5)
|
||||
PROP_HeightFixed (5)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
|
||||
PROP_SpawnState (S_POISONBAG1)
|
||||
END_DEFAULTS
|
||||
|
||||
// Fire Bomb (Flechette used by Mage) ---------------------------------------
|
||||
|
||||
class AFireBomb : public AActor
|
||||
|
@ -86,58 +62,6 @@ IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0)
|
|||
PROP_DeathSound ("FlechetteExplode")
|
||||
END_DEFAULTS
|
||||
|
||||
// Throwing Bomb (Flechette used by Fighter) --------------------------------
|
||||
|
||||
class AThrowingBomb : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AThrowingBomb, AActor)
|
||||
};
|
||||
|
||||
FState AThrowingBomb::States[] =
|
||||
{
|
||||
#define S_THROWINGBOMB1 0
|
||||
S_NORMAL (THRW, 'A', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB1+1]),
|
||||
S_NORMAL (THRW, 'B', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+2]),
|
||||
S_NORMAL (THRW, 'C', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+3]),
|
||||
S_NORMAL (THRW, 'D', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+4]),
|
||||
S_NORMAL (THRW, 'E', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+5]),
|
||||
S_NORMAL (THRW, 'F', 3, A_CheckThrowBomb2 , &States[S_THROWINGBOMB1]),
|
||||
|
||||
#define S_THROWINGBOMB7 (S_THROWINGBOMB1+6)
|
||||
S_NORMAL (THRW, 'G', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+1]),
|
||||
S_NORMAL (THRW, 'F', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB7+2]),
|
||||
S_NORMAL (THRW, 'H', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+3]),
|
||||
S_NORMAL (THRW, 'F', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB7+4]),
|
||||
S_NORMAL (THRW, 'G', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+5]),
|
||||
S_NORMAL (THRW, 'F', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB7+5]),
|
||||
|
||||
#define S_THROWINGBOMB_X1 (S_THROWINGBOMB7+6)
|
||||
S_BRIGHT (CFCF, 'Q', 4, A_NoGravity , &States[S_THROWINGBOMB_X1+1]),
|
||||
S_BRIGHT (CFCF, 'R', 3, A_Scream , &States[S_THROWINGBOMB_X1+2]),
|
||||
S_BRIGHT (CFCF, 'S', 4, A_Explode , &States[S_THROWINGBOMB_X1+3]),
|
||||
S_BRIGHT (CFCF, 'T', 3, NULL , &States[S_THROWINGBOMB_X1+4]),
|
||||
S_BRIGHT (CFCF, 'U', 4, NULL , &States[S_THROWINGBOMB_X1+5]),
|
||||
S_BRIGHT (CFCF, 'W', 3, NULL , &States[S_THROWINGBOMB_X1+6]),
|
||||
S_BRIGHT (CFCF, 'X', 4, NULL , &States[S_THROWINGBOMB_X1+7]),
|
||||
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AThrowingBomb, Hexen, -1, 0)
|
||||
PROP_SpawnHealth (48)
|
||||
PROP_SpeedFixed (12)
|
||||
PROP_RadiusFixed (8)
|
||||
PROP_HeightFixed (10)
|
||||
PROP_DamageType (NAME_Fire)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
|
||||
PROP_Flags2 (MF2_HEXENBOUNCE)
|
||||
|
||||
PROP_SpawnState (S_THROWINGBOMB1)
|
||||
PROP_DeathState (S_THROWINGBOMB_X1)
|
||||
|
||||
PROP_SeeSound ("FlechetteBounce")
|
||||
PROP_DeathSound ("FlechetteExplode")
|
||||
END_DEFAULTS
|
||||
|
||||
// Poison Bag Artifact (Flechette) ------------------------------------------
|
||||
|
||||
class AArtiPoisonBag : public AInventory
|
||||
|
@ -184,7 +108,7 @@ bool AArtiPoisonBag1::Use (bool pickup)
|
|||
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
|
||||
AActor *mo;
|
||||
|
||||
mo = Spawn<APoisonBag> (
|
||||
mo = Spawn ("PoisonBag",
|
||||
Owner->x+16*finecosine[angle],
|
||||
Owner->y+24*finesine[angle], Owner->z-
|
||||
Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
|
||||
|
@ -243,7 +167,7 @@ bool AArtiPoisonBag3::Use (bool pickup)
|
|||
{
|
||||
AActor *mo;
|
||||
|
||||
mo = Spawn<AThrowingBomb> (Owner->x, Owner->y,
|
||||
mo = Spawn ("ThrowingBomb", Owner->x, Owner->y,
|
||||
Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0), ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
|
@ -547,7 +471,7 @@ void A_CheckThrowBomb2 (AActor *actor)
|
|||
TMulScale32 (actor->momx, actor->momx, actor->momy, actor->momy, actor->momz, actor->momz)
|
||||
< (3*3)/(2*2))
|
||||
{
|
||||
actor->SetState (&AThrowingBomb::States[S_THROWINGBOMB7]);
|
||||
actor->SetState (actor->SpawnState + 6);
|
||||
actor->z = actor->floorz;
|
||||
actor->momz = 0;
|
||||
actor->flags2 &= ~MF2_BOUNCETYPE;
|
||||
|
|
|
@ -1284,7 +1284,7 @@ void A_SorcFX2Orbit (AActor *actor)
|
|||
void A_SpawnBishop(AActor *actor)
|
||||
{
|
||||
AActor *mo;
|
||||
mo = Spawn<ABishop> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
mo = Spawn("Bishop", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
if (!P_TestMobjLocation(mo))
|
||||
|
|
|
@ -19,13 +19,6 @@ public:
|
|||
void BeginPlay ();
|
||||
};
|
||||
|
||||
class ABishop : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABishop, AActor)
|
||||
public:
|
||||
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
|
||||
};
|
||||
|
||||
class AHeresiarch : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AHeresiarch, AActor)
|
||||
|
|
|
@ -1,134 +0,0 @@
|
|||
#include "actor.h"
|
||||
#include "info.h"
|
||||
#include "p_local.h"
|
||||
#include "s_sound.h"
|
||||
#include "p_enemy.h"
|
||||
#include "a_action.h"
|
||||
|
||||
void A_MageAttack (AActor *);
|
||||
void A_MageBurnScream (AActor *);
|
||||
|
||||
// Mage Boss (Menelkir) -----------------------------------------------------
|
||||
|
||||
class AMageBoss : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AMageBoss, AActor)
|
||||
};
|
||||
|
||||
FState AMageBoss::States[] =
|
||||
{
|
||||
#define S_MAGE 0
|
||||
S_NORMAL (MAGE, 'A', 2, NULL , &States[S_MAGE+1]),
|
||||
S_NORMAL (MAGE, 'A', 3, A_ClassBossHealth , &States[S_MAGE+2]),
|
||||
S_NORMAL (MAGE, 'A', 5, A_Look , &States[S_MAGE+2]),
|
||||
|
||||
#define S_MAGE_RUN1 (S_MAGE+3)
|
||||
S_NORMAL (MAGE, 'A', 4, A_FastChase , &States[S_MAGE_RUN1+1]),
|
||||
S_NORMAL (MAGE, 'B', 4, A_FastChase , &States[S_MAGE_RUN1+2]),
|
||||
S_NORMAL (MAGE, 'C', 4, A_FastChase , &States[S_MAGE_RUN1+3]),
|
||||
S_NORMAL (MAGE, 'D', 4, A_FastChase , &States[S_MAGE_RUN1]),
|
||||
|
||||
#define S_MAGE_PAIN (S_MAGE_RUN1+4)
|
||||
S_NORMAL (MAGE, 'G', 4, NULL , &States[S_MAGE_PAIN+1]),
|
||||
S_NORMAL (MAGE, 'G', 4, A_Pain , &States[S_MAGE_RUN1]),
|
||||
|
||||
#define S_MAGE_ATK1 (S_MAGE_PAIN+2)
|
||||
S_NORMAL (MAGE, 'E', 8, A_FaceTarget , &States[S_MAGE_ATK1+1]),
|
||||
S_BRIGHT (MAGE, 'F', 8, A_MageAttack , &States[S_MAGE_RUN1]),
|
||||
|
||||
#define S_MAGE_DIE1 (S_MAGE_ATK1+2)
|
||||
S_NORMAL (MAGE, 'H', 6, NULL , &States[S_MAGE_DIE1+1]),
|
||||
S_NORMAL (MAGE, 'I', 6, A_Scream , &States[S_MAGE_DIE1+2]),
|
||||
S_NORMAL (MAGE, 'J', 6, NULL , &States[S_MAGE_DIE1+3]),
|
||||
S_NORMAL (MAGE, 'K', 6, NULL , &States[S_MAGE_DIE1+4]),
|
||||
S_NORMAL (MAGE, 'L', 6, A_NoBlocking , &States[S_MAGE_DIE1+5]),
|
||||
S_NORMAL (MAGE, 'M', 6, NULL , &States[S_MAGE_DIE1+6]),
|
||||
S_NORMAL (MAGE, 'N', -1, NULL , NULL),
|
||||
|
||||
#define S_MAGE_XDIE1 (S_MAGE_DIE1+7)
|
||||
S_NORMAL (MAGE, 'O', 5, A_Scream , &States[S_MAGE_XDIE1+1]),
|
||||
S_NORMAL (MAGE, 'P', 5, NULL , &States[S_MAGE_XDIE1+2]),
|
||||
S_NORMAL (MAGE, 'R', 5, A_NoBlocking , &States[S_MAGE_XDIE1+3]),
|
||||
S_NORMAL (MAGE, 'S', 5, NULL , &States[S_MAGE_XDIE1+4]),
|
||||
S_NORMAL (MAGE, 'T', 5, NULL , &States[S_MAGE_XDIE1+5]),
|
||||
S_NORMAL (MAGE, 'U', 5, NULL , &States[S_MAGE_XDIE1+6]),
|
||||
S_NORMAL (MAGE, 'V', 5, NULL , &States[S_MAGE_XDIE1+7]),
|
||||
S_NORMAL (MAGE, 'W', 5, NULL , &States[S_MAGE_XDIE1+8]),
|
||||
S_NORMAL (MAGE, 'X', -1, NULL , NULL),
|
||||
|
||||
#define S_MAGE_ICE (S_MAGE_XDIE1+9)
|
||||
S_NORMAL (MAGE, 'Y', 5, A_FreezeDeath , &States[S_MAGE_ICE+1]),
|
||||
S_NORMAL (MAGE, 'Y', 1, A_FreezeDeathChunks , &States[S_MAGE_ICE+1]),
|
||||
|
||||
#define S_MAGE_BURN (S_MAGE_ICE+2)
|
||||
S_BRIGHT (FDTH, 'E', 5, A_MageBurnScream , &States[S_MAGE_BURN+1]),
|
||||
S_BRIGHT (FDTH, 'F', 4, NULL , &States[S_MAGE_BURN+2]),
|
||||
S_BRIGHT (FDTH, 'G', 5, NULL , &States[S_MAGE_BURN+3]),
|
||||
S_BRIGHT (FDTH, 'H', 4, A_Scream , &States[S_MAGE_BURN+4]),
|
||||
S_BRIGHT (FDTH, 'I', 5, NULL , &States[S_MAGE_BURN+5]),
|
||||
S_BRIGHT (FDTH, 'J', 4, NULL , &States[S_MAGE_BURN+6]),
|
||||
S_BRIGHT (FDTH, 'K', 5, NULL , &States[S_MAGE_BURN+7]),
|
||||
S_BRIGHT (FDTH, 'L', 4, NULL , &States[S_MAGE_BURN+8]),
|
||||
S_BRIGHT (FDTH, 'M', 5, NULL , &States[S_MAGE_BURN+9]),
|
||||
S_BRIGHT (FDTH, 'N', 4, NULL , &States[S_MAGE_BURN+10]),
|
||||
S_BRIGHT (FDTH, 'O', 5, NULL , &States[S_MAGE_BURN+11]),
|
||||
S_BRIGHT (FDTH, 'P', 4, NULL , &States[S_MAGE_BURN+12]),
|
||||
S_BRIGHT (FDTH, 'Q', 5, NULL , &States[S_MAGE_BURN+13]),
|
||||
S_BRIGHT (FDTH, 'R', 4, NULL , &States[S_MAGE_BURN+14]),
|
||||
S_BRIGHT (FDTH, 'S', 5, A_NoBlocking , &States[S_MAGE_BURN+15]),
|
||||
S_BRIGHT (FDTH, 'T', 4, NULL , &States[S_MAGE_BURN+16]),
|
||||
S_BRIGHT (FDTH, 'U', 5, NULL , &States[S_MAGE_BURN+17]),
|
||||
S_BRIGHT (FDTH, 'V', 4, NULL , NULL),
|
||||
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMageBoss, Hexen, 10102, 0)
|
||||
PROP_SpawnHealth (800)
|
||||
PROP_PainChance (50)
|
||||
PROP_SpeedFixed (25)
|
||||
PROP_RadiusFixed (16)
|
||||
PROP_HeightFixed (64)
|
||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
||||
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
|
||||
PROP_Flags3 (MF3_DONTMORPH)
|
||||
|
||||
PROP_SpawnState (S_MAGE)
|
||||
PROP_SeeState (S_MAGE_RUN1)
|
||||
PROP_PainState (S_MAGE_PAIN)
|
||||
PROP_MeleeState (S_MAGE_ATK1)
|
||||
PROP_MissileState (S_MAGE_ATK1)
|
||||
PROP_DeathState (S_MAGE_DIE1)
|
||||
PROP_XDeathState (S_MAGE_XDIE1)
|
||||
PROP_IDeathState (S_MAGE_ICE)
|
||||
PROP_BDeathState (S_MAGE_BURN)
|
||||
|
||||
PROP_PainSound ("PlayerMagePain")
|
||||
PROP_DeathSound ("PlayerMageCrazyDeath")
|
||||
PROP_Obituary ("$OB_MBOSS")
|
||||
END_DEFAULTS
|
||||
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_MageAttack
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_MageAttack (AActor *actor)
|
||||
{
|
||||
extern void A_MStaffAttack2 (AActor *actor);
|
||||
|
||||
if (!actor->target) return;
|
||||
A_MStaffAttack2 (actor);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_MageBurnScream
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_MageBurnScream (AActor *actor)
|
||||
{
|
||||
S_Sound (actor, CHAN_BODY, "PlayerMageBurnDeath", 1, ATTN_NORM);
|
||||
}
|
|
@ -343,41 +343,6 @@ bool AMageStaffFX2::SpecialBlastHandling (AActor *source, fixed_t strength)
|
|||
|
||||
//============================================================================
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// MStaffSpawn2 - for use by mage class boss
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void MStaffSpawn2 (AActor *actor, angle_t angle)
|
||||
{
|
||||
AActor *mo;
|
||||
|
||||
mo = P_SpawnMissileAngleZ (actor, actor->z+40*FRACUNIT,
|
||||
RUNTIME_CLASS(AMageStaffFX2), angle, 0);
|
||||
if (mo)
|
||||
{
|
||||
mo->target = actor;
|
||||
mo->tracer = P_BlockmapSearch (mo, 10, FrontBlockCheck);
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_MStaffAttack2 - for use by mage class boss
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_MStaffAttack2 (AActor *actor)
|
||||
{
|
||||
angle_t angle;
|
||||
angle = actor->angle;
|
||||
MStaffSpawn2 (actor, angle);
|
||||
MStaffSpawn2 (actor, angle-ANGLE_1*5);
|
||||
MStaffSpawn2 (actor, angle+ANGLE_1*5);
|
||||
S_Sound (actor, CHAN_WEAPON, "MageStaffFire", 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// MStaffSpawn
|
||||
|
@ -534,3 +499,41 @@ static AActor *FrontBlockCheck (AActor *mo, int index)
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// MStaffSpawn2 - for use by mage class boss
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void MStaffSpawn2 (AActor *actor, angle_t angle)
|
||||
{
|
||||
AActor *mo;
|
||||
|
||||
mo = P_SpawnMissileAngleZ (actor, actor->z+40*FRACUNIT,
|
||||
RUNTIME_CLASS(AMageStaffFX2), angle, 0);
|
||||
if (mo)
|
||||
{
|
||||
mo->target = actor;
|
||||
mo->tracer = P_BlockmapSearch (mo, 10, FrontBlockCheck);
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// A_MStaffAttack2 - for use by mage class boss
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void A_MageAttack (AActor *actor)
|
||||
{
|
||||
if (!actor->target) return;
|
||||
|
||||
angle_t angle;
|
||||
angle = actor->angle;
|
||||
MStaffSpawn2 (actor, angle);
|
||||
MStaffSpawn2 (actor, angle-ANGLE_1*5);
|
||||
MStaffSpawn2 (actor, angle+ANGLE_1*5);
|
||||
S_Sound (actor, CHAN_WEAPON, "MageStaffFire", 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,70 +37,6 @@ IMPLEMENT_ACTOR (AArtiDarkServant, Hexen, 86, 16)
|
|||
PROP_Inventory_PickupMessage("$TXT_ARTISUMMON")
|
||||
END_DEFAULTS
|
||||
|
||||
// Summoning Doll -----------------------------------------------------------
|
||||
|
||||
class ASummoningDoll : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ASummoningDoll, AActor)
|
||||
};
|
||||
|
||||
FState ASummoningDoll::States[] =
|
||||
{
|
||||
#define S_SUMMON_FX1_1 0
|
||||
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX1_1]),
|
||||
|
||||
#define S_SUMMON_FX2_1 (S_SUMMON_FX1_1+1)
|
||||
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX2_1+1]),
|
||||
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX2_1+2]),
|
||||
S_NORMAL (SUMN, 'A', 4, A_Summon , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ASummoningDoll, Hexen, -1, 0)
|
||||
PROP_SpeedFixed (20)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
|
||||
PROP_Flags2 (MF2_NOTELEPORT)
|
||||
|
||||
PROP_SpawnState (S_SUMMON_FX1_1)
|
||||
PROP_DeathState (S_SUMMON_FX2_1)
|
||||
END_DEFAULTS
|
||||
|
||||
// Minotaur Smoke -----------------------------------------------------------
|
||||
|
||||
class AMinotaurSmoke : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AMinotaurSmoke, AActor)
|
||||
};
|
||||
|
||||
FState AMinotaurSmoke::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, 'K', 3, NULL , &States[11]),
|
||||
S_NORMAL (MNSM, 'L', 3, NULL , &States[12]),
|
||||
S_NORMAL (MNSM, 'M', 3, NULL , &States[13]),
|
||||
S_NORMAL (MNSM, 'N', 3, NULL , &States[14]),
|
||||
S_NORMAL (MNSM, 'O', 3, NULL , &States[15]),
|
||||
S_NORMAL (MNSM, 'P', 3, NULL , &States[16]),
|
||||
S_NORMAL (MNSM, 'Q', 3, NULL , NULL),
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AMinotaurSmoke, 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
|
||||
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
|
@ -110,7 +46,7 @@ END_DEFAULTS
|
|||
|
||||
bool AArtiDarkServant::Use (bool pickup)
|
||||
{
|
||||
AActor *mo = P_SpawnPlayerMissile (Owner, RUNTIME_CLASS(ASummoningDoll));
|
||||
AActor *mo = P_SpawnPlayerMissile (Owner, PClass::FindClass ("SummoningDoll"));
|
||||
if (mo)
|
||||
{
|
||||
mo->target = Owner;
|
||||
|
@ -158,7 +94,7 @@ void A_Summon (AActor *actor)
|
|||
}
|
||||
|
||||
// Make smoke puff
|
||||
Spawn<AMinotaurSmoke> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
Spawn ("MinotaurSmoke", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||
S_Sound (actor, CHAN_VOICE, mo->ActiveSound, 1, ATTN_NORM);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1802,11 +1802,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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -2,82 +2,59 @@
|
|||
#include "info.h"
|
||||
#include "gi.h"
|
||||
#include "m_random.h"
|
||||
#include "thingdef/thingdef.h"
|
||||
|
||||
static FRandom pr_orbit ("Orbit");
|
||||
|
||||
void A_BridgeOrbit (AActor *);
|
||||
void A_BridgeInit (AActor *);
|
||||
|
||||
// The Hexen (and Heretic) version of the bridge spawns extra floating
|
||||
// "balls" orbiting the bridge. The Doom version only shows the bridge
|
||||
// itself.
|
||||
// Custom bridge --------------------------------------------------------
|
||||
/*
|
||||
args[0]: Bridge radius, in mapunits
|
||||
args[1]: Bridge height, in mapunits
|
||||
args[2]: Amount of bridge balls (if 0: Doom bridge)
|
||||
args[3]: Rotation speed of bridge balls, in byte angle per seconds, sorta:
|
||||
Since an arg is only a byte, it can only go from 0 to 255, while ZDoom's
|
||||
BAM go from 0 to 65535. Plus, it needs to be able to go either way. So,
|
||||
up to 128, it goes counterclockwise; 129-255 is clockwise, substracting
|
||||
256 from it to get the angle. A few example values:
|
||||
0: Hexen default
|
||||
11: 15° / seconds
|
||||
21: 30° / seconds
|
||||
32: 45° / seconds
|
||||
64: 90° / seconds
|
||||
128: 180° / seconds
|
||||
192: -90° / seconds
|
||||
223: -45° / seconds
|
||||
233: -30° / seconds
|
||||
244: -15° / seconds
|
||||
This value only matters if args[2] is not zero.
|
||||
args[4]: Rotation radius of bridge balls, in bridge radius %.
|
||||
If 0, use Hexen default: ORBIT_RADIUS, regardless of bridge radius.
|
||||
This value only matters if args[2] is not zero.
|
||||
*/
|
||||
|
||||
// Bridge ball -------------------------------------------------------------
|
||||
|
||||
class ABridgeBall : public AActor
|
||||
class ACustomBridge : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABridgeBall, AActor)
|
||||
DECLARE_CLASS (ACustomBridge, AActor)
|
||||
public:
|
||||
void BeginPlay ();
|
||||
};
|
||||
|
||||
FState ABridgeBall::States[] =
|
||||
IMPLEMENT_CLASS(ACustomBridge)
|
||||
|
||||
void ACustomBridge::BeginPlay ()
|
||||
{
|
||||
S_NORMAL (TLGL, 'A', 2, NULL , &States[1]),
|
||||
S_NORMAL (TLGL, 'A', 1, A_BridgeOrbit , &States[1])
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABridgeBall, Any, -1, 0)
|
||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||
PROP_Flags2 (MF2_NOTELEPORT)
|
||||
PROP_SpawnState (0)
|
||||
END_DEFAULTS
|
||||
|
||||
// The bridge itself -------------------------------------------------------
|
||||
|
||||
class ABridge : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (ABridge, AActor)
|
||||
};
|
||||
|
||||
FState ABridge::States[] =
|
||||
{
|
||||
#define S_DBRIDGE 0
|
||||
S_BRIGHT (TLGL, 'A', 4, NULL , &States[S_DBRIDGE+1]),
|
||||
S_BRIGHT (TLGL, 'B', 4, NULL , &States[S_DBRIDGE+2]),
|
||||
S_BRIGHT (TLGL, 'C', 4, NULL , &States[S_DBRIDGE+3]),
|
||||
S_BRIGHT (TLGL, 'D', 4, NULL , &States[S_DBRIDGE+4]),
|
||||
S_BRIGHT (TLGL, 'E', 4, NULL , &States[S_DBRIDGE+0]),
|
||||
|
||||
#define S_BRIDGE (S_DBRIDGE+5)
|
||||
S_NORMAL (TLGL, 'A', 2, NULL , &States[S_BRIDGE+1]),
|
||||
S_NORMAL (TLGL, 'A', 2, A_BridgeInit , &States[S_BRIDGE+2]),
|
||||
S_NORMAL (TLGL, 'A', -1, NULL , NULL),
|
||||
|
||||
#define S_FREE_BRIDGE (S_BRIDGE+3)
|
||||
S_NORMAL (TLGL, 'A', 2, NULL , &States[S_FREE_BRIDGE+1]),
|
||||
S_NORMAL (TLGL, 'A', 300, NULL , NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (ABridge, Any, 118, 21)
|
||||
PROP_Flags (MF_SOLID|MF_NOGRAVITY|MF_NOLIFTDROP)
|
||||
END_DEFAULTS
|
||||
|
||||
AT_GAME_SET (Bridge)
|
||||
{
|
||||
ABridge *def = GetDefault<ABridge> ();
|
||||
|
||||
if (gameinfo.gametype == GAME_Doom)
|
||||
if (args[2]) // Hexen bridge if there are balls
|
||||
{
|
||||
def->SpawnState = &ABridge::States[S_DBRIDGE];
|
||||
def->radius = 36 * FRACUNIT;
|
||||
def->height = 4 * FRACUNIT;
|
||||
def->RenderStyle = STYLE_Normal;
|
||||
SetState(SeeState);
|
||||
radius = args[0] ? args[0] << FRACBITS : 32 * FRACUNIT;
|
||||
height = args[1] ? args[1] << FRACBITS : 2 * FRACUNIT;
|
||||
}
|
||||
else
|
||||
else // No balls? Then a Doom bridge.
|
||||
{
|
||||
def->SpawnState = &ABridge::States[S_BRIDGE];
|
||||
def->radius = 32 * FRACUNIT;
|
||||
def->height = 2 * FRACUNIT;
|
||||
def->RenderStyle = STYLE_None;
|
||||
radius = args[0] ? args[0] << FRACBITS : 36 * FRACUNIT;
|
||||
height = args[1] ? args[1] << FRACBITS : 4 * FRACUNIT;
|
||||
RenderStyle = STYLE_Normal;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,21 +77,47 @@ void A_BridgeOrbit (AActor *self)
|
|||
// independantly of a Bridge actor.
|
||||
return;
|
||||
}
|
||||
// Set default values
|
||||
// Every five tics, Hexen moved the ball 3/256th of a revolution.
|
||||
int rotationspeed = ANGLE_45/32*3/5;
|
||||
int rotationradius = ORBIT_RADIUS;
|
||||
// If the bridge is custom, set non-default values if any.
|
||||
|
||||
// Set angular speed; 1--128: counterclockwise rotation ~=1--180°; 129--255: clockwise rotation ~= 180--1°
|
||||
if (self->target->args[3] > 128) rotationspeed = ANGLE_45/32 * (self->target->args[3]-256) / TICRATE;
|
||||
else if (self->target->args[3] > 0) rotationspeed = ANGLE_45/32 * (self->target->args[3]) / TICRATE;
|
||||
// Set rotation radius
|
||||
if (self->target->args[4]) rotationradius = ((self->target->args[4] * self->target->radius) / (100 * FRACUNIT));
|
||||
|
||||
if (self->target->special1)
|
||||
{
|
||||
self->SetState (NULL);
|
||||
}
|
||||
// Every five tics, Hexen moved the ball 3/256th of a revolution.
|
||||
self->angle += ANGLE_45/32*3/5;
|
||||
self->x = self->target->x + ORBIT_RADIUS * finecosine[self->angle >> ANGLETOFINESHIFT];
|
||||
self->y = self->target->y + ORBIT_RADIUS * finesine[self->angle >> ANGLETOFINESHIFT];
|
||||
self->angle += rotationspeed;
|
||||
self->x = self->target->x + rotationradius * finecosine[self->angle >> ANGLETOFINESHIFT];
|
||||
self->y = self->target->y + rotationradius * finesine[self->angle >> ANGLETOFINESHIFT];
|
||||
self->z = self->target->z;
|
||||
}
|
||||
|
||||
|
||||
static const PClass *GetBallType()
|
||||
{
|
||||
const PClass *balltype = NULL;
|
||||
int index=CheckIndex(1, NULL);
|
||||
if (index>=0)
|
||||
{
|
||||
balltype = PClass::FindClass((ENamedName)StateParameters[index]);
|
||||
}
|
||||
if (balltype == NULL) balltype = PClass::FindClass("BridgeBall");
|
||||
return balltype;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void A_BridgeInit (AActor *self)
|
||||
{
|
||||
angle_t startangle;
|
||||
AActor *ball1, *ball2, *ball3;
|
||||
AActor *ball;
|
||||
fixed_t cx, cy, cz;
|
||||
|
||||
cx = self->x;
|
||||
|
@ -123,56 +126,37 @@ void A_BridgeInit (AActor *self)
|
|||
startangle = pr_orbit() << 24;
|
||||
self->special1 = 0;
|
||||
|
||||
// Spawn triad into world
|
||||
ball1 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
|
||||
ball1->angle = startangle;
|
||||
ball1->target = self;
|
||||
|
||||
ball2 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
|
||||
ball2->angle = startangle + ANGLE_45/32*85;
|
||||
ball2->target = self;
|
||||
|
||||
ball3 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
|
||||
ball3->angle = startangle + (angle_t)ANGLE_45/32*170;
|
||||
ball3->target = self;
|
||||
|
||||
A_BridgeOrbit (ball1);
|
||||
A_BridgeOrbit (ball2);
|
||||
A_BridgeOrbit (ball3);
|
||||
// Spawn triad into world -- may be more than a triad now.
|
||||
int ballcount = self->args[2]==0 ? 3 : self->args[2];
|
||||
const PClass *balltype = GetBallType();
|
||||
for (int i = 0; i < ballcount; i++)
|
||||
{
|
||||
ball = Spawn(balltype, cx, cy, cz, ALLOW_REPLACE);
|
||||
ball->angle = startangle + (ANGLE_45/32) * (256/ballcount) * i;
|
||||
ball->target = self;
|
||||
A_BridgeOrbit(ball);
|
||||
}
|
||||
}
|
||||
|
||||
/* never used
|
||||
void A_BridgeRemove (AActor *self)
|
||||
{
|
||||
self->special1 = true; // Removing the bridge
|
||||
self->flags &= ~MF_SOLID;
|
||||
self->SetState (&ABridge::States[S_FREE_BRIDGE]);
|
||||
}
|
||||
*/
|
||||
|
||||
// Invisible bridge --------------------------------------------------------
|
||||
|
||||
class AInvisibleBridge : public ABridge
|
||||
class AInvisibleBridge : public AActor
|
||||
{
|
||||
DECLARE_ACTOR (AInvisibleBridge, ABridge)
|
||||
DECLARE_CLASS (AInvisibleBridge, AActor)
|
||||
public:
|
||||
void BeginPlay ();
|
||||
void Tick ()
|
||||
{
|
||||
Super::Tick ();
|
||||
}
|
||||
};
|
||||
|
||||
FState AInvisibleBridge::States[] =
|
||||
{
|
||||
S_NORMAL (TNT1, 'A', -1, NULL, NULL)
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTOR (AInvisibleBridge, Any, 9990, 0)
|
||||
PROP_RenderStyle (STYLE_None)
|
||||
PROP_SpawnState (0)
|
||||
PROP_RadiusFixed (32)
|
||||
PROP_HeightFixed (4)
|
||||
PROP_Flags4 (MF4_ACTLIKEBRIDGE)
|
||||
END_DEFAULTS
|
||||
IMPLEMENT_CLASS(AInvisibleBridge)
|
||||
|
||||
void AInvisibleBridge::BeginPlay ()
|
||||
{
|
||||
|
@ -183,36 +167,3 @@ void AInvisibleBridge::BeginPlay ()
|
|||
height = args[1] << FRACBITS;
|
||||
}
|
||||
|
||||
// And some invisible bridges from Skull Tag -------------------------------
|
||||
|
||||
class AInvisibleBridge32 : public AInvisibleBridge
|
||||
{
|
||||
DECLARE_STATELESS_ACTOR (AInvisibleBridge32, AInvisibleBridge)
|
||||
};
|
||||
|
||||
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge32, Any, 5061, 0)
|
||||
PROP_RadiusFixed (32)
|
||||
PROP_HeightFixed (8)
|
||||
END_DEFAULTS
|
||||
|
||||
|
||||
class AInvisibleBridge16 : public AInvisibleBridge
|
||||
{
|
||||
DECLARE_STATELESS_ACTOR (AInvisibleBridge16, AInvisibleBridge)
|
||||
};
|
||||
|
||||
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge16, Any, 5064, 0)
|
||||
PROP_RadiusFixed (16)
|
||||
PROP_HeightFixed (8)
|
||||
END_DEFAULTS
|
||||
|
||||
|
||||
class AInvisibleBridge8 : public AInvisibleBridge
|
||||
{
|
||||
DECLARE_STATELESS_ACTOR (AInvisibleBridge8, AInvisibleBridge)
|
||||
};
|
||||
|
||||
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge8, Any, 5065, 0)
|
||||
PROP_RadiusFixed (8)
|
||||
PROP_HeightFixed (8)
|
||||
END_DEFAULTS
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "templates.h"
|
||||
#include "a_strifeglobal.h"
|
||||
#include "a_morph.h"
|
||||
#include "a_specialspot.h"
|
||||
|
||||
static FRandom pr_restore ("RestorePos");
|
||||
|
||||
|
@ -489,7 +490,7 @@ void AInventory::Tick ()
|
|||
void AInventory::Serialize (FArchive &arc)
|
||||
{
|
||||
Super::Serialize (arc);
|
||||
arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound;
|
||||
arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound << SpawnPointClass;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
|
@ -1168,6 +1169,18 @@ END_DEFAULTS
|
|||
|
||||
bool AInventory::DoRespawn ()
|
||||
{
|
||||
if (SpawnPointClass != NULL)
|
||||
{
|
||||
AActor *spot = NULL;
|
||||
DSpotState *state = DSpotState::GetSpotState();
|
||||
|
||||
if (state != NULL) spot = state->GetRandomSpot(SpawnPointClass);
|
||||
if (spot != NULL)
|
||||
{
|
||||
SetOrigin (spot->x, spot->y, spot->z);
|
||||
z = floorz;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,6 @@ public:
|
|||
virtual bool ShouldRespawn ();
|
||||
virtual bool ShouldStay ();
|
||||
virtual void Hide ();
|
||||
virtual bool DoRespawn ();
|
||||
virtual bool TryPickup (AActor *toucher);
|
||||
virtual void DoPickupSpecial (AActor *toucher);
|
||||
virtual bool SpecialDropAction (AActor *dropper);
|
||||
|
@ -127,6 +126,7 @@ public:
|
|||
virtual const char *PickupMessage ();
|
||||
virtual void PlayPickupSound (AActor *toucher);
|
||||
|
||||
bool DoRespawn ();
|
||||
AInventory *PrevItem(); // Returns the item preceding this one in the list.
|
||||
AInventory *PrevInv(); // Returns the previous item with IF_INVBAR set.
|
||||
AInventory *NextInv(); // Returns the next item with IF_INVBAR set.
|
||||
|
@ -137,6 +137,7 @@ public:
|
|||
int RespawnTics; // Tics from pickup time to respawn time
|
||||
FTextureID Icon; // Icon to show on status bar or HUD
|
||||
int DropTime; // Countdown after dropping
|
||||
const PClass *SpawnPointClass; // For respawning like Heretic's mace
|
||||
|
||||
DWORD ItemFlags;
|
||||
const PClass *PickupFlash; // actor to spawn as pickup flash
|
||||
|
|
|
@ -37,12 +37,14 @@
|
|||
#include "p_local.h"
|
||||
#include "statnums.h"
|
||||
#include "i_system.h"
|
||||
#include "thingdef/thingdef.h"
|
||||
|
||||
static FRandom pr_spot ("SpecialSpot");
|
||||
static FRandom pr_spawnmace ("SpawnMace");
|
||||
|
||||
|
||||
IMPLEMENT_CLASS(DSpotState)
|
||||
IMPLEMENT_ABSTRACT_ACTOR (ASpecialSpot)
|
||||
IMPLEMENT_CLASS (ASpecialSpot)
|
||||
TObjPtr<DSpotState> DSpotState::SpotState;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -146,6 +148,7 @@ struct FSpotList
|
|||
|
||||
ASpecialSpot *GetSpotWithMinDistance(fixed_t x, fixed_t y, fixed_t distance)
|
||||
{
|
||||
if (Spots.Size() == 0) return NULL;
|
||||
int i = pr_spot() % Spots.Size();
|
||||
int initial = i;
|
||||
|
||||
|
@ -166,7 +169,7 @@ struct FSpotList
|
|||
|
||||
ASpecialSpot *GetRandomSpot(bool onlyfirst)
|
||||
{
|
||||
if (!numcalls)
|
||||
if (Spots.Size() && !numcalls)
|
||||
{
|
||||
int i = pr_spot() % Spots.Size();
|
||||
numcalls++;
|
||||
|
@ -370,3 +373,65 @@ void ASpecialSpot::Destroy()
|
|||
if (state != NULL) state->RemoveSpot(this);
|
||||
Super::Destroy();
|
||||
}
|
||||
|
||||
// Mace spawn spot ----------------------------------------------------------
|
||||
|
||||
|
||||
// Every mace spawn spot will execute this action. The first one
|
||||
// will build a list of all mace spots in the level and spawn a
|
||||
// mace. The rest of the spots will do nothing.
|
||||
|
||||
void A_SpawnSingleItem (AActor *self)
|
||||
{
|
||||
AActor *spot = NULL;
|
||||
DSpotState *state = DSpotState::GetSpotState();
|
||||
|
||||
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_TYPE(self), true);
|
||||
if (spot == NULL) return;
|
||||
|
||||
int index=CheckIndex(4);
|
||||
if (index<0) return;
|
||||
|
||||
ENamedName SpawnType = (ENamedName)StateParameters[index];
|
||||
int fail_sp = EvalExpressionI (StateParameters[index+1], self);
|
||||
int fail_co = EvalExpressionI (StateParameters[index+2], self);
|
||||
int fail_dm = EvalExpressionI (StateParameters[index+3], self);
|
||||
|
||||
if (!multiplayer && pr_spawnmace() < fail_sp)
|
||||
{ // Sometimes doesn't show up if not in deathmatch
|
||||
return;
|
||||
}
|
||||
|
||||
if (multiplayer && !deathmatch && pr_spawnmace() < fail_co)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (deathmatch && pr_spawnmace() < fail_dm)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const PClass *cls = PClass::FindClass(SpawnType);
|
||||
if (cls == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AActor *spawned = Spawn(cls, self->x, self->y, self->z, ALLOW_REPLACE);
|
||||
|
||||
if (spawned)
|
||||
{
|
||||
spawned->SetOrigin (spot->x, spot->y, spot->z);
|
||||
spawned->z = spawned->floorz;
|
||||
// We want this to respawn.
|
||||
if (!(self->flags & MF_DROPPED))
|
||||
{
|
||||
spawned->flags &= ~MF_DROPPED;
|
||||
}
|
||||
if (spawned->IsKindOf(RUNTIME_CLASS(AInventory)))
|
||||
{
|
||||
static_cast<AInventory*>(spawned)->SpawnPointClass = RUNTIME_TYPE(self);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
class ASpecialSpot : public AActor
|
||||
{
|
||||
DECLARE_STATELESS_ACTOR (ASpecialSpot, AActor)
|
||||
DECLARE_CLASS (ASpecialSpot, AActor)
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ struct RenderContext
|
|||
void (APIENTRY * SetTextureMode) (int type);
|
||||
void (APIENTRY * ArrayPointer) (void * data, int stride);
|
||||
void (APIENTRY * PrintStartupLog) ();
|
||||
bool (APIENTRY * SetVSync) (int on);
|
||||
BOOL (APIENTRY * SetVSync) (int on);
|
||||
#ifndef unix
|
||||
bool (APIENTRY * InitHardware) (HWND, bool allowsoftware, bool nostencil, int multisample);
|
||||
void (APIENTRY * Shutdown) ();
|
||||
|
|
16
src/info.cpp
16
src/info.cpp
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
|
|
@ -387,7 +387,6 @@ struct FActorInfo
|
|||
static void StaticInit ();
|
||||
static void StaticGameSet ();
|
||||
static void StaticSetActorNums ();
|
||||
static void StaticSpeedSet ();
|
||||
|
||||
void BuildDefaults ();
|
||||
void ApplyDefaults (BYTE *defaults);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
struct MusPlayingInfo
|
||||
{
|
||||
FString name;
|
||||
void *handle;
|
||||
MusInfo *handle;
|
||||
int baseorder;
|
||||
bool loop;
|
||||
};
|
||||
|
@ -1838,8 +1838,10 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
|||
{
|
||||
if (order != mus_playing.baseorder)
|
||||
{
|
||||
mus_playing.baseorder =
|
||||
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
|
||||
if (mus_playing.handle->SetSubsong(order))
|
||||
{
|
||||
mus_playing.baseorder = order;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1862,7 +1864,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
|||
int lumpnum = -1;
|
||||
int offset = 0, length = 0;
|
||||
int device = MDEV_DEFAULT;
|
||||
void *handle = NULL;
|
||||
MusInfo *handle = NULL;
|
||||
|
||||
int *devp = MidiDevices.CheckKey(FName(musicname));
|
||||
if (devp != NULL) device = *devp;
|
||||
|
@ -1932,7 +1934,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
|||
{
|
||||
mus_playing.loop = looping;
|
||||
mus_playing.name = "";
|
||||
mus_playing.baseorder = 0;
|
||||
mus_playing.baseorder = order;
|
||||
LastSong = musicname;
|
||||
return true;
|
||||
}
|
||||
|
@ -1956,13 +1958,13 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
|||
|
||||
mus_playing.loop = looping;
|
||||
mus_playing.name = musicname;
|
||||
mus_playing.baseorder = 0;
|
||||
LastSong = "";
|
||||
|
||||
if (mus_playing.handle != 0)
|
||||
{ // play it
|
||||
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname));
|
||||
mus_playing.baseorder =
|
||||
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
|
||||
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname), order);
|
||||
mus_playing.baseorder = order;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -454,21 +454,16 @@ public:
|
|||
Volume = volume;
|
||||
}
|
||||
|
||||
// Sets the current order number for a MOD-type song, or the position in ms
|
||||
// for anything else.
|
||||
bool SetPosition(int pos)
|
||||
// Sets the position in ms.
|
||||
bool SetPosition(unsigned int ms_pos)
|
||||
{
|
||||
FMOD_SOUND_TYPE type;
|
||||
return FMOD_OK == Channel->setPosition(ms_pos, FMOD_TIMEUNIT_MS);
|
||||
}
|
||||
|
||||
if (FMOD_OK == Stream->getFormat(&type, NULL, NULL, NULL) &&
|
||||
(type == FMOD_SOUND_TYPE_IT ||
|
||||
type == FMOD_SOUND_TYPE_MOD ||
|
||||
type == FMOD_SOUND_TYPE_S3M ||
|
||||
type == FMOD_SOUND_TYPE_XM))
|
||||
{
|
||||
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MODORDER);
|
||||
}
|
||||
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MS);
|
||||
// Sets the order number for MOD formats.
|
||||
bool SetOrder(int order_pos)
|
||||
{
|
||||
return FMOD_OK == Channel->setPosition(order_pos, FMOD_TIMEUNIT_MODORDER);
|
||||
}
|
||||
|
||||
FString GetStats()
|
||||
|
|
|
@ -121,7 +121,12 @@ MusInfo::~MusInfo ()
|
|||
{
|
||||
}
|
||||
|
||||
bool MusInfo::SetPosition (int order)
|
||||
bool MusInfo::SetPosition (unsigned int ms)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MusInfo::SetSubsong (int subsong)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -197,7 +202,7 @@ void I_ShutdownMusic(void)
|
|||
}
|
||||
|
||||
|
||||
void I_PlaySong (void *handle, int _looping, float rel_vol)
|
||||
void I_PlaySong (void *handle, int _looping, float rel_vol, int subsong)
|
||||
{
|
||||
MusInfo *info = (MusInfo *)handle;
|
||||
|
||||
|
@ -206,7 +211,7 @@ void I_PlaySong (void *handle, int _looping, float rel_vol)
|
|||
|
||||
saved_relative_volume = relative_volume = rel_vol;
|
||||
info->Stop ();
|
||||
info->Play (_looping ? true : false);
|
||||
info->Play (!!_looping, subsong);
|
||||
info->m_NotStartedYet = false;
|
||||
|
||||
if (info->m_Status == MusInfo::STATE_Playing)
|
||||
|
@ -256,7 +261,7 @@ void I_UnRegisterSong (void *handle)
|
|||
}
|
||||
}
|
||||
|
||||
void *I_RegisterURLSong (const char *url)
|
||||
MusInfo *I_RegisterURLSong (const char *url)
|
||||
{
|
||||
StreamSong *song;
|
||||
|
||||
|
@ -269,7 +274,7 @@ void *I_RegisterURLSong (const char *url)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void *I_RegisterSong (const char *filename, char *musiccache, int offset, int len, int device)
|
||||
MusInfo *I_RegisterSong (const char *filename, char *musiccache, int offset, int len, int device)
|
||||
{
|
||||
FILE *file;
|
||||
MusInfo *info = NULL;
|
||||
|
@ -539,7 +544,7 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
|||
return info;
|
||||
}
|
||||
|
||||
void *I_RegisterCDSong (int track, int id)
|
||||
MusInfo *I_RegisterCDSong (int track, int id)
|
||||
{
|
||||
MusInfo *info = new CDSong (track, id);
|
||||
|
||||
|
@ -635,7 +640,7 @@ CCMD (writeopl)
|
|||
}
|
||||
else
|
||||
{
|
||||
dumper->Play(false);
|
||||
dumper->Play(false, 0); // FIXME: Remember subsong.
|
||||
delete dumper;
|
||||
}
|
||||
}
|
||||
|
@ -673,7 +678,7 @@ CCMD (writewave)
|
|||
}
|
||||
else
|
||||
{
|
||||
dumper->Play(false);
|
||||
dumper->Play(false, 0); // FIXME: Remember subsong
|
||||
delete dumper;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,14 +54,15 @@ void I_PauseSong (void *handle);
|
|||
void I_ResumeSong (void *handle);
|
||||
|
||||
// Registers a song handle to song data.
|
||||
void *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
|
||||
void *I_RegisterCDSong (int track, int cdid = 0);
|
||||
void *I_RegisterURLSong (const char *url);
|
||||
class MusInfo;
|
||||
MusInfo *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
|
||||
MusInfo *I_RegisterCDSong (int track, int cdid = 0);
|
||||
MusInfo *I_RegisterURLSong (const char *url);
|
||||
|
||||
// Called by anything that wishes to start music.
|
||||
// Plays a song, and when the song is done,
|
||||
// starts playing it again in an endless loop.
|
||||
void I_PlaySong (void *handle, int looping, float relative_vol=1.f);
|
||||
void I_PlaySong (void *handle, int looping, float relative_vol=1.f, int subsong=0);
|
||||
|
||||
// Stops a song.
|
||||
void I_StopSong (void *handle);
|
||||
|
@ -75,4 +76,38 @@ bool I_SetSongPosition (void *handle, int order);
|
|||
// Is the song still playing?
|
||||
bool I_QrySongPlaying (void *handle);
|
||||
|
||||
// The base music class. Everything is derived from this --------------------
|
||||
|
||||
class MusInfo
|
||||
{
|
||||
public:
|
||||
MusInfo ();
|
||||
virtual ~MusInfo ();
|
||||
virtual void MusicVolumeChanged(); // snd_musicvolume changed
|
||||
virtual void TimidityVolumeChanged(); // timidity_mastervolume changed
|
||||
virtual void Play (bool looping, int subsong) = 0;
|
||||
virtual void Pause () = 0;
|
||||
virtual void Resume () = 0;
|
||||
virtual void Stop () = 0;
|
||||
virtual bool IsPlaying () = 0;
|
||||
virtual bool IsMIDI () const = 0;
|
||||
virtual bool IsValid () const = 0;
|
||||
virtual bool SetPosition (unsigned int ms);
|
||||
virtual bool SetSubsong (int subsong);
|
||||
virtual void Update();
|
||||
virtual FString GetStats();
|
||||
virtual MusInfo *GetOPLDumper(const char *filename);
|
||||
virtual MusInfo *GetWaveDumper(const char *filename, int rate);
|
||||
|
||||
enum EState
|
||||
{
|
||||
STATE_Stopped,
|
||||
STATE_Playing,
|
||||
STATE_Paused
|
||||
} m_Status;
|
||||
bool m_Looping;
|
||||
bool m_NotStartedYet; // Song has been created but not yet played
|
||||
};
|
||||
|
||||
|
||||
#endif //__I_MUSIC_H__
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "c_cvars.h"
|
||||
#include "mus2midi.h"
|
||||
#include "i_sound.h"
|
||||
#include "i_music.h"
|
||||
|
||||
void I_InitMusicWin32 ();
|
||||
void I_ShutdownMusicWin32 ();
|
||||
|
@ -29,38 +30,6 @@ extern float relative_volume;
|
|||
EXTERN_CVAR (Float, timidity_mastervolume)
|
||||
|
||||
|
||||
// The base music class. Everything is derived from this --------------------
|
||||
|
||||
class MusInfo
|
||||
{
|
||||
public:
|
||||
MusInfo ();
|
||||
virtual ~MusInfo ();
|
||||
virtual void MusicVolumeChanged(); // snd_musicvolume changed
|
||||
virtual void TimidityVolumeChanged(); // timidity_mastervolume changed
|
||||
virtual void Play (bool looping) = 0;
|
||||
virtual void Pause () = 0;
|
||||
virtual void Resume () = 0;
|
||||
virtual void Stop () = 0;
|
||||
virtual bool IsPlaying () = 0;
|
||||
virtual bool IsMIDI () const = 0;
|
||||
virtual bool IsValid () const = 0;
|
||||
virtual bool SetPosition (int order);
|
||||
virtual void Update();
|
||||
virtual FString GetStats();
|
||||
virtual MusInfo *GetOPLDumper(const char *filename);
|
||||
virtual MusInfo *GetWaveDumper(const char *filename, int rate);
|
||||
|
||||
enum EState
|
||||
{
|
||||
STATE_Stopped,
|
||||
STATE_Playing,
|
||||
STATE_Paused
|
||||
} m_Status;
|
||||
bool m_Looping;
|
||||
bool m_NotStartedYet; // Song has been created but not yet played
|
||||
};
|
||||
|
||||
// A device that provides a WinMM-like MIDI streaming interface -------------
|
||||
|
||||
#ifndef _WIN32
|
||||
|
@ -302,7 +271,7 @@ public:
|
|||
|
||||
void MusicVolumeChanged();
|
||||
void TimidityVolumeChanged();
|
||||
void Play(bool looping);
|
||||
void Play(bool looping, int subsong);
|
||||
void Pause();
|
||||
void Resume();
|
||||
void Stop();
|
||||
|
@ -441,14 +410,15 @@ class StreamSong : public MusInfo
|
|||
public:
|
||||
StreamSong (const char *file, int offset, int length);
|
||||
~StreamSong ();
|
||||
void Play (bool looping);
|
||||
void Play (bool looping, int subsong);
|
||||
void Pause ();
|
||||
void Resume ();
|
||||
void Stop ();
|
||||
bool IsPlaying ();
|
||||
bool IsMIDI () const { return false; }
|
||||
bool IsValid () const { return m_Stream != NULL; }
|
||||
bool SetPosition (int order);
|
||||
bool SetPosition (unsigned int pos);
|
||||
bool SetSubsong (int subsong);
|
||||
FString GetStats();
|
||||
|
||||
protected:
|
||||
|
@ -464,7 +434,7 @@ class TimiditySong : public StreamSong
|
|||
public:
|
||||
TimiditySong (FILE *file, char * musiccache, int length);
|
||||
~TimiditySong ();
|
||||
void Play (bool looping);
|
||||
void Play (bool looping, int subsong);
|
||||
void Stop ();
|
||||
bool IsPlaying ();
|
||||
bool IsValid () const { return CommandLine.Len() > 0; }
|
||||
|
@ -502,7 +472,7 @@ class OPLMUSSong : public StreamSong
|
|||
public:
|
||||
OPLMUSSong (FILE *file, char *musiccache, int length);
|
||||
~OPLMUSSong ();
|
||||
void Play (bool looping);
|
||||
void Play (bool looping, int subsong);
|
||||
bool IsPlaying ();
|
||||
bool IsValid () const;
|
||||
void ResetChips ();
|
||||
|
@ -530,7 +500,7 @@ class CDSong : public MusInfo
|
|||
public:
|
||||
CDSong (int track, int id);
|
||||
~CDSong ();
|
||||
void Play (bool looping);
|
||||
void Play (bool looping, int subsong);
|
||||
void Pause ();
|
||||
void Resume ();
|
||||
void Stop ();
|
||||
|
|
|
@ -302,7 +302,12 @@ SoundStream::~SoundStream ()
|
|||
{
|
||||
}
|
||||
|
||||
bool SoundStream::SetPosition(int pos)
|
||||
bool SoundStream::SetPosition(unsigned int pos)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SoundStream::SetOrder(int order)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,8 @@ public:
|
|||
virtual bool SetPaused(bool paused) = 0;
|
||||
virtual unsigned int GetPosition() = 0;
|
||||
virtual bool IsEnded() = 0;
|
||||
virtual bool SetPosition(int pos);
|
||||
virtual bool SetPosition(unsigned int pos);
|
||||
virtual bool SetOrder(int order);
|
||||
virtual FString GetStats();
|
||||
};
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "i_musicinterns.h"
|
||||
#include "i_cd.h"
|
||||
|
||||
void CDSong::Play (bool looping)
|
||||
void CDSong::Play (bool looping, int subsong)
|
||||
{
|
||||
m_Status = STATE_Stopped;
|
||||
m_Looping = looping;
|
||||
|
|
|
@ -45,8 +45,9 @@ class input_mod : public StreamSong
|
|||
public:
|
||||
input_mod(DUH *myduh);
|
||||
~input_mod();
|
||||
bool SetPosition(int order);
|
||||
void Play(bool looping);
|
||||
//bool SetPosition(int ms);
|
||||
bool SetSubsong(int subsong);
|
||||
void Play(bool looping, int subsong);
|
||||
FString GetStats();
|
||||
|
||||
FString Codec;
|
||||
|
@ -1153,11 +1154,12 @@ input_mod::~input_mod()
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void input_mod::Play(bool looping)
|
||||
void input_mod::Play(bool looping, int order)
|
||||
{
|
||||
m_Status = STATE_Stopped;
|
||||
m_Looping = looping;
|
||||
|
||||
start_order = order;
|
||||
if (open2(0) && m_Stream->Play(m_Looping, 1))
|
||||
{
|
||||
m_Status = STATE_Playing;
|
||||
|
@ -1166,15 +1168,11 @@ void input_mod::Play(bool looping)
|
|||
|
||||
//==========================================================================
|
||||
//
|
||||
// input_mod :: SetPosition
|
||||
//
|
||||
// FIXME: Pass the order number as a subsong parameter to Play, so we don't
|
||||
// need to start playback at one position and then immediately throw that
|
||||
// playback structure away and create a new one to go to the new order.
|
||||
// input_mod :: SetSubsong
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
bool input_mod::SetPosition(int order)
|
||||
bool input_mod::SetSubsong(int order)
|
||||
{
|
||||
if (order == start_order)
|
||||
{
|
||||
|
|
|
@ -85,7 +85,7 @@ CUSTOM_CVAR (Int, timidity_frequency, 22050, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
|||
self = 65000;
|
||||
}
|
||||
|
||||
void TimiditySong::Play (bool looping)
|
||||
void TimiditySong::Play (bool looping, int subsong)
|
||||
{
|
||||
m_Status = STATE_Stopped;
|
||||
m_Looping = looping;
|
||||
|
|
|
@ -182,7 +182,7 @@ void MIDIStreamer::CheckCaps()
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void MIDIStreamer::Play(bool looping)
|
||||
void MIDIStreamer::Play(bool looping, int subsong)
|
||||
{
|
||||
DWORD tid;
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ bool OPLMUSSong::IsPlaying ()
|
|||
return m_Status == STATE_Playing;
|
||||
}
|
||||
|
||||
void OPLMUSSong::Play (bool looping)
|
||||
void OPLMUSSong::Play (bool looping, int subsong)
|
||||
{
|
||||
m_Status = STATE_Stopped;
|
||||
m_Looping = looping;
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
#include "i_musicinterns.h"
|
||||
|
||||
void StreamSong::Play (bool looping)
|
||||
void StreamSong::Play (bool looping, int subsong)
|
||||
{
|
||||
m_Status = STATE_Stopped;
|
||||
m_Looping = looping;
|
||||
|
||||
if (m_Stream->Play (m_Looping, 1))
|
||||
{
|
||||
if (subsong != 0)
|
||||
{
|
||||
m_Stream->SetOrder (subsong);
|
||||
}
|
||||
m_Status = STATE_Playing;
|
||||
}
|
||||
}
|
||||
|
@ -70,14 +74,25 @@ bool StreamSong::IsPlaying ()
|
|||
//
|
||||
// StreamSong :: SetPosition
|
||||
//
|
||||
// Sets the current order number for a MOD-type song, or the position in ms
|
||||
// for anything else.
|
||||
// Sets the position in ms.
|
||||
|
||||
bool StreamSong::SetPosition(int order)
|
||||
bool StreamSong::SetPosition(unsigned int pos)
|
||||
{
|
||||
if (m_Stream != NULL)
|
||||
{
|
||||
return m_Stream->SetPosition(order);
|
||||
return m_Stream->SetPosition(pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool StreamSong::SetSubsong(int subsong)
|
||||
{
|
||||
if (m_Stream != NULL)
|
||||
{
|
||||
return m_Stream->SetOrder(subsong);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
// This file was automatically generated by the
|
||||
// updaterevision tool. Do not edit by hand.
|
||||
|
||||
#define ZD_SVN_REVISION_STRING "1102"
|
||||
#define ZD_SVN_REVISION_NUMBER 1102
|
||||
#define ZD_SVN_REVISION_STRING "1109"
|
||||
#define ZD_SVN_REVISION_NUMBER 1109
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
// SAVESIG should match SAVEVER.
|
||||
|
||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||
#define MINSAVEVER 1076
|
||||
#define MINSAVEVER 1107
|
||||
|
||||
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER
|
||||
// Never write a savegame with a version lower than what we need
|
||||
|
|
|
@ -139,8 +139,17 @@ public:
|
|||
operator const char *() const { return Chars; }
|
||||
|
||||
const char *GetChars() const { return Chars; }
|
||||
|
||||
const char &operator[] (int index) const { return Chars[index]; }
|
||||
#if defined(_WIN32) && !defined(_WIN64) && defined(_MSC_VER)
|
||||
// Compiling 32-bit Windows source with MSVC: size_t is typedefed to an
|
||||
// unsigned int with the 64-bit portability warning attribute, so the
|
||||
// prototype cannot substitute unsigned int for size_t, or you get
|
||||
// spurious warnings.
|
||||
const char &operator[] (size_t index) const { return Chars[index]; }
|
||||
#else
|
||||
const char &operator[] (unsigned int index) const { return Chars[index]; }
|
||||
#endif
|
||||
const char &operator[] (unsigned long index) const { return Chars[index]; }
|
||||
const char &operator[] (unsigned long long index) const { return Chars[index]; }
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ ACTOR BeakPowered : Beak
|
|||
|
||||
ACTOR ChickenPlayer : PlayerPawn native
|
||||
{
|
||||
Health 30
|
||||
Health 24
|
||||
ReactionTime 0
|
||||
PainChance 255
|
||||
Radius 16
|
||||
|
@ -112,6 +112,8 @@ ACTOR ChickenPlayer : PlayerPawn native
|
|||
|
||||
ACTOR Chicken : MorphedMonster
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 122
|
||||
Health 10
|
||||
Radius 9
|
||||
Height 22
|
||||
|
|
|
@ -188,6 +188,8 @@ ACTOR Sorcerer2
|
|||
|
||||
ACTOR Sorcerer2FX1
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 145
|
||||
Radius 10
|
||||
Height 6
|
||||
Speed 20
|
||||
|
|
|
@ -81,6 +81,7 @@ ACTOR HereticImpLeader : HereticImp 5
|
|||
{
|
||||
Game Heretic
|
||||
SpawnID 7
|
||||
Health 80
|
||||
-MISSILEMORE
|
||||
AttackSound "himp/leaderattack"
|
||||
States
|
||||
|
|
|
@ -474,3 +474,504 @@ ACTOR GauntletPuff2 : GauntletPuff1
|
|||
}
|
||||
|
||||
|
||||
// The mace itself ----------------------------------------------------------
|
||||
|
||||
ACTOR Mace : HereticWeapon
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 31
|
||||
Weapon.SelectionOrder 1400
|
||||
Weapon.AmmoUse 1
|
||||
Weapon.AmmoGive1 50
|
||||
Weapon.YAdjust 15
|
||||
Weapon.AmmoType "MaceAmmo"
|
||||
Weapon.SisterWeapon "MacePowered"
|
||||
Inventory.PickupMessage "$TxT_WPNMACE"
|
||||
|
||||
action native A_FireMacePL1();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
WMCE A -1
|
||||
Stop
|
||||
Ready:
|
||||
MACE A 1 A_WeaponReady
|
||||
Loop
|
||||
Deselect:
|
||||
MACE A 1 A_Lower
|
||||
Loop
|
||||
Select:
|
||||
MACE A 1 A_Raise
|
||||
Loop
|
||||
Fire:
|
||||
MACE B 4
|
||||
Hold:
|
||||
MACE CDEF 3 A_FireMacePL1
|
||||
MACE C 4 A_ReFire
|
||||
MACE DEFB 4
|
||||
Goto Ready
|
||||
}
|
||||
}
|
||||
|
||||
ACTOR MacePowered : Mace
|
||||
{
|
||||
+WEAPON.POWERED_UP
|
||||
Weapon.AmmoUse 5
|
||||
Weapon.AmmoGive 0
|
||||
Weapon.SisterWeapon "Mace"
|
||||
|
||||
action native A_FireMacePL2();
|
||||
|
||||
States
|
||||
{
|
||||
Fire:
|
||||
Hold:
|
||||
MACE B 4
|
||||
MACE D 4 A_FireMacePL2
|
||||
MACE B 4
|
||||
MACE A 8 A_ReFire
|
||||
Goto Ready
|
||||
}
|
||||
}
|
||||
|
||||
// Mace FX1 -----------------------------------------------------------------
|
||||
|
||||
ACTOR MaceFX1
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 154
|
||||
Radius 8
|
||||
Height 6
|
||||
Speed 20
|
||||
Damage 2
|
||||
Projectile
|
||||
+THRUGHOST
|
||||
+HERETICBOUNCE
|
||||
SeeSound "weapons/maceshoot"
|
||||
|
||||
action native A_MacePL1Check();
|
||||
action native A_MaceBallImpact();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FX02 AB 4 A_MacePL1Check
|
||||
Loop
|
||||
Death:
|
||||
FX02 F 4 BRIGHT A_MaceBallImpact
|
||||
FX02 GHIJ 4 BRIGHT
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Mace FX2 -----------------------------------------------------------------
|
||||
|
||||
ACTOR MaceFX2 : MaceFX1
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 156
|
||||
Speed 10
|
||||
Damage 6
|
||||
Gravity 0.125
|
||||
-NOGRAVITY
|
||||
SeeSound ""
|
||||
|
||||
action native A_MaceBallImpact2();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FX02 CD 4
|
||||
Loop
|
||||
Death:
|
||||
FX02 F 4 A_MaceBallImpact2
|
||||
goto Super::Death+1
|
||||
}
|
||||
}
|
||||
|
||||
// Mace FX3 -----------------------------------------------------------------
|
||||
|
||||
ACTOR MaceFX3 : MaceFX1
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 155
|
||||
Speed 7
|
||||
Damage 4
|
||||
-NOGRAVITY
|
||||
Gravity 0.125
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FX02 AB 4
|
||||
Loop
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Mace FX4 -----------------------------------------------------------------
|
||||
|
||||
ACTOR MaceFX4 native
|
||||
{
|
||||
Game Heretic
|
||||
SpawnID 153
|
||||
Radius 8
|
||||
Height 6
|
||||
Speed 7
|
||||
Damage 18
|
||||
Gravity 0.125
|
||||
Projectile
|
||||
-NOGRAVITY
|
||||
+TELESTOMP
|
||||
+THRUGHOST
|
||||
+HERETICBOUNCE
|
||||
SeeSound ""
|
||||
|
||||
action native A_DeathBallImpact();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FX02 E 99
|
||||
Loop
|
||||
Death:
|
||||
FX02 C 4 A_DeathBallImpact
|
||||
FX02 GHIJ 4 BRIGHT
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Mace spawn spot ----------------------------------------------------------
|
||||
|
||||
ACTOR MaceSpawner : SpecialSpot 2002
|
||||
{
|
||||
Game Heretic
|
||||
+NOSECTOR
|
||||
+NOBLOCKMAP
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
TNT1 A 1
|
||||
TNT1 A -1 A_SpawnSingleItem("Mace", 64, 64, 0)
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
|
||||
|
|
48
wadsrc/static/actors/hexen/bats.txt
Normal file
48
wadsrc/static/actors/hexen/bats.txt
Normal file
|
@ -0,0 +1,48 @@
|
|||
|
||||
// Bat Spawner --------------------------------------------------------------
|
||||
|
||||
ACTOR BatSpawner : SwitchableDecoration 10225
|
||||
{
|
||||
Game Hexen
|
||||
+NOBLOCKMAP +NOSECTOR +NOGRAVITY
|
||||
RenderStyle None
|
||||
|
||||
action native A_BatSpawnInit();
|
||||
action native A_BatSpawn();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
Active:
|
||||
TNT1 A 2
|
||||
TNT1 A 2 A_BatSpawnInit
|
||||
TNT1 A 2 A_BatSpawn
|
||||
Wait
|
||||
Inactive:
|
||||
TNT1 A -1
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Bat ----------------------------------------------------------------------
|
||||
|
||||
ACTOR Bat
|
||||
{
|
||||
Speed 5
|
||||
Radius 3
|
||||
Height 3
|
||||
+NOBLOCKMAP +NOGRAVITY +MISSILE
|
||||
+NOTELEPORT +CANPASS
|
||||
|
||||
action native A_BatMove();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
ABAT ABC 2 A_BatMove
|
||||
Loop
|
||||
Death:
|
||||
ABAT A 2
|
||||
Stop
|
||||
}
|
||||
}
|
156
wadsrc/static/actors/hexen/bishop.txt
Normal file
156
wadsrc/static/actors/hexen/bishop.txt
Normal file
|
@ -0,0 +1,156 @@
|
|||
|
||||
// Bishop -------------------------------------------------------------------
|
||||
|
||||
ACTOR Bishop 114
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 19
|
||||
Health 130
|
||||
Radius 22
|
||||
Height 65
|
||||
Speed 10
|
||||
PainChance 110
|
||||
Monster
|
||||
+FLOAT +NOGRAVITY +NOBLOOD
|
||||
+TELESTOMP
|
||||
+DONTOVERLAP
|
||||
+NOTARGETSWITCH
|
||||
SeeSound "BishopSight"
|
||||
AttackSound "BishopAttack"
|
||||
PainSound "BishopPain"
|
||||
DeathSound "BishopDeath"
|
||||
ActiveSound "BishopActiveSounds"
|
||||
Obituary"$OB_BISHOP"
|
||||
|
||||
action native A_BishopChase();
|
||||
action native A_BishopDecide();
|
||||
action native A_BishopDoBlur();
|
||||
action native A_BishopSpawnBlur();
|
||||
action native A_BishopPainBlur();
|
||||
action native A_BishopAttack();
|
||||
action native A_BishopAttack2();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BISH A 10 A_Look
|
||||
Loop
|
||||
See:
|
||||
BISH A 2 A_Chase
|
||||
BISH A 2 A_BishopChase
|
||||
BISH A 2
|
||||
BISH B 2 A_BishopChase
|
||||
BISH B 2 A_Chase
|
||||
BISH B 2 A_BishopChase
|
||||
BISH A 1 A_BishopDecide
|
||||
Loop
|
||||
Blur:
|
||||
BISH A 2 A_BishopDoBlur
|
||||
BISH A 4 A_BishopSpawnBlur
|
||||
Wait
|
||||
Pain:
|
||||
BISH C 6 A_Pain
|
||||
BISH CCC 6 A_BishopPainBlur
|
||||
BISH C 0
|
||||
Goto See
|
||||
Missile:
|
||||
BISH A 3 A_FaceTarget
|
||||
BISH DE 3 A_FaceTarget
|
||||
BISH F 3 A_BishopAttack
|
||||
BISH F 5 A_BishopAttack2
|
||||
Wait
|
||||
Death:
|
||||
BISH G 6
|
||||
BISH H 6 Bright A_Scream
|
||||
BISH I 5 Bright A_NoBlocking
|
||||
BISH J 5 BRIGHT A_Explode(random[BishopBoom](25,40))
|
||||
BISH K 5 Bright
|
||||
BISH LM 4 Bright
|
||||
BISH N 4 A_SpawnItemEx("BishopPuff", 0,0,40, 0,0,0.5)
|
||||
BISH O 4 A_QueueCorpse
|
||||
BISH P -1
|
||||
Stop
|
||||
Ice:
|
||||
BISH X 5 A_FreezeDeath
|
||||
BISH X 1 A_FreezeDeathChunks
|
||||
Wait
|
||||
}
|
||||
}
|
||||
|
||||
// Bishop puff --------------------------------------------------------------
|
||||
|
||||
ACTOR BishopPuff
|
||||
{
|
||||
Game Hexen
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
RenderStyle Translucent
|
||||
Alpha 0.6
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BISH QRST 5
|
||||
BISH UV 6
|
||||
BISH W 5
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Bishop pain blur ---------------------------------------------------------
|
||||
|
||||
ACTOR BishopPainBlur
|
||||
{
|
||||
Game Hexen
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
RenderStyle Translucent
|
||||
Alpha 0.6
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BISH C 8
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Bishop FX ----------------------------------------------------------------
|
||||
|
||||
ACTOR BishopFX
|
||||
{
|
||||
Game Hexen
|
||||
Radius 10
|
||||
Height 6
|
||||
Speed 10
|
||||
Damage 1
|
||||
Projectile
|
||||
+SEEKERMISSILE
|
||||
-ACTIVATEIMPACT -ACTIVATEPCROSS
|
||||
+STRIFEDAMAGE
|
||||
RenderStyle Add
|
||||
DeathSound "BishopMissileExplode"
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BPFX ABAB 1 Bright A_BishopMissileWeave
|
||||
BPFX B 0 Bright A_SeekerMissile(2,3)
|
||||
Loop
|
||||
Death:
|
||||
BPFX CDEF 4 Bright
|
||||
BPFX GH 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Bishop blur --------------------------------------------------------------
|
||||
|
||||
ACTOR BishopBlur
|
||||
{
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
RenderStyle Translucent
|
||||
Alpha 0.6
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BISH A 16
|
||||
BISH A 8 A_SetTranslucent(0.4)
|
||||
Stop
|
||||
}
|
||||
}
|
35
wadsrc/static/actors/hexen/blastradius.txt
Normal file
35
wadsrc/static/actors/hexen/blastradius.txt
Normal file
|
@ -0,0 +1,35 @@
|
|||
|
||||
ACTOR ArtiBlastRadius : Inventory 10110 native
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 74
|
||||
+FLOATBOB
|
||||
Inventory.DefMaxAmount
|
||||
Inventory.PickupFlash 1
|
||||
+INVBAR +FANCYPICKUPSOUND
|
||||
Inventory.Icon "ARTIBLST"
|
||||
Inventory.PickupSound "misc/p_pkup"
|
||||
Inventory.PickupMessage "$TXT_ARTIBLASTRADIUS"
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BLST ABCDEFGH 4 Bright
|
||||
Loop
|
||||
}
|
||||
}
|
||||
|
||||
// Blast Effect -------------------------------------------------------------
|
||||
|
||||
ACTOR BlastEffect
|
||||
{
|
||||
+NOBLOCKMAP +NOGRAVITY +NOCLIP
|
||||
+NOTELEPORT
|
||||
RenderStyle Translucent
|
||||
Alpha 0.666
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
RADE ABCDEFGHI 4
|
||||
Stop
|
||||
}
|
||||
}
|
22
wadsrc/static/actors/hexen/boostarmor.txt
Normal file
22
wadsrc/static/actors/hexen/boostarmor.txt
Normal file
|
@ -0,0 +1,22 @@
|
|||
|
||||
// Boost Armor Artifact (Dragonskin Bracers) --------------------------------
|
||||
|
||||
ACTOR ArtiBoostArmor : Inventory 8041 native
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 22
|
||||
+COUNTITEM
|
||||
+FLOATBOB
|
||||
Inventory.DefMaxAmount
|
||||
Inventory.PickupFlash 1
|
||||
+INVBAR +FANCYPICKUPSOUND
|
||||
Inventory.Icon "ARTIBRAC"
|
||||
Inventory.PickupSound "misc/p_pkup"
|
||||
Inventory.PickupMessage "$TXT_ARTIBOOSTARMOR"
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BRAC ABCDEFGH 4 Bright
|
||||
Loop
|
||||
}
|
||||
}
|
81
wadsrc/static/actors/hexen/clericboss.txt
Normal file
81
wadsrc/static/actors/hexen/clericboss.txt
Normal file
|
@ -0,0 +1,81 @@
|
|||
|
||||
// Cleric Boss (Traductus) --------------------------------------------------
|
||||
|
||||
ACTOR ClericBoss 10101
|
||||
{
|
||||
Game Hexen
|
||||
Health 800
|
||||
PainChance 50
|
||||
Speed 25
|
||||
Radius 16
|
||||
Height 64
|
||||
Monster
|
||||
+FLOORCLIP +TELESTOMP
|
||||
+DONTMORPH
|
||||
-CANUSEWALLS
|
||||
PainSound "PlayerClericPain"
|
||||
DeathSound "PlayerClericCrazyDeath"
|
||||
Obituary "$OBCBOSS"
|
||||
|
||||
action native A_ClericAttack();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CLER A 2
|
||||
CLER A 3 A_ClassBossHealth
|
||||
CLER A 5 A_Look
|
||||
Wait
|
||||
See:
|
||||
CLER ABCD 4 A_FastChase
|
||||
Loop
|
||||
Pain:
|
||||
CLER H 4
|
||||
CLER H 4 A_Pain
|
||||
Goto See
|
||||
Melee:
|
||||
Missile:
|
||||
CLER EF 8 A_FaceTarget
|
||||
CLER G 10 A_ClericAttack
|
||||
Goto See
|
||||
Death:
|
||||
CLER I 6
|
||||
CLER K 6 A_Scream
|
||||
CLER LL 6
|
||||
CLER M 6 A_NoBlocking
|
||||
CLER NOP 6
|
||||
CLER Q -1
|
||||
Stop
|
||||
XDeath:
|
||||
CLER R 5 A_Scream
|
||||
CLER S 5
|
||||
CLER T 5 A_NoBlocking
|
||||
CLER UVWXYZ 5
|
||||
CLER "[" -1
|
||||
Stop
|
||||
Ice:
|
||||
CLER "\" 5 A_FreezeDeath
|
||||
CLER "\" 1 A_FreezeDeathChunks
|
||||
Wait
|
||||
Burn:
|
||||
CLER C 5 Bright A_PlaySound("PlayerClericBurnDeath")
|
||||
FDTH D 4 Bright
|
||||
FDTH G 5 Bright
|
||||
FDTH H 4 Bright A_Scream
|
||||
FDTH I 5 Bright
|
||||
FDTH J 4 Bright
|
||||
FDTH K 5 Bright
|
||||
FDTH L 4 Bright
|
||||
FDTH M 5 Bright
|
||||
FDTH N 4 Bright
|
||||
FDTH O 5 Bright
|
||||
FDTH P 4 Bright
|
||||
FDTH Q 5 Bright
|
||||
FDTH R 4 Bright
|
||||
FDTH S 5 Bright A_NoBlocking
|
||||
FDTH T 4 Bright
|
||||
FDTH U 5 Bright
|
||||
FDTH V 4 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
196
wadsrc/static/actors/hexen/clericflame.txt
Normal file
196
wadsrc/static/actors/hexen/clericflame.txt
Normal file
|
@ -0,0 +1,196 @@
|
|||
|
||||
// The Cleric's Flame Strike ------------------------------------------------
|
||||
|
||||
ACTOR CWeapFlame : ClericWeapon 8009
|
||||
{
|
||||
Game Hexen
|
||||
+NOGRAVITY
|
||||
Weapon.SelectionOrder 1000
|
||||
Weapon.AmmoUse 4
|
||||
Weapon.AmmoGive 25
|
||||
Weapon.KickBack 150
|
||||
Weapon.YAdjust 10
|
||||
Weapon.AmmoType1 "Mana2"
|
||||
Inventory.PickupMessage "$TXT_WEAPON_C3"
|
||||
|
||||
action native A_CFlameAttack();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
WCFM ABCDEFGH 4 Bright
|
||||
Loop
|
||||
Select:
|
||||
CFLM A 1 A_Raise
|
||||
Loop
|
||||
Deselect:
|
||||
CFLM A 1 A_Lower
|
||||
Loop
|
||||
Ready:
|
||||
CFLM AAAABBBBCCCC 1 A_WeaponReady
|
||||
Loop
|
||||
Fire:
|
||||
CFLM A 2 Offset (0, 40)
|
||||
CFLM D 2 Offset (0, 50)
|
||||
CFLM D 2 Offset (0, 36)
|
||||
CFLM E 4 Bright
|
||||
CFLM F 4 Bright A_CFlameAttack
|
||||
CFLM E 4 Bright
|
||||
CFLM G 2 Offset (0, 40)
|
||||
CFLM G 2
|
||||
Goto Ready
|
||||
}
|
||||
}
|
||||
|
||||
// Floor Flame --------------------------------------------------------------
|
||||
|
||||
ACTOR CFlameFloor
|
||||
{
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
RenderStyle Add
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CFFX N 5 Bright
|
||||
CFFX O 4 Bright
|
||||
CFFX P 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Flame Puff ---------------------------------------------------------------
|
||||
|
||||
ACTOR FlamePuff
|
||||
{
|
||||
Radius 1
|
||||
Height 1
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
RenderStyle Add
|
||||
SeeSound "ClericFlameExplode"
|
||||
AttackSound "ClericFlameExplode"
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CFFX ABC 3 Bright
|
||||
CFFX D 4 Bright
|
||||
CFFX E 3 Bright
|
||||
CFFX F 4 Bright
|
||||
CFFX G 3 Bright
|
||||
CFFX H 4 Bright
|
||||
CFFX I 3 Bright
|
||||
CFFX J 4 Bright
|
||||
CFFX K 3 Bright
|
||||
CFFX L 4 Bright
|
||||
CFFX M 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Flame Puff 2 -------------------------------------------------------------
|
||||
|
||||
ACTOR FlamePuff2 : FlamePuff
|
||||
{
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CFFX ABC 3 Bright
|
||||
CFFX D 4 Bright
|
||||
CFFX E 3 Bright
|
||||
CFFX F 4 Bright
|
||||
CFFX G 3 Bright
|
||||
CFFX H 4 Bright
|
||||
CFFX IC 3 Bright
|
||||
CFFX D 4 Bright
|
||||
CFFX E 3 Bright
|
||||
CFFX F 4 Bright
|
||||
CFFX G 3 Bright
|
||||
CFFX H 4 Bright
|
||||
CFFX I 3 Bright
|
||||
CFFX J 4 Bright
|
||||
CFFX K 3 Bright
|
||||
CFFX L 4 Bright
|
||||
CFFX M 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Circle Flame -------------------------------------------------------------
|
||||
|
||||
ACTOR CircleFlame
|
||||
{
|
||||
Game Hexen
|
||||
Radius 6
|
||||
Damage 2
|
||||
DamageType "Fire"
|
||||
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
|
||||
+NOTELEPORT
|
||||
RenderStyle Add
|
||||
DeathSound "ClericFlameCircle"
|
||||
|
||||
action native A_CFlameRotate();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CFCF A 4 Bright
|
||||
CFCF B 2 Bright A_CFlameRotate
|
||||
CFCF C 2 Bright
|
||||
CFCF D 1 Bright
|
||||
CFCF E 2 Bright
|
||||
CFCF F 2 Bright A_CFlameRotate
|
||||
CFCF G 1 Bright
|
||||
CFCF HI 2 Bright
|
||||
CFCF J 1 Bright A_CFlameRotate
|
||||
CFCF K 2 Bright
|
||||
CFCF LM 3 Bright
|
||||
CFCF N 2 Bright A_CFlameRotate
|
||||
CFCF O 3 Bright
|
||||
CFCF P 2 Bright
|
||||
Stop
|
||||
Death:
|
||||
CFCF QR 3 Bright
|
||||
CFCF S 3 Bright A_Explode(20, 20, 0)
|
||||
CFCF TUVWXYZ 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Flame Missile ------------------------------------------------------------
|
||||
|
||||
ACTOR CFlameMissile native
|
||||
{
|
||||
Speed 200
|
||||
Radius 14
|
||||
Height 8
|
||||
Damage 8
|
||||
DamageType "Fire"
|
||||
Projectile
|
||||
+INVISIBLE
|
||||
-BLOODSPLATTER
|
||||
RenderStyle Add
|
||||
|
||||
action native A_CFlamePuff();
|
||||
action native A_CFlameMissile();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
CFFX A 4 Bright
|
||||
CFFX A 1 A_CFlamePuff
|
||||
Goto Death + 1
|
||||
Death:
|
||||
CFFX A 1 Bright A_CFlameMissile
|
||||
CFFX ABC 3 Bright
|
||||
CFFX D 4 Bright
|
||||
CFFX E 3 Bright
|
||||
CFFX F 4 Bright
|
||||
CFFX G 3 Bright
|
||||
CFFX H 4 Bright
|
||||
CFFX I 3 Bright
|
||||
CFFX J 4 Bright
|
||||
CFFX K 3 Bright
|
||||
CFFX L 4 Bright
|
||||
CFFX M 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
82
wadsrc/static/actors/hexen/fighterboss.txt
Normal file
82
wadsrc/static/actors/hexen/fighterboss.txt
Normal file
|
@ -0,0 +1,82 @@
|
|||
|
||||
// Fighter Boss (Zedek) -----------------------------------------------------
|
||||
|
||||
ACTOR FighterBoss 10100
|
||||
{
|
||||
Game Hexen
|
||||
health 800
|
||||
PainChance 50
|
||||
Speed 25
|
||||
Radius 16
|
||||
Height 64
|
||||
Monster
|
||||
+FLOORCLIP
|
||||
+TELESTOMP
|
||||
+DONTMORPH
|
||||
-CANUSEWALLS
|
||||
PainSound "PlayerFighterPain"
|
||||
DeathSound "PlayerFighterCrazyDeath"
|
||||
Obituary "$OB_FBOSS"
|
||||
|
||||
action native A_FighterAttack();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
PLAY A 2
|
||||
PLAY A 3 A_ClassBossHealth
|
||||
PLAY A 5 A_Look
|
||||
Wait
|
||||
See:
|
||||
PLAY ABCD 4 A_FastChase
|
||||
Loop
|
||||
Pain:
|
||||
PLAY G 4
|
||||
PLAY G 4 A_Pain
|
||||
Goto See
|
||||
Melee:
|
||||
Missile:
|
||||
PLAY E 8 A_FaceTarget
|
||||
PLAY F 8 A_FighterAttack
|
||||
Goto See
|
||||
Death:
|
||||
PLAY H 6
|
||||
PLAY I 6 A_Scream
|
||||
PLAY JK 6
|
||||
PLAY L 6 A_NoBlocking
|
||||
PLAY M 6
|
||||
PLAY N -1
|
||||
Stop
|
||||
XDeath:
|
||||
PLAY O 5 A_Scream
|
||||
PLAY P 5 A_SkullPop
|
||||
PLAY R 5 A_NoBlocking
|
||||
PLAY STUV 5
|
||||
PLAY W -1
|
||||
Stop
|
||||
Ice:
|
||||
PLAY X 5 A_FreezeDeath
|
||||
PLAY X 1 A_FreezeDeathChunks
|
||||
Wait
|
||||
Burn:
|
||||
FDTH A 5 Bright A_PlaySound("PlayerFighterBurnDeath")
|
||||
FDTH B 4 Bright
|
||||
FDTH G 5 Bright
|
||||
FDTH H 4 Bright A_Scream
|
||||
FDTH I 5 Bright
|
||||
FDTH J 4 Bright
|
||||
FDTH K 5 Bright
|
||||
FDTH L 4 Bright
|
||||
FDTH M 5 Bright
|
||||
FDTH N 4 Bright
|
||||
FDTH O 5 Bright
|
||||
FDTH P 4 Bright
|
||||
FDTH Q 5 Bright
|
||||
FDTH R 4 Bright
|
||||
FDTH S 5 Bright A_NoBlocking
|
||||
FDTH T 4 Bright
|
||||
FDTH U 5 Bright
|
||||
FDTH V 4 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
|
@ -220,8 +220,6 @@ ACTOR FireDemonMissile
|
|||
Damage 1
|
||||
DamageType "Fire"
|
||||
Projectile
|
||||
+FLOORCLIP
|
||||
-BLOODSPLATTER
|
||||
RenderStyle Add
|
||||
DeathSound "FireDemonMissileHit"
|
||||
States
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// Temp Small Flame --------------------------------------------------------
|
||||
|
||||
ACTOR AFlameSmallTemp 10500
|
||||
ACTOR FlameSmallTemp 10500
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 96
|
||||
|
@ -21,7 +21,7 @@ ACTOR AFlameSmallTemp 10500
|
|||
|
||||
// Temp Large Flame ---------------------------------------------------------
|
||||
|
||||
ACTOR AFlameLargeTemp 10502
|
||||
ACTOR FlameLargeTemp 10502
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 98
|
||||
|
|
67
wadsrc/static/actors/hexen/flechette.txt
Normal file
67
wadsrc/static/actors/hexen/flechette.txt
Normal file
|
@ -0,0 +1,67 @@
|
|||
|
||||
// Poison Bag (Flechette used by Cleric) ------------------------------------
|
||||
|
||||
ACTOR PoisonBag
|
||||
{
|
||||
Game Hexen
|
||||
Radius 5
|
||||
Height 5
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
|
||||
action native A_PoisonBagInit();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
PSBG A 18 Bright
|
||||
PSBG B 4 Bright
|
||||
PSBG C 3
|
||||
PSBG C 1 A_PoisonBagInit
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Throwing Bomb (Flechette used by Fighter) --------------------------------
|
||||
|
||||
ACTOR ThrowingBomb
|
||||
{
|
||||
Game Hexen
|
||||
Health 48
|
||||
Speed 12
|
||||
Radius 8
|
||||
Height 10
|
||||
DamageType "Fire"
|
||||
+NOBLOCKMAP +DROPOFF +MISSILE
|
||||
+HEXENBOUNCE
|
||||
SeeSound "FlechetteBounce"
|
||||
DeathSound "FlechetteExplode"
|
||||
|
||||
action native A_CheckThrowBomb();
|
||||
action native A_CheckThrowBomb2();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
THRW A 4 A_CheckThrowBomb
|
||||
THRW BCDE 3 A_CheckThrowBomb
|
||||
THRW F 3 A_CheckThrowBomb2
|
||||
Loop
|
||||
THRW G 6 A_CheckThrowBomb
|
||||
THRW F 4 A_CheckThrowBomb
|
||||
THRW H 6 A_CheckThrowBomb
|
||||
THRW F 4 A_CheckThrowBomb
|
||||
THRW G 6 A_CheckThrowBomb
|
||||
THRW F 3 A_CheckThrowBomb
|
||||
Wait
|
||||
Death:
|
||||
CFCF Q 4 Bright A_NoGravity
|
||||
CFCF R 3 Bright A_Scream
|
||||
CFCF S 4 Bright A_Explode
|
||||
CFCF T 3 Bright
|
||||
CFCF U 4 Bright
|
||||
CFCF W 3 Bright
|
||||
CFCF X 4 Bright
|
||||
CFCF Z 3 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
85
wadsrc/static/actors/hexen/mageboss.txt
Normal file
85
wadsrc/static/actors/hexen/mageboss.txt
Normal file
|
@ -0,0 +1,85 @@
|
|||
|
||||
// Mage Boss (Menelkir) -----------------------------------------------------
|
||||
|
||||
ACTOR MageBoss 10102
|
||||
{
|
||||
Game Hexen
|
||||
Health 800
|
||||
PainChance 50
|
||||
Speed 25
|
||||
Radius 16
|
||||
Height 64
|
||||
Monster
|
||||
+FLOORCLIP +TELESTOMP
|
||||
+DONTMORPH
|
||||
-CANUSEWALLS
|
||||
PainSound "PlayerMagePain"
|
||||
DeathSound "PlayerMageCrazyDeath"
|
||||
Obituary "$OB_MBOSS"
|
||||
|
||||
action native A_MageAttack();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
MAGE A 2
|
||||
MAGE A 3 A_ClassBossHealth
|
||||
MAGE A 5 A_Look
|
||||
Wait
|
||||
See:
|
||||
MAGE ABCD 4 A_FastChase
|
||||
Loop
|
||||
Pain:
|
||||
MAGE G 4
|
||||
MAGE G 4 A_Pain
|
||||
Goto See
|
||||
Melee:
|
||||
Missile:
|
||||
MAGE E 8 A_FaceTarget
|
||||
MAGE F 8 Bright A_MageAttack
|
||||
Goto See
|
||||
Death:
|
||||
MAGE H 6
|
||||
MAGE I 6 A_Scream
|
||||
MAGE JK 6
|
||||
MAGE L 6 A_NoBlocking
|
||||
MAGE M 6
|
||||
MAGE N -1
|
||||
Stop
|
||||
XDeath:
|
||||
MAGE O 5 A_Scream
|
||||
MAGE P 5
|
||||
MAGE R 5 A_NoBlocking
|
||||
MAGE S 5
|
||||
MAGE T 5
|
||||
MAGE U 5
|
||||
MAGE V 5
|
||||
MAGE W 5
|
||||
MAGE X -1
|
||||
Stop
|
||||
Ice:
|
||||
MAGE Y 5 A_FreezeDeath
|
||||
MAGE Y 1 A_FreezeDeathChunks
|
||||
Wait
|
||||
Burn:
|
||||
FDTH E 5 Bright A_PlaySound("PlayerMageBurnDeath")
|
||||
FDTH F 4 Bright
|
||||
FDTH G 5 Bright
|
||||
FDTH H 4 Bright A_Scream
|
||||
FDTH I 5 Bright
|
||||
FDTH J 4 Bright
|
||||
FDTH K 5 Bright
|
||||
FDTH L 4 Bright
|
||||
FDTH M 5 Bright
|
||||
FDTH N 4 Bright
|
||||
FDTH O 5 Bright
|
||||
FDTH P 4 Bright
|
||||
FDTH Q 5 Bright
|
||||
FDTH R 4 Bright
|
||||
FDTH S 5 Bright A_NoBlocking
|
||||
FDTH T 4 Bright
|
||||
FDTH U 5 Bright
|
||||
FDTH V 4 Bright
|
||||
Stop
|
||||
}
|
||||
}
|
41
wadsrc/static/actors/hexen/summon.txt
Normal file
41
wadsrc/static/actors/hexen/summon.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
|
||||
// Summoning Doll -----------------------------------------------------------
|
||||
|
||||
ACTOR SummoningDoll
|
||||
{
|
||||
Game Hexen
|
||||
Speed 20
|
||||
+NOBLOCKMAP +DROPOFF +MISSILE
|
||||
+NOTELEPORT
|
||||
|
||||
action native A_Summon();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
SUMN A 4
|
||||
Loop
|
||||
Death:
|
||||
SUMN AA 4
|
||||
SUMN A 4 A_Summon
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// Minotaur Smoke -----------------------------------------------------------
|
||||
|
||||
ACTOR MinotaurSmoke
|
||||
{
|
||||
Game Hexen
|
||||
+NOBLOCKMAP +NOGRAVITY
|
||||
+NOTELEPORT
|
||||
RenderStyle Translucent
|
||||
Alpha 0.6
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
MNSM ABCDEFGHIJKLMNOPQ 3
|
||||
Stop
|
||||
}
|
||||
}
|
|
@ -179,6 +179,7 @@ class Actor extends Thinker
|
|||
action native A_SelectWeapon(class<Weapon> whichweapon);
|
||||
action native A_Punch();
|
||||
action native A_Feathers();
|
||||
action native A_ClassBossHealth();
|
||||
}
|
||||
|
||||
class Inventory extends Actor
|
||||
|
|
88
wadsrc/static/actors/raven/minotaur.txt
Normal file
88
wadsrc/static/actors/raven/minotaur.txt
Normal 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
|
||||
}
|
||||
}
|
||||
|
|
@ -65,11 +65,11 @@ ACTOR ArtiFly : PowerupGiver 83
|
|||
}
|
||||
}
|
||||
|
||||
// Invulnerability ----------------------------------------------------------
|
||||
// Invulnerability Heretic ---------------------------------------------------
|
||||
|
||||
ACTOR ArtiInvulnerability : PowerupGiver 84
|
||||
{
|
||||
Game Raven
|
||||
Game Heretic
|
||||
SpawnID 133
|
||||
+COUNTITEM
|
||||
+FLOATBOB
|
||||
|
@ -77,7 +77,28 @@ ACTOR ArtiInvulnerability : PowerupGiver 84
|
|||
Inventory.RespawnTics 4230
|
||||
Inventory.Icon ARTIINVU
|
||||
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY"
|
||||
Inventory.PickupMessage Hexen, "$TXT_ARTIINVULNERABILITY2"
|
||||
Powerup.Type Invulnerable
|
||||
Powerup.Color GoldMap
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
INVU ABCD 3
|
||||
Loop
|
||||
}
|
||||
}
|
||||
|
||||
// Invulnerability Hexen ----------------------------------------------------------
|
||||
|
||||
ACTOR ArtiInvulnerability2 : PowerupGiver 84
|
||||
{
|
||||
Game Hexen
|
||||
SpawnID 133
|
||||
+COUNTITEM
|
||||
+FLOATBOB
|
||||
+INVENTORY.PICKUPFLASH
|
||||
Inventory.RespawnTics 4230
|
||||
Inventory.Icon ARTIINVU
|
||||
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY2"
|
||||
Powerup.Type Invulnerable
|
||||
States
|
||||
{
|
||||
|
|
109
wadsrc/static/actors/shared/bridge.txt
Normal file
109
wadsrc/static/actors/shared/bridge.txt
Normal file
|
@ -0,0 +1,109 @@
|
|||
// Bridge ball -------------------------------------------------------------
|
||||
|
||||
ACTOR BridgeBall
|
||||
{
|
||||
+NOBLOCKMAP
|
||||
+NOTELEPORT
|
||||
+NOGRAVITY
|
||||
|
||||
action native A_BridgeOrbit();
|
||||
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
TLGL A 2 Bright
|
||||
TLGL A 1 Bright A_BridgeOrbit
|
||||
Wait
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// The bridge itself -------------------------------------------------------
|
||||
|
||||
ACTOR CustomBridge 9991 native
|
||||
{
|
||||
+SOLID
|
||||
+NOGRAVITY
|
||||
+NOLIFTDROP
|
||||
+ACTLIKEBRIDGE
|
||||
Radius 32
|
||||
Height 2
|
||||
RenderStyle None
|
||||
|
||||
action native A_BridgeInit(optional class<Actor> balltype);
|
||||
|
||||
states
|
||||
{
|
||||
Spawn:
|
||||
TLGL ABCDE 3 Bright
|
||||
Loop
|
||||
See:
|
||||
TLGL A 2
|
||||
TLGL A 2 A_BridgeInit
|
||||
TLGL A -1
|
||||
Stop
|
||||
Death:
|
||||
TLGL A 2
|
||||
TLGL A 300
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// The Hexen bridge -------------------------------------------------------
|
||||
|
||||
ACTOR Bridge : CustomBridge 118
|
||||
{
|
||||
Game Raven
|
||||
SpawnID 21
|
||||
RenderStyle None
|
||||
Args 32, 2, 3, 0
|
||||
}
|
||||
|
||||
// The ZDoom bridge -------------------------------------------------------
|
||||
|
||||
ACTOR ZBridge : CustomBridge 118
|
||||
{
|
||||
Game Doom
|
||||
SpawnID 21
|
||||
Args 36, 4, 0, 0
|
||||
}
|
||||
|
||||
|
||||
// Invisible bridge --------------------------------------------------------
|
||||
|
||||
ACTOR InvisibleBridge 9990 native
|
||||
{
|
||||
RenderStyle None
|
||||
Radius 32
|
||||
Height 4
|
||||
+SOLID
|
||||
+NOGRAVITY
|
||||
+NOLIFTDROP
|
||||
+ACTLIKEBRIDGE
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
TNT1 A -1
|
||||
Stop
|
||||
}
|
||||
}
|
||||
|
||||
// And some invisible bridges from Skull Tag -------------------------------
|
||||
|
||||
ACTOR InvisibleBridge32 : InvisibleBridge 5061
|
||||
{
|
||||
Radius 32
|
||||
Height 8
|
||||
}
|
||||
|
||||
ACTOR InvisibleBridge16 : InvisibleBridge 5064
|
||||
{
|
||||
Radius 16
|
||||
Height 8
|
||||
}
|
||||
|
||||
ACTOR InvisibleBridge8 : InvisibleBridge 5065
|
||||
{
|
||||
Radius 8
|
||||
Height 8
|
||||
}
|
5
wadsrc/static/actors/shared/specialspot.txt
Normal file
5
wadsrc/static/actors/shared/specialspot.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
|
||||
ACTOR SpecialSpot native
|
||||
{
|
||||
action native A_SpawnSingleItem(class<Actor> type, optional eval int fail_sp, optional eval int fail_co, optional eval int fail_dm);
|
||||
}
|
|
@ -9,6 +9,8 @@
|
|||
#include "actors/shared/pickups.txt"
|
||||
#include "actors/shared/fountain.txt"
|
||||
#include "actors/shared/soundsequence.txt"
|
||||
#include "actors/shared/bridge.txt"
|
||||
#include "actors/shared/specialspot.txt"
|
||||
|
||||
#include "actors/doom/doomplayer.txt"
|
||||
#include "actors/doom/possessed.txt"
|
||||
|
@ -42,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"
|
||||
|
@ -80,6 +83,16 @@
|
|||
#include "actors/hexen/clericmace.txt"
|
||||
#include "actors/hexen/firedemon.txt"
|
||||
#include "actors/hexen/fog.txt"
|
||||
#include "actors/hexen/summon.txt"
|
||||
#include "actors/hexen/flechette.txt"
|
||||
#include "actors/hexen/clericboss.txt"
|
||||
#include "actors/hexen/fighterboss.txt"
|
||||
#include "actors/hexen/mageboss.txt"
|
||||
#include "actors/hexen/bats.txt"
|
||||
#include "actors/hexen/bishop.txt"
|
||||
#include "actors/hexen/blastradius.txt"
|
||||
#include "actors/hexen/boostarmor.txt"
|
||||
#include "actors/hexen/clericflame.txt"
|
||||
|
||||
#include "actors/strife/strifeplayer.txt"
|
||||
#include "actors/strife/beggars.txt"
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 576 B After Width: | Height: | Size: 576 B |
Binary file not shown.
Before Width: | Height: | Size: 974 B After Width: | Height: | Size: 183 B |
Loading…
Add table
Add a link
Reference in a new issue