mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-06-03 10:41:12 +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)
|
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 mugshot drawe ignored the accuracy parameter.
|
||||||
- Fixed: The Alt HUD's weapon drawer didn't check properly for invalid icons.
|
- 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
|
- Added DECORATE conversions for Hexen's Cleric Mace, Firedemon and fog by
|
||||||
|
|
|
@ -40,12 +40,10 @@
|
||||||
#define AREG_SECTION "__DATA,areg"
|
#define AREG_SECTION "__DATA,areg"
|
||||||
#define CREG_SECTION "__DATA,creg"
|
#define CREG_SECTION "__DATA,creg"
|
||||||
#define GREG_SECTION "__DATA,greg"
|
#define GREG_SECTION "__DATA,greg"
|
||||||
#define SREG_SECTION "__DATA,sreg"
|
|
||||||
#else
|
#else
|
||||||
#define AREG_SECTION "areg"
|
#define AREG_SECTION "areg"
|
||||||
#define CREG_SECTION "creg"
|
#define CREG_SECTION "creg"
|
||||||
#define GREG_SECTION "greg"
|
#define GREG_SECTION "greg"
|
||||||
#define SREG_SECTION "sreg"
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -60,10 +58,6 @@ extern REGINFO ARegTail;
|
||||||
extern REGINFO GRegHead;
|
extern REGINFO GRegHead;
|
||||||
extern REGINFO GRegTail;
|
extern REGINFO GRegTail;
|
||||||
|
|
||||||
// List of AT_SPEED_SET functions
|
|
||||||
extern REGINFO SRegHead;
|
|
||||||
extern REGINFO SRegTail;
|
|
||||||
|
|
||||||
// List of TypeInfos
|
// List of TypeInfos
|
||||||
extern REGINFO CRegHead;
|
extern REGINFO CRegHead;
|
||||||
extern REGINFO CRegTail;
|
extern REGINFO CRegTail;
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#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")
|
#pragma data_seg(".areg$a")
|
||||||
void *ARegHead = 0;
|
void *ARegHead = 0;
|
||||||
|
@ -57,9 +57,6 @@ void *CRegHead = 0;
|
||||||
#pragma data_seg(".greg$a")
|
#pragma data_seg(".greg$a")
|
||||||
void *GRegHead = 0;
|
void *GRegHead = 0;
|
||||||
|
|
||||||
#pragma data_seg(".sreg$a")
|
|
||||||
void *SRegHead = 0;
|
|
||||||
|
|
||||||
#pragma data_seg()
|
#pragma data_seg()
|
||||||
|
|
||||||
// We want visual styles support under XP
|
// We want visual styles support under XP
|
||||||
|
@ -86,7 +83,6 @@ void *SRegHead = 0;
|
||||||
void *ARegHead __attribute__((section(AREG_SECTION))) = 0;
|
void *ARegHead __attribute__((section(AREG_SECTION))) = 0;
|
||||||
void *CRegHead __attribute__((section(CREG_SECTION))) = 0;
|
void *CRegHead __attribute__((section(CREG_SECTION))) = 0;
|
||||||
void *GRegHead __attribute__((section(GREG_SECTION))) = 0;
|
void *GRegHead __attribute__((section(GREG_SECTION))) = 0;
|
||||||
void *SRegHead __attribute__((section(SREG_SECTION))) = 0;
|
|
||||||
|
|
||||||
#elif
|
#elif
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,6 @@ void *CRegTail = 0;
|
||||||
#pragma data_seg(".greg$z")
|
#pragma data_seg(".greg$z")
|
||||||
void *GRegTail = 0;
|
void *GRegTail = 0;
|
||||||
|
|
||||||
#pragma data_seg(".sreg$z")
|
|
||||||
void *SRegTail = 0;
|
|
||||||
|
|
||||||
#pragma data_seg()
|
#pragma data_seg()
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,7 +55,6 @@ void *SRegTail = 0;
|
||||||
void *ARegTail __attribute__((section(AREG_SECTION))) = 0;
|
void *ARegTail __attribute__((section(AREG_SECTION))) = 0;
|
||||||
void *CRegTail __attribute__((section(CREG_SECTION))) = 0;
|
void *CRegTail __attribute__((section(CREG_SECTION))) = 0;
|
||||||
void *GRegTail __attribute__((section(GREG_SECTION))) = 0;
|
void *GRegTail __attribute__((section(GREG_SECTION))) = 0;
|
||||||
void *SRegTail __attribute__((section(SREG_SECTION))) = 0;
|
|
||||||
|
|
||||||
#elif
|
#elif
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,7 @@ ACTOR(DamageChildren)
|
||||||
ACTOR(CheckForReload)
|
ACTOR(CheckForReload)
|
||||||
ACTOR(ResetReloadCounter)
|
ACTOR(ResetReloadCounter)
|
||||||
ACTOR(ClearReFire)
|
ACTOR(ClearReFire)
|
||||||
|
ACTOR(SpawnSingleItem)
|
||||||
|
|
||||||
// Heretic stuff
|
// Heretic stuff
|
||||||
ACTOR(Feathers)
|
ACTOR(Feathers)
|
||||||
|
@ -151,7 +152,37 @@ ACTOR(FireGoldWandPL2)
|
||||||
ACTOR(FireCrossbowPL1)
|
ACTOR(FireCrossbowPL1)
|
||||||
ACTOR(FireCrossbowPL2)
|
ACTOR(FireCrossbowPL2)
|
||||||
ACTOR(GauntletAttack)
|
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)
|
WEAPON(CMaceAttack)
|
||||||
ACTOR(FiredRocks)
|
ACTOR(FiredRocks)
|
||||||
ACTOR(FiredChase)
|
ACTOR(FiredChase)
|
||||||
|
@ -160,9 +191,20 @@ ACTOR(FiredSplotch)
|
||||||
ACTOR(SmBounce)
|
ACTOR(SmBounce)
|
||||||
ACTOR(FogSpawn)
|
ACTOR(FogSpawn)
|
||||||
ACTOR(FogMove)
|
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!
|
// Special code pointers for Strife's player - not to be used elsewhere!
|
||||||
ACTOR(ItBurnsItBurns)
|
ACTOR(ItBurnsItBurns)
|
||||||
ACTOR(CrispyPlayer)
|
ACTOR(CrispyPlayer)
|
||||||
ACTOR(DropFire)
|
ACTOR(DropFire)
|
||||||
|
|
||||||
|
// Special code pointers for bridge things
|
||||||
|
ACTOR(BridgeInit)
|
||||||
|
ACTOR(BridgeOrbit)
|
|
@ -14,7 +14,6 @@
|
||||||
#include "p_enemy.h"
|
#include "p_enemy.h"
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "r_translate.h"
|
#include "r_translate.h"
|
||||||
#include "a_specialspot.h"
|
|
||||||
#include "thingdef/thingdef.h"
|
#include "thingdef/thingdef.h"
|
||||||
|
|
||||||
static FRandom pr_sap ("StaffAtkPL1");
|
static FRandom pr_sap ("StaffAtkPL1");
|
||||||
|
@ -22,7 +21,6 @@ static FRandom pr_sap2 ("StaffAtkPL2");
|
||||||
static FRandom pr_fgw ("FireWandPL1");
|
static FRandom pr_fgw ("FireWandPL1");
|
||||||
static FRandom pr_fgw2 ("FireWandPL2");
|
static FRandom pr_fgw2 ("FireWandPL2");
|
||||||
static FRandom pr_boltspark ("BoltSpark");
|
static FRandom pr_boltspark ("BoltSpark");
|
||||||
static FRandom pr_spawnmace ("SpawnMace");
|
|
||||||
static FRandom pr_macerespawn ("MaceRespawn");
|
static FRandom pr_macerespawn ("MaceRespawn");
|
||||||
static FRandom pr_maceatk ("FireMacePL1");
|
static FRandom pr_maceatk ("FireMacePL1");
|
||||||
static FRandom pr_gatk ("GauntletAttack");
|
static FRandom pr_gatk ("GauntletAttack");
|
||||||
|
@ -343,212 +341,16 @@ void A_GauntletAttack (AActor *actor)
|
||||||
|
|
||||||
#define MAGIC_JUNK 1234
|
#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 -----------------------------------------------------------------
|
// Mace FX4 -----------------------------------------------------------------
|
||||||
|
|
||||||
class AMaceFX4 : public AActor
|
class AMaceFX4 : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AMaceFX4, AActor)
|
DECLARE_CLASS (AMaceFX4, AActor)
|
||||||
public:
|
public:
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
int DoSpecialDamage (AActor *target, int damage);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AMaceFX4::States[] =
|
IMPLEMENT_CLASS (AMaceFX4)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
|
int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -570,79 +372,6 @@ int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
|
||||||
return 1000000; // Something's gonna die
|
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
|
// PROC A_FireMacePL1B
|
||||||
|
@ -666,7 +395,7 @@ void A_FireMacePL1B (AActor *actor)
|
||||||
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
||||||
return;
|
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);
|
- actor->floorclip, ALLOW_REPLACE);
|
||||||
ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/
|
ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/
|
||||||
finetangent[FINEANGLES/4-(actor->pitch>>ANGLETOFINESHIFT)];
|
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].sx = ((pr_maceatk()&3)-2)*FRACUNIT;
|
||||||
player->psprites[ps_weapon].sy = WEAPONTOP+(pr_maceatk()&3)*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));
|
actor->angle+(((pr_maceatk()&7)-4)<<24));
|
||||||
if (ball)
|
if (ball)
|
||||||
{
|
{
|
||||||
|
@ -812,7 +541,7 @@ void A_MaceBallImpact2 (AActor *ball)
|
||||||
ball->momz = (ball->momz * 192) >> 8;
|
ball->momz = (ball->momz * 192) >> 8;
|
||||||
ball->SetState (ball->SpawnState);
|
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;
|
angle = ball->angle+ANG90;
|
||||||
tiny->target = ball->target;
|
tiny->target = ball->target;
|
||||||
tiny->angle = angle;
|
tiny->angle = angle;
|
||||||
|
@ -824,7 +553,7 @@ void A_MaceBallImpact2 (AActor *ball)
|
||||||
tiny->momz = ball->momz;
|
tiny->momz = ball->momz;
|
||||||
P_CheckMissileSpawn (tiny);
|
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;
|
angle = ball->angle-ANG90;
|
||||||
tiny->target = ball->target;
|
tiny->target = ball->target;
|
||||||
tiny->angle = angle;
|
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 -------------------------------------------------------------
|
// Blaster FX 1 -------------------------------------------------------------
|
||||||
|
|
||||||
class ABlasterFX1 : public AActor
|
class ABlasterFX1 : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (ABlasterFX1, AActor)
|
DECLARE_CLASS(ABlasterFX1, AActor)
|
||||||
public:
|
public:
|
||||||
void Tick ();
|
void Tick ();
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
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)
|
int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -1106,69 +729,18 @@ int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
|
||||||
return damage;
|
return damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blaster smoke ------------------------------------------------------------
|
IMPLEMENT_CLASS(ABlasterFX1)
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
// Ripper -------------------------------------------------------------------
|
// Ripper -------------------------------------------------------------------
|
||||||
|
|
||||||
class ARipper : public AActor
|
class ARipper : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (ARipper, AActor)
|
DECLARE_CLASS (ARipper, AActor)
|
||||||
public:
|
public:
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
int DoSpecialDamage (AActor *target, int damage);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState ARipper::States[] =
|
IMPLEMENT_CLASS(ARipper)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
int ARipper::DoSpecialDamage (AActor *target, int damage)
|
int ARipper::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -1183,41 +755,6 @@ int ARipper::DoSpecialDamage (AActor *target, int damage)
|
||||||
return 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
|
// PROC A_FireBlasterPL1
|
||||||
|
@ -1248,36 +785,10 @@ void A_FireBlasterPL1 (AActor *actor)
|
||||||
{
|
{
|
||||||
angle += pr_fb1.Random2() << 18;
|
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);
|
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
|
// PROC A_SpawnRippers
|
||||||
|
@ -1356,7 +867,7 @@ void ABlasterFX1::Tick ()
|
||||||
}
|
}
|
||||||
if (changexy && (pr_bfx1t() < 64))
|
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 ------------------------------------------------------------
|
// --- 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 ------------------------------------------------------------
|
// Horn Rod FX 2 ------------------------------------------------------------
|
||||||
|
|
||||||
class AHornRodFX2 : public AActor
|
class AHornRodFX2 : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AHornRodFX2, AActor)
|
DECLARE_CLASS (AHornRodFX2, AActor)
|
||||||
public:
|
public:
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
int DoSpecialDamage (AActor *target, int damage);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AHornRodFX2::States[] =
|
IMPLEMENT_CLASS (AHornRodFX2)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
|
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -1553,41 +913,12 @@ int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
|
||||||
|
|
||||||
class ARainPillar : public AActor
|
class ARainPillar : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (ARainPillar, AActor)
|
DECLARE_CLASS (ARainPillar, AActor)
|
||||||
public:
|
public:
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
int DoSpecialDamage (AActor *target, int damage);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState ARainPillar::States[] =
|
IMPLEMENT_CLASS (ARainPillar)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
int ARainPillar::DoSpecialDamage (AActor *target, int damage)
|
int ARainPillar::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -1602,16 +933,14 @@ int ARainPillar::DoSpecialDamage (AActor *target, int damage)
|
||||||
|
|
||||||
class ARainTracker : public AInventory
|
class ARainTracker : public AInventory
|
||||||
{
|
{
|
||||||
DECLARE_STATELESS_ACTOR (ARainTracker, AInventory)
|
DECLARE_CLASS (ARainTracker, AInventory)
|
||||||
public:
|
public:
|
||||||
void Serialize (FArchive &arc);
|
void Serialize (FArchive &arc);
|
||||||
AActor *Rain1, *Rain2;
|
AActor *Rain1, *Rain2;
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ARainTracker, Any, -1, 0)
|
IMPLEMENT_CLASS (ARainTracker)
|
||||||
PROP_Inventory_FlagsSet (IF_UNDROPPABLE)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void ARainTracker::Serialize (FArchive &arc)
|
void ARainTracker::Serialize (FArchive &arc)
|
||||||
{
|
{
|
||||||
Super::Serialize (arc);
|
Super::Serialize (arc);
|
||||||
|
@ -1640,7 +969,7 @@ void A_FireSkullRodPL1 (AActor *actor)
|
||||||
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mo = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(AHornRodFX1));
|
mo = P_SpawnPlayerMissile (actor, PClass::FindClass("HornRodFX1"));
|
||||||
// Randomize the first frame
|
// Randomize the first frame
|
||||||
if (mo && pr_fsr1() > 128)
|
if (mo && pr_fsr1() > 128)
|
||||||
{
|
{
|
||||||
|
@ -1822,7 +1151,7 @@ void A_RainImpact (AActor *actor)
|
||||||
{
|
{
|
||||||
if (actor->z > actor->floorz)
|
if (actor->z > actor->floorz)
|
||||||
{
|
{
|
||||||
actor->SetState (&ARainPillar::States[S_RAINAIRXPLR]);
|
actor->SetState (actor->FindState("NotFloor"));
|
||||||
}
|
}
|
||||||
else if (pr_impact() < 40)
|
else if (pr_impact() < 40)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,77 +7,6 @@
|
||||||
static FRandom pr_batspawn ("BatSpawn");
|
static FRandom pr_batspawn ("BatSpawn");
|
||||||
static FRandom pr_batmove ("BatMove");
|
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
|
// Bat Spawner Variables
|
||||||
// special1 frequency counter
|
// special1 frequency counter
|
||||||
|
@ -111,7 +40,7 @@ void A_BatSpawn (AActor *actor)
|
||||||
delta = actor->args[1];
|
delta = actor->args[1];
|
||||||
if (delta==0) delta=1;
|
if (delta==0) delta=1;
|
||||||
angle = actor->angle + (((pr_batspawn()%delta)-(delta>>1))<<24);
|
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)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->args[0] = pr_batspawn()&63; // floatbob index
|
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_sblur ("BishopSpawnBlur");
|
||||||
static FRandom pr_pain ("BishopPainBlur");
|
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
|
// A_BishopAttack
|
||||||
|
@ -264,7 +54,7 @@ void A_BishopAttack2 (AActor *actor)
|
||||||
actor->SetState (actor->SeeState);
|
actor->SetState (actor->SeeState);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ABishopFX));
|
mo = P_SpawnMissile (actor, actor->target, PClass::FindClass("BishopFX"));
|
||||||
if (mo != NULL)
|
if (mo != NULL)
|
||||||
{
|
{
|
||||||
mo->tracer = actor->target;
|
mo->tracer = actor->target;
|
||||||
|
@ -302,17 +92,6 @@ void A_BishopMissileWeave (AActor *actor)
|
||||||
actor->special2 = weaveZ + (weaveXY<<16);
|
actor->special2 = weaveZ + (weaveXY<<16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
//
|
|
||||||
// A_BishopMissileSeek
|
|
||||||
//
|
|
||||||
//============================================================================
|
|
||||||
|
|
||||||
void A_BishopMissileSeek (AActor *actor)
|
|
||||||
{
|
|
||||||
P_SeekerMissile (actor, ANGLE_1*2, ANGLE_1*3);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// A_BishopDecide
|
// A_BishopDecide
|
||||||
|
@ -327,7 +106,7 @@ void A_BishopDecide (AActor *actor)
|
||||||
}
|
}
|
||||||
else
|
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);
|
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)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->angle = actor->angle;
|
mo->angle = actor->angle;
|
||||||
|
@ -408,7 +187,7 @@ void A_BishopPuff (AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *mo;
|
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)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->momz = FRACUNIT/2;
|
mo->momz = FRACUNIT/2;
|
||||||
|
@ -427,27 +206,15 @@ void A_BishopPainBlur (AActor *actor)
|
||||||
|
|
||||||
if (pr_pain() < 64)
|
if (pr_pain() < 64)
|
||||||
{
|
{
|
||||||
actor->SetState (&ABishop::States[S_BISHOP_BLUR]);
|
actor->SetState (actor->FindState ("Blur"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fixed_t x = actor->x + (pr_pain.Random2()<<12);
|
fixed_t x = actor->x + (pr_pain.Random2()<<12);
|
||||||
fixed_t y = actor->y + (pr_pain.Random2()<<12);
|
fixed_t y = actor->y + (pr_pain.Random2()<<12);
|
||||||
fixed_t z = actor->z + (pr_pain.Random2()<<11);
|
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)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->angle = actor->angle;
|
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
|
class AArtiBlastRadius : public AInventory
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AArtiBlastRadius, AInventory)
|
DECLARE_CLASS (AArtiBlastRadius, AInventory)
|
||||||
public:
|
public:
|
||||||
bool Use (bool pickup);
|
bool Use (bool pickup);
|
||||||
protected:
|
protected:
|
||||||
void BlastActor (AActor *victim, fixed_t strength);
|
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)
|
IMPLEMENT_CLASS (AArtiBlastRadius)
|
||||||
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
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -182,7 +132,7 @@ void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength)
|
||||||
x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]);
|
x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]);
|
||||||
y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]);
|
y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]);
|
||||||
z = victim->z - victim->floorclip + (victim->height>>1);
|
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)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->momx = victim->momx;
|
mo->momx = victim->momx;
|
||||||
|
|
|
@ -10,35 +10,12 @@
|
||||||
|
|
||||||
class AArtiBoostArmor : public AInventory
|
class AArtiBoostArmor : public AInventory
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AArtiBoostArmor, AInventory)
|
DECLARE_CLASS (AArtiBoostArmor, AInventory)
|
||||||
public:
|
public:
|
||||||
bool Use (bool pickup);
|
bool Use (bool pickup);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AArtiBoostArmor::States[] =
|
IMPLEMENT_CLASS (AArtiBoostArmor)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
bool AArtiBoostArmor::Use (bool pickup)
|
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_CFlamePuff (AActor *);
|
||||||
void A_CFlameMissile (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 ------------------------------------------------------------
|
// Flame Missile ------------------------------------------------------------
|
||||||
|
|
||||||
class ACFlameMissile : public AActor
|
class ACFlameMissile : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (ACFlameMissile, AActor)
|
DECLARE_CLASS (ACFlameMissile, AActor)
|
||||||
public:
|
public:
|
||||||
void BeginPlay ();
|
void BeginPlay ();
|
||||||
void Tick ();
|
void Tick ();
|
||||||
};
|
};
|
||||||
|
|
||||||
FState ACFlameMissile::States[] =
|
IMPLEMENT_CLASS (ACFlameMissile)
|
||||||
{
|
|
||||||
#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
|
|
||||||
|
|
||||||
void ACFlameMissile::BeginPlay ()
|
void ACFlameMissile::BeginPlay ()
|
||||||
{
|
{
|
||||||
|
@ -347,7 +94,7 @@ void ACFlameMissile::Tick ()
|
||||||
{
|
{
|
||||||
newz = floorz;
|
newz = floorz;
|
||||||
}
|
}
|
||||||
mo = Spawn<ACFlameFloor> (x, y, newz, ALLOW_REPLACE);
|
mo = Spawn ("CFlameFloor", x, y, newz, ALLOW_REPLACE);
|
||||||
if (mo)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->angle = angle;
|
mo->angle = angle;
|
||||||
|
@ -432,7 +179,7 @@ void A_CFlameMissile (AActor *actor)
|
||||||
{
|
{
|
||||||
an = (i*ANG45)>>ANGLETOFINESHIFT;
|
an = (i*ANG45)>>ANGLETOFINESHIFT;
|
||||||
an90 = (i*ANG45+ANG90)>>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->y+FixedMul(dist, finesine[an]),
|
||||||
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
||||||
if (mo)
|
if (mo)
|
||||||
|
@ -443,7 +190,7 @@ void A_CFlameMissile (AActor *actor)
|
||||||
mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);
|
mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);
|
||||||
mo->tics -= pr_missile()&3;
|
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->y-FixedMul(dist, finesine[an]),
|
||||||
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
|
||||||
if(mo)
|
if(mo)
|
||||||
|
@ -455,7 +202,7 @@ void A_CFlameMissile (AActor *actor)
|
||||||
mo->tics -= pr_missile()&3;
|
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);
|
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
|
// A_FSwordFlames
|
||||||
|
@ -397,3 +379,24 @@ void AFighterWeaponPiece::BeginPlay ()
|
||||||
Super::BeginPlay ();
|
Super::BeginPlay ();
|
||||||
FourthWeaponClass = RUNTIME_CLASS(AFWeapQuietus);
|
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_CheckThrowBomb (AActor *);
|
||||||
void A_CheckThrowBomb2 (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) ---------------------------------------
|
// Fire Bomb (Flechette used by Mage) ---------------------------------------
|
||||||
|
|
||||||
class AFireBomb : public AActor
|
class AFireBomb : public AActor
|
||||||
|
@ -86,58 +62,6 @@ IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0)
|
||||||
PROP_DeathSound ("FlechetteExplode")
|
PROP_DeathSound ("FlechetteExplode")
|
||||||
END_DEFAULTS
|
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) ------------------------------------------
|
// Poison Bag Artifact (Flechette) ------------------------------------------
|
||||||
|
|
||||||
class AArtiPoisonBag : public AInventory
|
class AArtiPoisonBag : public AInventory
|
||||||
|
@ -184,7 +108,7 @@ bool AArtiPoisonBag1::Use (bool pickup)
|
||||||
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
|
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
|
||||||
AActor *mo;
|
AActor *mo;
|
||||||
|
|
||||||
mo = Spawn<APoisonBag> (
|
mo = Spawn ("PoisonBag",
|
||||||
Owner->x+16*finecosine[angle],
|
Owner->x+16*finecosine[angle],
|
||||||
Owner->y+24*finesine[angle], Owner->z-
|
Owner->y+24*finesine[angle], Owner->z-
|
||||||
Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
|
Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
|
||||||
|
@ -243,7 +167,7 @@ bool AArtiPoisonBag3::Use (bool pickup)
|
||||||
{
|
{
|
||||||
AActor *mo;
|
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);
|
Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0), ALLOW_REPLACE);
|
||||||
if (mo)
|
if (mo)
|
||||||
{
|
{
|
||||||
|
@ -547,7 +471,7 @@ void A_CheckThrowBomb2 (AActor *actor)
|
||||||
TMulScale32 (actor->momx, actor->momx, actor->momy, actor->momy, actor->momz, actor->momz)
|
TMulScale32 (actor->momx, actor->momx, actor->momy, actor->momy, actor->momz, actor->momz)
|
||||||
< (3*3)/(2*2))
|
< (3*3)/(2*2))
|
||||||
{
|
{
|
||||||
actor->SetState (&AThrowingBomb::States[S_THROWINGBOMB7]);
|
actor->SetState (actor->SpawnState + 6);
|
||||||
actor->z = actor->floorz;
|
actor->z = actor->floorz;
|
||||||
actor->momz = 0;
|
actor->momz = 0;
|
||||||
actor->flags2 &= ~MF2_BOUNCETYPE;
|
actor->flags2 &= ~MF2_BOUNCETYPE;
|
||||||
|
|
|
@ -1284,7 +1284,7 @@ void A_SorcFX2Orbit (AActor *actor)
|
||||||
void A_SpawnBishop(AActor *actor)
|
void A_SpawnBishop(AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *mo;
|
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 (mo)
|
||||||
{
|
{
|
||||||
if (!P_TestMobjLocation(mo))
|
if (!P_TestMobjLocation(mo))
|
||||||
|
|
|
@ -19,13 +19,6 @@ public:
|
||||||
void BeginPlay ();
|
void BeginPlay ();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ABishop : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ABishop, AActor)
|
|
||||||
public:
|
|
||||||
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
|
|
||||||
};
|
|
||||||
|
|
||||||
class AHeresiarch : public AActor
|
class AHeresiarch : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AHeresiarch, 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
|
// MStaffSpawn
|
||||||
|
@ -534,3 +499,41 @@ static AActor *FrontBlockCheck (AActor *mo, int index)
|
||||||
}
|
}
|
||||||
return NULL;
|
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")
|
PROP_Inventory_PickupMessage("$TXT_ARTISUMMON")
|
||||||
END_DEFAULTS
|
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)
|
bool AArtiDarkServant::Use (bool pickup)
|
||||||
{
|
{
|
||||||
AActor *mo = P_SpawnPlayerMissile (Owner, RUNTIME_CLASS(ASummoningDoll));
|
AActor *mo = P_SpawnPlayerMissile (Owner, PClass::FindClass ("SummoningDoll"));
|
||||||
if (mo)
|
if (mo)
|
||||||
{
|
{
|
||||||
mo->target = Owner;
|
mo->target = Owner;
|
||||||
|
@ -158,7 +94,7 @@ void A_Summon (AActor *actor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make smoke puff
|
// 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);
|
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);
|
wantFast = !!G_SkillProperty(SKILLP_FastMonsters);
|
||||||
GameSpeed = wantFast ? SPEED_Fast : SPEED_Normal;
|
GameSpeed = wantFast ? SPEED_Fast : SPEED_Normal;
|
||||||
|
|
||||||
if (oldSpeed != GameSpeed)
|
|
||||||
{
|
|
||||||
FActorInfo::StaticSpeedSet ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!savegamerestore)
|
if (!savegamerestore)
|
||||||
{
|
{
|
||||||
if (!netgame)
|
if (!netgame)
|
||||||
|
|
|
@ -323,165 +323,6 @@ void AMinotaurFriend::NoBlockingSet ()
|
||||||
// Do not drop anything
|
// 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 ----------------------------------------
|
// Action functions for the minotaur ----------------------------------------
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -641,16 +482,20 @@ void A_MinotaurAtk2 (AActor *actor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
z = actor->z + 40*FRACUNIT;
|
z = actor->z + 40*FRACUNIT;
|
||||||
mo = P_SpawnMissileZ (actor, z, actor->target, RUNTIME_CLASS(AMinotaurFX1));
|
const PClass *fx = PClass::FindClass("MinotaurFX1");
|
||||||
if (mo != NULL)
|
if (fx)
|
||||||
{
|
{
|
||||||
// S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM);
|
mo = P_SpawnMissileZ (actor, z, actor->target, fx);
|
||||||
momz = mo->momz;
|
if (mo != NULL)
|
||||||
angle = mo->angle;
|
{
|
||||||
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle-(ANG45/8), momz);
|
// S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM);
|
||||||
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle+(ANG45/8), momz);
|
momz = mo->momz;
|
||||||
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle-(ANG45/16), momz);
|
angle = mo->angle;
|
||||||
P_SpawnMissileAngleZ (actor, z, RUNTIME_CLASS(AMinotaurFX1), angle+(ANG45/16), momz);
|
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
|
else
|
||||||
{
|
{
|
||||||
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(AMinotaurFX2));
|
mo = P_SpawnMissile (actor, actor->target, PClass::FindClass("MinotaurFX2"));
|
||||||
if (mo != NULL)
|
if (mo != NULL)
|
||||||
{
|
{
|
||||||
S_Sound (mo, CHAN_WEAPON, "minotaur/attack1", 1, ATTN_NORM);
|
S_Sound (mo, CHAN_WEAPON, "minotaur/attack1", 1, ATTN_NORM);
|
||||||
|
@ -715,7 +560,7 @@ void A_MntrFloorFire (AActor *actor)
|
||||||
actor->z = actor->floorz;
|
actor->z = actor->floorz;
|
||||||
x = actor->x + (pr_fire.Random2 () << 10);
|
x = actor->x + (pr_fire.Random2 () << 10);
|
||||||
y = actor->y + (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->target = actor->target;
|
||||||
mo->momx = 1; // Force block checking
|
mo->momx = 1; // Force block checking
|
||||||
P_CheckMissileSpawn (mo);
|
P_CheckMissileSpawn (mo);
|
||||||
|
@ -967,5 +812,5 @@ void A_SmokePuffEntry(mobj_t *actor)
|
||||||
|
|
||||||
void A_SmokePuffExit (AActor *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 "info.h"
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
|
#include "thingdef/thingdef.h"
|
||||||
|
|
||||||
static FRandom pr_orbit ("Orbit");
|
static FRandom pr_orbit ("Orbit");
|
||||||
|
|
||||||
void A_BridgeOrbit (AActor *);
|
|
||||||
void A_BridgeInit (AActor *);
|
|
||||||
|
|
||||||
// The Hexen (and Heretic) version of the bridge spawns extra floating
|
// Custom bridge --------------------------------------------------------
|
||||||
// "balls" orbiting the bridge. The Doom version only shows the bridge
|
/*
|
||||||
// itself.
|
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 ACustomBridge : public AActor
|
||||||
|
|
||||||
class ABridgeBall : 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]),
|
if (args[2]) // Hexen bridge if there are balls
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
def->SpawnState = &ABridge::States[S_DBRIDGE];
|
SetState(SeeState);
|
||||||
def->radius = 36 * FRACUNIT;
|
radius = args[0] ? args[0] << FRACBITS : 32 * FRACUNIT;
|
||||||
def->height = 4 * FRACUNIT;
|
height = args[1] ? args[1] << FRACBITS : 2 * FRACUNIT;
|
||||||
def->RenderStyle = STYLE_Normal;
|
|
||||||
}
|
}
|
||||||
else
|
else // No balls? Then a Doom bridge.
|
||||||
{
|
{
|
||||||
def->SpawnState = &ABridge::States[S_BRIDGE];
|
radius = args[0] ? args[0] << FRACBITS : 36 * FRACUNIT;
|
||||||
def->radius = 32 * FRACUNIT;
|
height = args[1] ? args[1] << FRACBITS : 4 * FRACUNIT;
|
||||||
def->height = 2 * FRACUNIT;
|
RenderStyle = STYLE_Normal;
|
||||||
def->RenderStyle = STYLE_None;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,21 +77,47 @@ void A_BridgeOrbit (AActor *self)
|
||||||
// independantly of a Bridge actor.
|
// independantly of a Bridge actor.
|
||||||
return;
|
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)
|
if (self->target->special1)
|
||||||
{
|
{
|
||||||
self->SetState (NULL);
|
self->SetState (NULL);
|
||||||
}
|
}
|
||||||
// Every five tics, Hexen moved the ball 3/256th of a revolution.
|
self->angle += rotationspeed;
|
||||||
self->angle += ANGLE_45/32*3/5;
|
self->x = self->target->x + rotationradius * finecosine[self->angle >> ANGLETOFINESHIFT];
|
||||||
self->x = self->target->x + ORBIT_RADIUS * finecosine[self->angle >> ANGLETOFINESHIFT];
|
self->y = self->target->y + rotationradius * finesine[self->angle >> ANGLETOFINESHIFT];
|
||||||
self->y = self->target->y + ORBIT_RADIUS * finesine[self->angle >> ANGLETOFINESHIFT];
|
|
||||||
self->z = self->target->z;
|
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)
|
void A_BridgeInit (AActor *self)
|
||||||
{
|
{
|
||||||
angle_t startangle;
|
angle_t startangle;
|
||||||
AActor *ball1, *ball2, *ball3;
|
AActor *ball;
|
||||||
fixed_t cx, cy, cz;
|
fixed_t cx, cy, cz;
|
||||||
|
|
||||||
cx = self->x;
|
cx = self->x;
|
||||||
|
@ -123,56 +126,37 @@ void A_BridgeInit (AActor *self)
|
||||||
startangle = pr_orbit() << 24;
|
startangle = pr_orbit() << 24;
|
||||||
self->special1 = 0;
|
self->special1 = 0;
|
||||||
|
|
||||||
// Spawn triad into world
|
// Spawn triad into world -- may be more than a triad now.
|
||||||
ball1 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
|
int ballcount = self->args[2]==0 ? 3 : self->args[2];
|
||||||
ball1->angle = startangle;
|
const PClass *balltype = GetBallType();
|
||||||
ball1->target = self;
|
for (int i = 0; i < ballcount; i++)
|
||||||
|
{
|
||||||
ball2 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
|
ball = Spawn(balltype, cx, cy, cz, ALLOW_REPLACE);
|
||||||
ball2->angle = startangle + ANGLE_45/32*85;
|
ball->angle = startangle + (ANGLE_45/32) * (256/ballcount) * i;
|
||||||
ball2->target = self;
|
ball->target = self;
|
||||||
|
A_BridgeOrbit(ball);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* never used
|
||||||
void A_BridgeRemove (AActor *self)
|
void A_BridgeRemove (AActor *self)
|
||||||
{
|
{
|
||||||
self->special1 = true; // Removing the bridge
|
self->special1 = true; // Removing the bridge
|
||||||
self->flags &= ~MF_SOLID;
|
self->flags &= ~MF_SOLID;
|
||||||
self->SetState (&ABridge::States[S_FREE_BRIDGE]);
|
self->SetState (&ABridge::States[S_FREE_BRIDGE]);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Invisible bridge --------------------------------------------------------
|
// Invisible bridge --------------------------------------------------------
|
||||||
|
|
||||||
class AInvisibleBridge : public ABridge
|
class AInvisibleBridge : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AInvisibleBridge, ABridge)
|
DECLARE_CLASS (AInvisibleBridge, AActor)
|
||||||
public:
|
public:
|
||||||
void BeginPlay ();
|
void BeginPlay ();
|
||||||
void Tick ()
|
|
||||||
{
|
|
||||||
Super::Tick ();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AInvisibleBridge::States[] =
|
IMPLEMENT_CLASS(AInvisibleBridge)
|
||||||
{
|
|
||||||
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
|
|
||||||
|
|
||||||
void AInvisibleBridge::BeginPlay ()
|
void AInvisibleBridge::BeginPlay ()
|
||||||
{
|
{
|
||||||
|
@ -183,36 +167,3 @@ void AInvisibleBridge::BeginPlay ()
|
||||||
height = args[1] << FRACBITS;
|
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 "templates.h"
|
||||||
#include "a_strifeglobal.h"
|
#include "a_strifeglobal.h"
|
||||||
#include "a_morph.h"
|
#include "a_morph.h"
|
||||||
|
#include "a_specialspot.h"
|
||||||
|
|
||||||
static FRandom pr_restore ("RestorePos");
|
static FRandom pr_restore ("RestorePos");
|
||||||
|
|
||||||
|
@ -489,7 +490,7 @@ void AInventory::Tick ()
|
||||||
void AInventory::Serialize (FArchive &arc)
|
void AInventory::Serialize (FArchive &arc)
|
||||||
{
|
{
|
||||||
Super::Serialize (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 ()
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,6 @@ public:
|
||||||
virtual bool ShouldRespawn ();
|
virtual bool ShouldRespawn ();
|
||||||
virtual bool ShouldStay ();
|
virtual bool ShouldStay ();
|
||||||
virtual void Hide ();
|
virtual void Hide ();
|
||||||
virtual bool DoRespawn ();
|
|
||||||
virtual bool TryPickup (AActor *toucher);
|
virtual bool TryPickup (AActor *toucher);
|
||||||
virtual void DoPickupSpecial (AActor *toucher);
|
virtual void DoPickupSpecial (AActor *toucher);
|
||||||
virtual bool SpecialDropAction (AActor *dropper);
|
virtual bool SpecialDropAction (AActor *dropper);
|
||||||
|
@ -127,6 +126,7 @@ public:
|
||||||
virtual const char *PickupMessage ();
|
virtual const char *PickupMessage ();
|
||||||
virtual void PlayPickupSound (AActor *toucher);
|
virtual void PlayPickupSound (AActor *toucher);
|
||||||
|
|
||||||
|
bool DoRespawn ();
|
||||||
AInventory *PrevItem(); // Returns the item preceding this one in the list.
|
AInventory *PrevItem(); // Returns the item preceding this one in the list.
|
||||||
AInventory *PrevInv(); // Returns the previous item with IF_INVBAR set.
|
AInventory *PrevInv(); // Returns the previous item with IF_INVBAR set.
|
||||||
AInventory *NextInv(); // Returns the next 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
|
int RespawnTics; // Tics from pickup time to respawn time
|
||||||
FTextureID Icon; // Icon to show on status bar or HUD
|
FTextureID Icon; // Icon to show on status bar or HUD
|
||||||
int DropTime; // Countdown after dropping
|
int DropTime; // Countdown after dropping
|
||||||
|
const PClass *SpawnPointClass; // For respawning like Heretic's mace
|
||||||
|
|
||||||
DWORD ItemFlags;
|
DWORD ItemFlags;
|
||||||
const PClass *PickupFlash; // actor to spawn as pickup flash
|
const PClass *PickupFlash; // actor to spawn as pickup flash
|
||||||
|
|
|
@ -37,12 +37,14 @@
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "statnums.h"
|
#include "statnums.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
|
#include "thingdef/thingdef.h"
|
||||||
|
|
||||||
static FRandom pr_spot ("SpecialSpot");
|
static FRandom pr_spot ("SpecialSpot");
|
||||||
|
static FRandom pr_spawnmace ("SpawnMace");
|
||||||
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(DSpotState)
|
IMPLEMENT_CLASS(DSpotState)
|
||||||
IMPLEMENT_ABSTRACT_ACTOR (ASpecialSpot)
|
IMPLEMENT_CLASS (ASpecialSpot)
|
||||||
TObjPtr<DSpotState> DSpotState::SpotState;
|
TObjPtr<DSpotState> DSpotState::SpotState;
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -146,6 +148,7 @@ struct FSpotList
|
||||||
|
|
||||||
ASpecialSpot *GetSpotWithMinDistance(fixed_t x, fixed_t y, fixed_t distance)
|
ASpecialSpot *GetSpotWithMinDistance(fixed_t x, fixed_t y, fixed_t distance)
|
||||||
{
|
{
|
||||||
|
if (Spots.Size() == 0) return NULL;
|
||||||
int i = pr_spot() % Spots.Size();
|
int i = pr_spot() % Spots.Size();
|
||||||
int initial = i;
|
int initial = i;
|
||||||
|
|
||||||
|
@ -166,7 +169,7 @@ struct FSpotList
|
||||||
|
|
||||||
ASpecialSpot *GetRandomSpot(bool onlyfirst)
|
ASpecialSpot *GetRandomSpot(bool onlyfirst)
|
||||||
{
|
{
|
||||||
if (!numcalls)
|
if (Spots.Size() && !numcalls)
|
||||||
{
|
{
|
||||||
int i = pr_spot() % Spots.Size();
|
int i = pr_spot() % Spots.Size();
|
||||||
numcalls++;
|
numcalls++;
|
||||||
|
@ -370,3 +373,65 @@ void ASpecialSpot::Destroy()
|
||||||
if (state != NULL) state->RemoveSpot(this);
|
if (state != NULL) state->RemoveSpot(this);
|
||||||
Super::Destroy();
|
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
|
class ASpecialSpot : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_STATELESS_ACTOR (ASpecialSpot, AActor)
|
DECLARE_CLASS (ASpecialSpot, AActor)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ struct RenderContext
|
||||||
void (APIENTRY * SetTextureMode) (int type);
|
void (APIENTRY * SetTextureMode) (int type);
|
||||||
void (APIENTRY * ArrayPointer) (void * data, int stride);
|
void (APIENTRY * ArrayPointer) (void * data, int stride);
|
||||||
void (APIENTRY * PrintStartupLog) ();
|
void (APIENTRY * PrintStartupLog) ();
|
||||||
bool (APIENTRY * SetVSync) (int on);
|
BOOL (APIENTRY * SetVSync) (int on);
|
||||||
#ifndef unix
|
#ifndef unix
|
||||||
bool (APIENTRY * InitHardware) (HWND, bool allowsoftware, bool nostencil, int multisample);
|
bool (APIENTRY * InitHardware) (HWND, bool allowsoftware, bool nostencil, int multisample);
|
||||||
void (APIENTRY * Shutdown) ();
|
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 StaticInit ();
|
||||||
static void StaticGameSet ();
|
static void StaticGameSet ();
|
||||||
static void StaticSetActorNums ();
|
static void StaticSetActorNums ();
|
||||||
static void StaticSpeedSet ();
|
|
||||||
|
|
||||||
void BuildDefaults ();
|
void BuildDefaults ();
|
||||||
void ApplyDefaults (BYTE *defaults);
|
void ApplyDefaults (BYTE *defaults);
|
||||||
|
|
|
@ -69,7 +69,6 @@ typedef void (*voidfunc_)();
|
||||||
|
|
||||||
#pragma data_seg(".areg$u") // ActorInfo initializer list
|
#pragma data_seg(".areg$u") // ActorInfo initializer list
|
||||||
#pragma data_seg(".greg$u") // AT_GAME_SET list
|
#pragma data_seg(".greg$u") // AT_GAME_SET list
|
||||||
#pragma data_seg(".sreg$u") // AT_SPEED_SET list
|
|
||||||
#pragma data_seg()
|
#pragma data_seg()
|
||||||
|
|
||||||
#define DOOMEDNUMOF(actor) actor##ActorInfo.DoomEdNum
|
#define DOOMEDNUMOF(actor) actor##ActorInfo.DoomEdNum
|
||||||
|
@ -104,12 +103,6 @@ typedef void (*voidfunc_)();
|
||||||
__declspec(allocate(".greg$u")) voidfunc_ ns##_gsr = ns##_gs; \
|
__declspec(allocate(".greg$u")) voidfunc_ ns##_gsr = ns##_gs; \
|
||||||
void 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
|
#else
|
||||||
|
|
||||||
/***********************************************
|
/***********************************************
|
||||||
|
@ -151,11 +144,6 @@ extern void ApplyActorDefault (int defnum, int dataint);
|
||||||
|
|
||||||
//typedef void (*speedfunc)(EGameSpeed);
|
//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
|
#endif
|
||||||
|
|
||||||
// Common macros
|
// Common macros
|
||||||
|
|
|
@ -78,7 +78,7 @@
|
||||||
struct MusPlayingInfo
|
struct MusPlayingInfo
|
||||||
{
|
{
|
||||||
FString name;
|
FString name;
|
||||||
void *handle;
|
MusInfo *handle;
|
||||||
int baseorder;
|
int baseorder;
|
||||||
bool loop;
|
bool loop;
|
||||||
};
|
};
|
||||||
|
@ -1838,8 +1838,10 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
{
|
{
|
||||||
if (order != mus_playing.baseorder)
|
if (order != mus_playing.baseorder)
|
||||||
{
|
{
|
||||||
mus_playing.baseorder =
|
if (mus_playing.handle->SetSubsong(order))
|
||||||
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
|
{
|
||||||
|
mus_playing.baseorder = order;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1862,7 +1864,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
int lumpnum = -1;
|
int lumpnum = -1;
|
||||||
int offset = 0, length = 0;
|
int offset = 0, length = 0;
|
||||||
int device = MDEV_DEFAULT;
|
int device = MDEV_DEFAULT;
|
||||||
void *handle = NULL;
|
MusInfo *handle = NULL;
|
||||||
|
|
||||||
int *devp = MidiDevices.CheckKey(FName(musicname));
|
int *devp = MidiDevices.CheckKey(FName(musicname));
|
||||||
if (devp != NULL) device = *devp;
|
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.loop = looping;
|
||||||
mus_playing.name = "";
|
mus_playing.name = "";
|
||||||
mus_playing.baseorder = 0;
|
mus_playing.baseorder = order;
|
||||||
LastSong = musicname;
|
LastSong = musicname;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1956,13 +1958,13 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
|
|
||||||
mus_playing.loop = looping;
|
mus_playing.loop = looping;
|
||||||
mus_playing.name = musicname;
|
mus_playing.name = musicname;
|
||||||
|
mus_playing.baseorder = 0;
|
||||||
LastSong = "";
|
LastSong = "";
|
||||||
|
|
||||||
if (mus_playing.handle != 0)
|
if (mus_playing.handle != 0)
|
||||||
{ // play it
|
{ // play it
|
||||||
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname));
|
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname), order);
|
||||||
mus_playing.baseorder =
|
mus_playing.baseorder = order;
|
||||||
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -454,21 +454,16 @@ public:
|
||||||
Volume = volume;
|
Volume = volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the current order number for a MOD-type song, or the position in ms
|
// Sets the position in ms.
|
||||||
// for anything else.
|
bool SetPosition(unsigned int ms_pos)
|
||||||
bool SetPosition(int pos)
|
|
||||||
{
|
{
|
||||||
FMOD_SOUND_TYPE type;
|
return FMOD_OK == Channel->setPosition(ms_pos, FMOD_TIMEUNIT_MS);
|
||||||
|
}
|
||||||
|
|
||||||
if (FMOD_OK == Stream->getFormat(&type, NULL, NULL, NULL) &&
|
// Sets the order number for MOD formats.
|
||||||
(type == FMOD_SOUND_TYPE_IT ||
|
bool SetOrder(int order_pos)
|
||||||
type == FMOD_SOUND_TYPE_MOD ||
|
{
|
||||||
type == FMOD_SOUND_TYPE_S3M ||
|
return FMOD_OK == Channel->setPosition(order_pos, FMOD_TIMEUNIT_MODORDER);
|
||||||
type == FMOD_SOUND_TYPE_XM))
|
|
||||||
{
|
|
||||||
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MODORDER);
|
|
||||||
}
|
|
||||||
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FString GetStats()
|
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;
|
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;
|
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;
|
saved_relative_volume = relative_volume = rel_vol;
|
||||||
info->Stop ();
|
info->Stop ();
|
||||||
info->Play (_looping ? true : false);
|
info->Play (!!_looping, subsong);
|
||||||
info->m_NotStartedYet = false;
|
info->m_NotStartedYet = false;
|
||||||
|
|
||||||
if (info->m_Status == MusInfo::STATE_Playing)
|
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;
|
StreamSong *song;
|
||||||
|
|
||||||
|
@ -269,7 +274,7 @@ void *I_RegisterURLSong (const char *url)
|
||||||
return NULL;
|
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;
|
FILE *file;
|
||||||
MusInfo *info = NULL;
|
MusInfo *info = NULL;
|
||||||
|
@ -539,7 +544,7 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *I_RegisterCDSong (int track, int id)
|
MusInfo *I_RegisterCDSong (int track, int id)
|
||||||
{
|
{
|
||||||
MusInfo *info = new CDSong (track, id);
|
MusInfo *info = new CDSong (track, id);
|
||||||
|
|
||||||
|
@ -635,7 +640,7 @@ CCMD (writeopl)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dumper->Play(false);
|
dumper->Play(false, 0); // FIXME: Remember subsong.
|
||||||
delete dumper;
|
delete dumper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -673,7 +678,7 @@ CCMD (writewave)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dumper->Play(false);
|
dumper->Play(false, 0); // FIXME: Remember subsong
|
||||||
delete dumper;
|
delete dumper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,14 +54,15 @@ void I_PauseSong (void *handle);
|
||||||
void I_ResumeSong (void *handle);
|
void I_ResumeSong (void *handle);
|
||||||
|
|
||||||
// Registers a song handle to song data.
|
// Registers a song handle to song data.
|
||||||
void *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
|
class MusInfo;
|
||||||
void *I_RegisterCDSong (int track, int cdid = 0);
|
MusInfo *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
|
||||||
void *I_RegisterURLSong (const char *url);
|
MusInfo *I_RegisterCDSong (int track, int cdid = 0);
|
||||||
|
MusInfo *I_RegisterURLSong (const char *url);
|
||||||
|
|
||||||
// Called by anything that wishes to start music.
|
// Called by anything that wishes to start music.
|
||||||
// Plays a song, and when the song is done,
|
// Plays a song, and when the song is done,
|
||||||
// starts playing it again in an endless loop.
|
// 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.
|
// Stops a song.
|
||||||
void I_StopSong (void *handle);
|
void I_StopSong (void *handle);
|
||||||
|
@ -75,4 +76,38 @@ bool I_SetSongPosition (void *handle, int order);
|
||||||
// Is the song still playing?
|
// Is the song still playing?
|
||||||
bool I_QrySongPlaying (void *handle);
|
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__
|
#endif //__I_MUSIC_H__
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "c_cvars.h"
|
#include "c_cvars.h"
|
||||||
#include "mus2midi.h"
|
#include "mus2midi.h"
|
||||||
#include "i_sound.h"
|
#include "i_sound.h"
|
||||||
|
#include "i_music.h"
|
||||||
|
|
||||||
void I_InitMusicWin32 ();
|
void I_InitMusicWin32 ();
|
||||||
void I_ShutdownMusicWin32 ();
|
void I_ShutdownMusicWin32 ();
|
||||||
|
@ -29,38 +30,6 @@ extern float relative_volume;
|
||||||
EXTERN_CVAR (Float, timidity_mastervolume)
|
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 -------------
|
// A device that provides a WinMM-like MIDI streaming interface -------------
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
@ -302,7 +271,7 @@ public:
|
||||||
|
|
||||||
void MusicVolumeChanged();
|
void MusicVolumeChanged();
|
||||||
void TimidityVolumeChanged();
|
void TimidityVolumeChanged();
|
||||||
void Play(bool looping);
|
void Play(bool looping, int subsong);
|
||||||
void Pause();
|
void Pause();
|
||||||
void Resume();
|
void Resume();
|
||||||
void Stop();
|
void Stop();
|
||||||
|
@ -441,14 +410,15 @@ class StreamSong : public MusInfo
|
||||||
public:
|
public:
|
||||||
StreamSong (const char *file, int offset, int length);
|
StreamSong (const char *file, int offset, int length);
|
||||||
~StreamSong ();
|
~StreamSong ();
|
||||||
void Play (bool looping);
|
void Play (bool looping, int subsong);
|
||||||
void Pause ();
|
void Pause ();
|
||||||
void Resume ();
|
void Resume ();
|
||||||
void Stop ();
|
void Stop ();
|
||||||
bool IsPlaying ();
|
bool IsPlaying ();
|
||||||
bool IsMIDI () const { return false; }
|
bool IsMIDI () const { return false; }
|
||||||
bool IsValid () const { return m_Stream != NULL; }
|
bool IsValid () const { return m_Stream != NULL; }
|
||||||
bool SetPosition (int order);
|
bool SetPosition (unsigned int pos);
|
||||||
|
bool SetSubsong (int subsong);
|
||||||
FString GetStats();
|
FString GetStats();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -464,7 +434,7 @@ class TimiditySong : public StreamSong
|
||||||
public:
|
public:
|
||||||
TimiditySong (FILE *file, char * musiccache, int length);
|
TimiditySong (FILE *file, char * musiccache, int length);
|
||||||
~TimiditySong ();
|
~TimiditySong ();
|
||||||
void Play (bool looping);
|
void Play (bool looping, int subsong);
|
||||||
void Stop ();
|
void Stop ();
|
||||||
bool IsPlaying ();
|
bool IsPlaying ();
|
||||||
bool IsValid () const { return CommandLine.Len() > 0; }
|
bool IsValid () const { return CommandLine.Len() > 0; }
|
||||||
|
@ -502,7 +472,7 @@ class OPLMUSSong : public StreamSong
|
||||||
public:
|
public:
|
||||||
OPLMUSSong (FILE *file, char *musiccache, int length);
|
OPLMUSSong (FILE *file, char *musiccache, int length);
|
||||||
~OPLMUSSong ();
|
~OPLMUSSong ();
|
||||||
void Play (bool looping);
|
void Play (bool looping, int subsong);
|
||||||
bool IsPlaying ();
|
bool IsPlaying ();
|
||||||
bool IsValid () const;
|
bool IsValid () const;
|
||||||
void ResetChips ();
|
void ResetChips ();
|
||||||
|
@ -530,7 +500,7 @@ class CDSong : public MusInfo
|
||||||
public:
|
public:
|
||||||
CDSong (int track, int id);
|
CDSong (int track, int id);
|
||||||
~CDSong ();
|
~CDSong ();
|
||||||
void Play (bool looping);
|
void Play (bool looping, int subsong);
|
||||||
void Pause ();
|
void Pause ();
|
||||||
void Resume ();
|
void Resume ();
|
||||||
void Stop ();
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,8 @@ public:
|
||||||
virtual bool SetPaused(bool paused) = 0;
|
virtual bool SetPaused(bool paused) = 0;
|
||||||
virtual unsigned int GetPosition() = 0;
|
virtual unsigned int GetPosition() = 0;
|
||||||
virtual bool IsEnded() = 0;
|
virtual bool IsEnded() = 0;
|
||||||
virtual bool SetPosition(int pos);
|
virtual bool SetPosition(unsigned int pos);
|
||||||
|
virtual bool SetOrder(int order);
|
||||||
virtual FString GetStats();
|
virtual FString GetStats();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "i_musicinterns.h"
|
#include "i_musicinterns.h"
|
||||||
#include "i_cd.h"
|
#include "i_cd.h"
|
||||||
|
|
||||||
void CDSong::Play (bool looping)
|
void CDSong::Play (bool looping, int subsong)
|
||||||
{
|
{
|
||||||
m_Status = STATE_Stopped;
|
m_Status = STATE_Stopped;
|
||||||
m_Looping = looping;
|
m_Looping = looping;
|
||||||
|
|
|
@ -45,8 +45,9 @@ class input_mod : public StreamSong
|
||||||
public:
|
public:
|
||||||
input_mod(DUH *myduh);
|
input_mod(DUH *myduh);
|
||||||
~input_mod();
|
~input_mod();
|
||||||
bool SetPosition(int order);
|
//bool SetPosition(int ms);
|
||||||
void Play(bool looping);
|
bool SetSubsong(int subsong);
|
||||||
|
void Play(bool looping, int subsong);
|
||||||
FString GetStats();
|
FString GetStats();
|
||||||
|
|
||||||
FString Codec;
|
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_Status = STATE_Stopped;
|
||||||
m_Looping = looping;
|
m_Looping = looping;
|
||||||
|
|
||||||
|
start_order = order;
|
||||||
if (open2(0) && m_Stream->Play(m_Looping, 1))
|
if (open2(0) && m_Stream->Play(m_Looping, 1))
|
||||||
{
|
{
|
||||||
m_Status = STATE_Playing;
|
m_Status = STATE_Playing;
|
||||||
|
@ -1166,15 +1168,11 @@ void input_mod::Play(bool looping)
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// input_mod :: SetPosition
|
// input_mod :: SetSubsong
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool input_mod::SetPosition(int order)
|
bool input_mod::SetSubsong(int order)
|
||||||
{
|
{
|
||||||
if (order == start_order)
|
if (order == start_order)
|
||||||
{
|
{
|
||||||
|
|
|
@ -85,7 +85,7 @@ CUSTOM_CVAR (Int, timidity_frequency, 22050, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
self = 65000;
|
self = 65000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimiditySong::Play (bool looping)
|
void TimiditySong::Play (bool looping, int subsong)
|
||||||
{
|
{
|
||||||
m_Status = STATE_Stopped;
|
m_Status = STATE_Stopped;
|
||||||
m_Looping = looping;
|
m_Looping = looping;
|
||||||
|
|
|
@ -182,7 +182,7 @@ void MIDIStreamer::CheckCaps()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void MIDIStreamer::Play(bool looping)
|
void MIDIStreamer::Play(bool looping, int subsong)
|
||||||
{
|
{
|
||||||
DWORD tid;
|
DWORD tid;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ bool OPLMUSSong::IsPlaying ()
|
||||||
return m_Status == STATE_Playing;
|
return m_Status == STATE_Playing;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OPLMUSSong::Play (bool looping)
|
void OPLMUSSong::Play (bool looping, int subsong)
|
||||||
{
|
{
|
||||||
m_Status = STATE_Stopped;
|
m_Status = STATE_Stopped;
|
||||||
m_Looping = looping;
|
m_Looping = looping;
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
#include "i_musicinterns.h"
|
#include "i_musicinterns.h"
|
||||||
|
|
||||||
void StreamSong::Play (bool looping)
|
void StreamSong::Play (bool looping, int subsong)
|
||||||
{
|
{
|
||||||
m_Status = STATE_Stopped;
|
m_Status = STATE_Stopped;
|
||||||
m_Looping = looping;
|
m_Looping = looping;
|
||||||
|
|
||||||
if (m_Stream->Play (m_Looping, 1))
|
if (m_Stream->Play (m_Looping, 1))
|
||||||
{
|
{
|
||||||
|
if (subsong != 0)
|
||||||
|
{
|
||||||
|
m_Stream->SetOrder (subsong);
|
||||||
|
}
|
||||||
m_Status = STATE_Playing;
|
m_Status = STATE_Playing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,14 +74,25 @@ bool StreamSong::IsPlaying ()
|
||||||
//
|
//
|
||||||
// StreamSong :: SetPosition
|
// StreamSong :: SetPosition
|
||||||
//
|
//
|
||||||
// Sets the current order number for a MOD-type song, or the position in ms
|
// Sets the position in ms.
|
||||||
// for anything else.
|
|
||||||
|
|
||||||
bool StreamSong::SetPosition(int order)
|
bool StreamSong::SetPosition(unsigned int pos)
|
||||||
{
|
{
|
||||||
if (m_Stream != NULL)
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
// This file was automatically generated by the
|
// This file was automatically generated by the
|
||||||
// updaterevision tool. Do not edit by hand.
|
// updaterevision tool. Do not edit by hand.
|
||||||
|
|
||||||
#define ZD_SVN_REVISION_STRING "1102"
|
#define ZD_SVN_REVISION_STRING "1109"
|
||||||
#define ZD_SVN_REVISION_NUMBER 1102
|
#define ZD_SVN_REVISION_NUMBER 1109
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
// SAVESIG should match SAVEVER.
|
// SAVESIG should match SAVEVER.
|
||||||
|
|
||||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||||
#define MINSAVEVER 1076
|
#define MINSAVEVER 1107
|
||||||
|
|
||||||
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER
|
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER
|
||||||
// Never write a savegame with a version lower than what we need
|
// Never write a savegame with a version lower than what we need
|
||||||
|
|
|
@ -139,8 +139,17 @@ public:
|
||||||
operator const char *() const { return Chars; }
|
operator const char *() const { return Chars; }
|
||||||
|
|
||||||
const char *GetChars() const { return Chars; }
|
const char *GetChars() const { return Chars; }
|
||||||
|
|
||||||
const char &operator[] (int index) const { return Chars[index]; }
|
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]; }
|
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 index) const { return Chars[index]; }
|
||||||
const char &operator[] (unsigned long 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
|
ACTOR ChickenPlayer : PlayerPawn native
|
||||||
{
|
{
|
||||||
Health 30
|
Health 24
|
||||||
ReactionTime 0
|
ReactionTime 0
|
||||||
PainChance 255
|
PainChance 255
|
||||||
Radius 16
|
Radius 16
|
||||||
|
@ -112,6 +112,8 @@ ACTOR ChickenPlayer : PlayerPawn native
|
||||||
|
|
||||||
ACTOR Chicken : MorphedMonster
|
ACTOR Chicken : MorphedMonster
|
||||||
{
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 122
|
||||||
Health 10
|
Health 10
|
||||||
Radius 9
|
Radius 9
|
||||||
Height 22
|
Height 22
|
||||||
|
|
|
@ -188,6 +188,8 @@ ACTOR Sorcerer2
|
||||||
|
|
||||||
ACTOR Sorcerer2FX1
|
ACTOR Sorcerer2FX1
|
||||||
{
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 145
|
||||||
Radius 10
|
Radius 10
|
||||||
Height 6
|
Height 6
|
||||||
Speed 20
|
Speed 20
|
||||||
|
|
|
@ -81,6 +81,7 @@ ACTOR HereticImpLeader : HereticImp 5
|
||||||
{
|
{
|
||||||
Game Heretic
|
Game Heretic
|
||||||
SpawnID 7
|
SpawnID 7
|
||||||
|
Health 80
|
||||||
-MISSILEMORE
|
-MISSILEMORE
|
||||||
AttackSound "himp/leaderattack"
|
AttackSound "himp/leaderattack"
|
||||||
States
|
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
|
Damage 1
|
||||||
DamageType "Fire"
|
DamageType "Fire"
|
||||||
Projectile
|
Projectile
|
||||||
+FLOORCLIP
|
|
||||||
-BLOODSPLATTER
|
|
||||||
RenderStyle Add
|
RenderStyle Add
|
||||||
DeathSound "FireDemonMissileHit"
|
DeathSound "FireDemonMissileHit"
|
||||||
States
|
States
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Temp Small Flame --------------------------------------------------------
|
// Temp Small Flame --------------------------------------------------------
|
||||||
|
|
||||||
ACTOR AFlameSmallTemp 10500
|
ACTOR FlameSmallTemp 10500
|
||||||
{
|
{
|
||||||
Game Hexen
|
Game Hexen
|
||||||
SpawnID 96
|
SpawnID 96
|
||||||
|
@ -21,7 +21,7 @@ ACTOR AFlameSmallTemp 10500
|
||||||
|
|
||||||
// Temp Large Flame ---------------------------------------------------------
|
// Temp Large Flame ---------------------------------------------------------
|
||||||
|
|
||||||
ACTOR AFlameLargeTemp 10502
|
ACTOR FlameLargeTemp 10502
|
||||||
{
|
{
|
||||||
Game Hexen
|
Game Hexen
|
||||||
SpawnID 98
|
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_SelectWeapon(class<Weapon> whichweapon);
|
||||||
action native A_Punch();
|
action native A_Punch();
|
||||||
action native A_Feathers();
|
action native A_Feathers();
|
||||||
|
action native A_ClassBossHealth();
|
||||||
}
|
}
|
||||||
|
|
||||||
class Inventory extends Actor
|
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
|
ACTOR ArtiInvulnerability : PowerupGiver 84
|
||||||
{
|
{
|
||||||
Game Raven
|
Game Heretic
|
||||||
SpawnID 133
|
SpawnID 133
|
||||||
+COUNTITEM
|
+COUNTITEM
|
||||||
+FLOATBOB
|
+FLOATBOB
|
||||||
|
@ -77,7 +77,28 @@ ACTOR ArtiInvulnerability : PowerupGiver 84
|
||||||
Inventory.RespawnTics 4230
|
Inventory.RespawnTics 4230
|
||||||
Inventory.Icon ARTIINVU
|
Inventory.Icon ARTIINVU
|
||||||
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY"
|
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
|
Powerup.Type Invulnerable
|
||||||
States
|
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/pickups.txt"
|
||||||
#include "actors/shared/fountain.txt"
|
#include "actors/shared/fountain.txt"
|
||||||
#include "actors/shared/soundsequence.txt"
|
#include "actors/shared/soundsequence.txt"
|
||||||
|
#include "actors/shared/bridge.txt"
|
||||||
|
#include "actors/shared/specialspot.txt"
|
||||||
|
|
||||||
#include "actors/doom/doomplayer.txt"
|
#include "actors/doom/doomplayer.txt"
|
||||||
#include "actors/doom/possessed.txt"
|
#include "actors/doom/possessed.txt"
|
||||||
|
@ -42,6 +44,7 @@
|
||||||
#include "actors/raven/ravenartifacts.txt"
|
#include "actors/raven/ravenartifacts.txt"
|
||||||
#include "actors/raven/ravenhealth.txt"
|
#include "actors/raven/ravenhealth.txt"
|
||||||
#include "actors/raven/ravenambient.txt"
|
#include "actors/raven/ravenambient.txt"
|
||||||
|
#include "actors/raven/minotaur.txt"
|
||||||
|
|
||||||
#include "actors/heretic/hereticplayer.txt"
|
#include "actors/heretic/hereticplayer.txt"
|
||||||
#include "actors/heretic/hereticammo.txt"
|
#include "actors/heretic/hereticammo.txt"
|
||||||
|
@ -80,6 +83,16 @@
|
||||||
#include "actors/hexen/clericmace.txt"
|
#include "actors/hexen/clericmace.txt"
|
||||||
#include "actors/hexen/firedemon.txt"
|
#include "actors/hexen/firedemon.txt"
|
||||||
#include "actors/hexen/fog.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/strifeplayer.txt"
|
||||||
#include "actors/strife/beggars.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