- 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:
Christoph Oelckers 2008-08-04 19:46:35 +00:00
parent abe446ced2
commit ef24d413da
72 changed files with 2062 additions and 2402 deletions

View file

@ -1,4 +1,25 @@
August 3, 2008 (Changes by Graf Zahl)
- Converted the Minotaur's projectiles to DECORATE so that I can get
rid of the AT_SPEED_SET code.
- Converted Heretic's Blaster and SkullRod to DECORATE.
- Converted the mace and all related actors to DECORATE and generalized
the spawn function that only spawns one mace per level.
- Moved Mace respawning code into AInventory so that it works properly
for replacement actors.
- Added more DECORATE conversions by Karate Chris.
- Cleaned up the new bridge code and exported all related actors to
DECORATE so that the exported code pointers can be used.
- Separated Heretic's and Hexen's invulnerability items for stability
reasons.
August 2, 2008
- Fixed spurious warnings on 32-bit VC++ debug builds.
- Made the subsong (order) number a proper parameter to MusInfo::Play()
instead of requiring a separate SetPosition() call to do it.
August 2, 2008 (Changes by Graf Zahl)
- Added Gez's submission for custom bridge things.
- Fixed: ASpecialSpot must check the array's size before dividing by it.
- Fixed: The mugshot drawe ignored the accuracy parameter.
- Fixed: The Alt HUD's weapon drawer didn't check properly for invalid icons.
- Added DECORATE conversions for Hexen's Cleric Mace, Firedemon and fog by

View file

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

View file

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

View file

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

View file

@ -107,6 +107,7 @@ ACTOR(DamageChildren)
ACTOR(CheckForReload)
ACTOR(ResetReloadCounter)
ACTOR(ClearReFire)
ACTOR(SpawnSingleItem)
// Heretic stuff
ACTOR(Feathers)
@ -151,7 +152,37 @@ ACTOR(FireGoldWandPL2)
ACTOR(FireCrossbowPL1)
ACTOR(FireCrossbowPL2)
ACTOR(GauntletAttack)
ACTOR(FireMacePL1)
ACTOR(FireMacePL2)
ACTOR(MacePL1Check)
ACTOR(MaceBallImpact)
ACTOR(MaceBallImpact2)
ACTOR(DeathBallImpact)
ACTOR(FireBlasterPL1)
ACTOR(SpawnRippers)
ACTOR(FireSkullRodPL1)
ACTOR(AddPlayerRain)
ACTOR(HideInCeiling)
ACTOR(SkullRodStorm)
ACTOR(RainImpact)
ACTOR(MntrFloorFire)
ACTOR(BatSpawnInit)
ACTOR(BatSpawn)
ACTOR(BatMove)
ACTOR(BishopDecide)
ACTOR(BishopDoBlur)
ACTOR(BishopSpawnBlur)
ACTOR(BishopPainBlur)
ACTOR(BishopChase)
ACTOR(BishopAttack)
ACTOR(BishopAttack2)
ACTOR(BishopPuff)
WEAPON(CFlameAttack)
WEAPON(CFlameRotate)
ACTOR(CFlamePuff)
WEAPON(CFlameMissile)
WEAPON(CMaceAttack)
ACTOR(FiredRocks)
ACTOR(FiredChase)
@ -160,9 +191,20 @@ ACTOR(FiredSplotch)
ACTOR(SmBounce)
ACTOR(FogSpawn)
ACTOR(FogMove)
ACTOR(Summon)
ACTOR(PoisonBagInit)
ACTOR(CheckThrowBomb)
ACTOR(CheckThrowBomb2)
ACTOR(ClassBossHealth)
ACTOR(ClericAttack)
ACTOR(FighterAttack)
ACTOR(MageAttack)
// Special code pointers for Strife's player - not to be used elsewhere!
ACTOR(ItBurnsItBurns)
ACTOR(CrispyPlayer)
ACTOR(DropFire)
// Special code pointers for bridge things
ACTOR(BridgeInit)
ACTOR(BridgeOrbit)

View file

@ -14,7 +14,6 @@
#include "p_enemy.h"
#include "gi.h"
#include "r_translate.h"
#include "a_specialspot.h"
#include "thingdef/thingdef.h"
static FRandom pr_sap ("StaffAtkPL1");
@ -22,7 +21,6 @@ static FRandom pr_sap2 ("StaffAtkPL2");
static FRandom pr_fgw ("FireWandPL1");
static FRandom pr_fgw2 ("FireWandPL2");
static FRandom pr_boltspark ("BoltSpark");
static FRandom pr_spawnmace ("SpawnMace");
static FRandom pr_macerespawn ("MaceRespawn");
static FRandom pr_maceatk ("FireMacePL1");
static FRandom pr_gatk ("GauntletAttack");
@ -343,212 +341,16 @@ void A_GauntletAttack (AActor *actor)
#define MAGIC_JUNK 1234
void A_FireMacePL1B (AActor *);
void A_FireMacePL1 (AActor *);
void A_MacePL1Check (AActor *);
void A_MaceBallImpact (AActor *);
void A_MaceBallImpact2 (AActor *);
void A_FireMacePL2 (AActor *);
void A_DeathBallImpact (AActor *);
// The mace itself ----------------------------------------------------------
class AMace : public AHereticWeapon
{
DECLARE_ACTOR (AMace, AHereticWeapon)
protected:
bool DoRespawn ();
};
class AMacePowered : public AMace
{
DECLARE_STATELESS_ACTOR (AMacePowered, AMace)
};
FState AMace::States[] =
{
#define S_WMCE 0
S_NORMAL (WMCE, 'A', -1, NULL , NULL),
#define S_MACEREADY (S_WMCE+1)
S_NORMAL (MACE, 'A', 1, A_WeaponReady , &States[S_MACEREADY]),
#define S_MACEDOWN (S_MACEREADY+1)
S_NORMAL (MACE, 'A', 1, A_Lower , &States[S_MACEDOWN]),
#define S_MACEUP (S_MACEDOWN+1)
S_NORMAL (MACE, 'A', 1, A_Raise , &States[S_MACEUP]),
#define S_MACEATK1 (S_MACEUP+1)
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK1+1]),
S_NORMAL (MACE, 'C', 3, A_FireMacePL1 , &States[S_MACEATK1+2]),
S_NORMAL (MACE, 'D', 3, A_FireMacePL1 , &States[S_MACEATK1+3]),
S_NORMAL (MACE, 'E', 3, A_FireMacePL1 , &States[S_MACEATK1+4]),
S_NORMAL (MACE, 'F', 3, A_FireMacePL1 , &States[S_MACEATK1+5]),
S_NORMAL (MACE, 'C', 4, A_ReFire , &States[S_MACEATK1+6]),
S_NORMAL (MACE, 'D', 4, NULL , &States[S_MACEATK1+7]),
S_NORMAL (MACE, 'E', 4, NULL , &States[S_MACEATK1+8]),
S_NORMAL (MACE, 'F', 4, NULL , &States[S_MACEATK1+9]),
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEREADY]),
#define S_MACEATK2 (S_MACEATK1+10)
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK2+1]),
S_NORMAL (MACE, 'D', 4, A_FireMacePL2 , &States[S_MACEATK2+2]),
S_NORMAL (MACE, 'B', 4, NULL , &States[S_MACEATK2+3]),
S_NORMAL (MACE, 'A', 8, A_ReFire , &States[S_MACEREADY])
};
IMPLEMENT_ACTOR (AMace, Heretic, -1, 31)
PROP_Flags (MF_SPECIAL)
PROP_SpawnState (0)
PROP_Weapon_SelectionOrder (1400)
PROP_Weapon_Flags (WIF_BOT_REACTION_SKILL_THING|WIF_BOT_EXPLOSIVE)
PROP_Weapon_AmmoUse1 (USE_MACE_AMMO_1)
PROP_Weapon_AmmoGive1 (50)
PROP_Weapon_UpState (S_MACEUP)
PROP_Weapon_DownState (S_MACEDOWN)
PROP_Weapon_ReadyState (S_MACEREADY)
PROP_Weapon_AtkState (S_MACEATK1)
PROP_Weapon_HoldAtkState (S_MACEATK1+1)
PROP_Weapon_YAdjust (15)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("MaceAmmo")
PROP_Weapon_SisterType ("MacePowered")
PROP_Weapon_ProjectileType ("MaceFX2")
PROP_Inventory_PickupMessage("$TXT_WPNMACE")
END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (AMacePowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_POWERED_UP|WIF_BOT_REACTION_SKILL_THING|WIF_BOT_EXPLOSIVE)
PROP_Weapon_AmmoUse1 (USE_MACE_AMMO_2)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AtkState (S_MACEATK2)
PROP_Weapon_HoldAtkState (S_MACEATK2)
PROP_Weapon_SisterType ("Mace")
PROP_Weapon_ProjectileType ("MaceFX4")
END_DEFAULTS
// Mace FX1 -----------------------------------------------------------------
class AMaceFX1 : public AActor
{
DECLARE_ACTOR (AMaceFX1, AActor)
};
FState AMaceFX1::States[] =
{
#define S_MACEFX1 0
S_NORMAL (FX02, 'A', 4, A_MacePL1Check , &States[S_MACEFX1+1]),
S_NORMAL (FX02, 'B', 4, A_MacePL1Check , &States[S_MACEFX1+0]),
#define S_MACEFXI1 (S_MACEFX1+2)
S_BRIGHT (FX02, 'F', 4, A_MaceBallImpact , &States[S_MACEFXI1+1]),
S_BRIGHT (FX02, 'G', 4, NULL , &States[S_MACEFXI1+2]),
S_BRIGHT (FX02, 'H', 4, NULL , &States[S_MACEFXI1+3]),
S_BRIGHT (FX02, 'I', 4, NULL , &States[S_MACEFXI1+4]),
S_BRIGHT (FX02, 'J', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (AMaceFX1, Heretic, -1, 154)
PROP_RadiusFixed (8)
PROP_HeightFixed (6)
PROP_SpeedFixed (20)
PROP_Damage (2)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_Flags3 (MF3_WARNBOT)
PROP_SpawnState (S_MACEFX1)
PROP_DeathState (S_MACEFXI1)
PROP_SeeSound ("weapons/maceshoot")
END_DEFAULTS
// Mace FX2 -----------------------------------------------------------------
class AMaceFX2 : public AActor
{
DECLARE_ACTOR (AMaceFX2, AActor)
};
FState AMaceFX2::States[] =
{
#define S_MACEFX2 0
S_NORMAL (FX02, 'C', 4, NULL , &States[S_MACEFX2+1]),
S_NORMAL (FX02, 'D', 4, NULL , &States[S_MACEFX2+0]),
#define S_MACEFXI2 (S_MACEFX2+2)
S_BRIGHT (FX02, 'F', 4, A_MaceBallImpact2 , &AMaceFX1::States[S_MACEFXI1+1])
};
IMPLEMENT_ACTOR (AMaceFX2, Heretic, -1, 156)
PROP_RadiusFixed (8)
PROP_HeightFixed (6)
PROP_SpeedFixed (10)
PROP_Damage (6)
PROP_Gravity (FRACUNIT/8)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_SpawnState (S_MACEFX2)
PROP_DeathState (S_MACEFXI2)
END_DEFAULTS
// Mace FX3 -----------------------------------------------------------------
class AMaceFX3 : public AMaceFX1
{
DECLARE_ACTOR (AMaceFX3, AMaceFX1)
};
FState AMaceFX3::States[] =
{
#define S_MACEFX3 0
S_NORMAL (FX02, 'A', 4, NULL , &States[S_MACEFX3+1]),
S_NORMAL (FX02, 'B', 4, NULL , &States[S_MACEFX3+0])
};
IMPLEMENT_ACTOR (AMaceFX3, Heretic, -1, 155)
PROP_SpeedFixed (7)
PROP_Damage (4)
PROP_Gravity (FRACUNIT/8)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_SpawnState (S_MACEFX3)
END_DEFAULTS
// Mace FX4 -----------------------------------------------------------------
class AMaceFX4 : public AActor
{
DECLARE_ACTOR (AMaceFX4, AActor)
DECLARE_CLASS (AMaceFX4, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState AMaceFX4::States[] =
{
#define S_MACEFX4 0
S_NORMAL (FX02, 'E', 99, NULL , &States[S_MACEFX4+0]),
#define S_MACEFXI4 (S_MACEFX4+1)
S_BRIGHT (FX02, 'C', 4, A_DeathBallImpact , &AMaceFX1::States[S_MACEFXI1+1])
};
IMPLEMENT_ACTOR (AMaceFX4, Heretic, -1, 153)
PROP_RadiusFixed (8)
PROP_HeightFixed (6)
PROP_SpeedFixed (7)
PROP_Damage (18)
PROP_Gravity (FRACUNIT/8)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_TELESTOMP|MF2_PCROSS|MF2_IMPACT)
PROP_SpawnState (S_MACEFX4)
PROP_DeathState (S_MACEFXI4)
END_DEFAULTS
IMPLEMENT_CLASS (AMaceFX4)
int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
{
@ -570,79 +372,6 @@ int AMaceFX4::DoSpecialDamage (AActor *target, int damage)
return 1000000; // Something's gonna die
}
// Mace spawn spot ----------------------------------------------------------
void A_SpawnMace (AActor *);
class AMaceSpawner : public ASpecialSpot
{
DECLARE_ACTOR (AMaceSpawner, ASpecialSpot)
};
FState AMaceSpawner::States[] =
{
S_NORMAL (TNT1, 'A', 1, NULL, &States[1]),
S_NORMAL (TNT1, 'A', -1, A_SpawnMace, NULL)
};
IMPLEMENT_ACTOR (AMaceSpawner, Heretic, 2002, 0)
PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
PROP_SpawnState (0)
END_DEFAULTS
// Every mace spawn spot will execute this action. The first one
// will build a list of all mace spots in the level and spawn a
// mace. The rest of the spots will do nothing.
void A_SpawnMace (AActor *self)
{
if (self->target != NULL)
{ // Another spot already did it
return;
}
AActor *spot = NULL;
DSpotState *state = DSpotState::GetSpotState();
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_TYPE(self), true);
if (spot == NULL) return;
if (!deathmatch && pr_spawnmace() < 64)
{ // Sometimes doesn't show up if not in deathmatch
return;
}
AActor *mace = Spawn<AMace> (self->x, self->y, self->z, ALLOW_REPLACE);
if (mace)
{
mace->SetOrigin (spot->x, spot->y, spot->z);
mace->z = mace->floorz;
// We want this mace to respawn.
mace->flags &= ~MF_DROPPED;
}
}
// FIXME: Generalize this so that it doesn't depend on item specific implementation!
// AMace::DoRespawn
// Moves the mace to a different spot when it respawns
bool AMace::DoRespawn ()
{
AActor *spot = NULL;
DSpotState *state = DSpotState::GetSpotState();
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_CLASS(AMaceSpawner));
if (spot != NULL)
{
SetOrigin (spot->x, spot->y, spot->z);
z = floorz;
}
return true;
}
//----------------------------------------------------------------------------
//
// PROC A_FireMacePL1B
@ -666,7 +395,7 @@ void A_FireMacePL1B (AActor *actor)
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
ball = Spawn<AMaceFX2> (actor->x, actor->y, actor->z + 28*FRACUNIT
ball = Spawn("MaceFX2", actor->x, actor->y, actor->z + 28*FRACUNIT
- actor->floorclip, ALLOW_REPLACE);
ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/
finetangent[FINEANGLES/4-(actor->pitch>>ANGLETOFINESHIFT)];
@ -710,7 +439,7 @@ void A_FireMacePL1 (AActor *actor)
}
player->psprites[ps_weapon].sx = ((pr_maceatk()&3)-2)*FRACUNIT;
player->psprites[ps_weapon].sy = WEAPONTOP+(pr_maceatk()&3)*FRACUNIT;
ball = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(AMaceFX1),
ball = P_SpawnPlayerMissile (actor, PClass::FindClass("MaceFX1"),
actor->angle+(((pr_maceatk()&7)-4)<<24));
if (ball)
{
@ -812,7 +541,7 @@ void A_MaceBallImpact2 (AActor *ball)
ball->momz = (ball->momz * 192) >> 8;
ball->SetState (ball->SpawnState);
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
tiny = Spawn("MaceFX3", ball->x, ball->y, ball->z, ALLOW_REPLACE);
angle = ball->angle+ANG90;
tiny->target = ball->target;
tiny->angle = angle;
@ -824,7 +553,7 @@ void A_MaceBallImpact2 (AActor *ball)
tiny->momz = ball->momz;
P_CheckMissileSpawn (tiny);
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
tiny = Spawn("MaceFX3", ball->x, ball->y, ball->z, ALLOW_REPLACE);
angle = ball->angle-ANG90;
tiny->target = ball->target;
tiny->angle = angle;
@ -975,123 +704,17 @@ boom:
}
}
// --- Blaster (aka Claw) ---------------------------------------------------
void A_FireBlasterPL1 (AActor *);
void A_FireBlasterPL2 (AActor *);
void A_SpawnRippers (AActor *);
// Blaster ------------------------------------------------------------------
class ABlaster : public AHereticWeapon
{
DECLARE_ACTOR (ABlaster, AHereticWeapon)
};
class ABlasterPowered : public ABlaster
{
DECLARE_STATELESS_ACTOR (ABlasterPowered, ABlaster)
};
FState ABlaster::States[] =
{
#define S_BLSR 0
S_NORMAL (WBLS, 'A', -1, NULL , NULL),
#define S_BLASTERREADY (S_BLSR+1)
S_NORMAL (BLSR, 'A', 1, A_WeaponReady , &States[S_BLASTERREADY]),
#define S_BLASTERDOWN (S_BLASTERREADY+1)
S_NORMAL (BLSR, 'A', 1, A_Lower , &States[S_BLASTERDOWN]),
#define S_BLASTERUP (S_BLASTERDOWN+1)
S_NORMAL (BLSR, 'A', 1, A_Raise , &States[S_BLASTERUP]),
#define S_BLASTERATK1 (S_BLASTERUP+1)
S_NORMAL (BLSR, 'B', 3, NULL , &States[S_BLASTERATK1+1]),
S_NORMAL (BLSR, 'C', 3, NULL , &States[S_BLASTERATK1+2]),
S_NORMAL (BLSR, 'D', 2, A_FireBlasterPL1 , &States[S_BLASTERATK1+3]),
S_NORMAL (BLSR, 'C', 2, NULL , &States[S_BLASTERATK1+4]),
S_NORMAL (BLSR, 'B', 2, NULL , &States[S_BLASTERATK1+5]),
S_NORMAL (BLSR, 'A', 0, A_ReFire , &States[S_BLASTERREADY]),
#define S_BLASTERATK2 (S_BLASTERATK1+6)
S_NORMAL (BLSR, 'B', 0, NULL , &States[S_BLASTERATK2+1]),
S_NORMAL (BLSR, 'C', 0, NULL , &States[S_BLASTERATK2+2]),
S_NORMAL (BLSR, 'D', 3, A_FireBlasterPL2 , &States[S_BLASTERATK2+3]),
S_NORMAL (BLSR, 'C', 4, NULL , &States[S_BLASTERATK2+4]),
S_NORMAL (BLSR, 'B', 4, NULL , &States[S_BLASTERATK2+5]),
S_NORMAL (BLSR, 'A', 0, A_ReFire , &States[S_BLASTERREADY])
};
IMPLEMENT_ACTOR (ABlaster, Heretic, 53, 28)
PROP_Flags (MF_SPECIAL)
PROP_Flags5 (MF5_BLOODSPLATTER)
PROP_SpawnState (S_BLSR)
PROP_Weapon_SelectionOrder (500)
PROP_Weapon_AmmoUse1 (USE_BLSR_AMMO_1)
PROP_Weapon_AmmoGive1 (30)
PROP_Weapon_UpState (S_BLASTERUP)
PROP_Weapon_DownState (S_BLASTERDOWN)
PROP_Weapon_ReadyState (S_BLASTERREADY)
PROP_Weapon_AtkState (S_BLASTERATK1)
PROP_Weapon_HoldAtkState (S_BLASTERATK1+2)
PROP_Weapon_YAdjust (15)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("BlasterAmmo")
PROP_Weapon_SisterType ("BlasterPowered")
PROP_Inventory_PickupMessage("$TXT_WPNBLASTER")
END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (ABlasterPowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_POWERED_UP)
PROP_Weapon_AmmoUse1 (USE_BLSR_AMMO_2)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AtkState (S_BLASTERATK2)
PROP_Weapon_HoldAtkState (S_BLASTERATK2+2)
PROP_Weapon_SisterType ("Blaster")
PROP_Weapon_ProjectileType ("BlasterFX1")
END_DEFAULTS
// Blaster FX 1 -------------------------------------------------------------
class ABlasterFX1 : public AActor
{
DECLARE_ACTOR (ABlasterFX1, AActor)
DECLARE_CLASS(ABlasterFX1, AActor)
public:
void Tick ();
int DoSpecialDamage (AActor *target, int damage);
};
FState ABlasterFX1::States[] =
{
#define S_BLASTERFX1 0
S_NORMAL (ACLO, 'E', 200, NULL , &States[S_BLASTERFX1+0]),
#define S_BLASTERFXI1 (S_BLASTERFX1+1)
S_BRIGHT (FX18, 'A', 3, A_SpawnRippers , &States[S_BLASTERFXI1+1]),
S_BRIGHT (FX18, 'B', 3, NULL , &States[S_BLASTERFXI1+2]),
S_BRIGHT (FX18, 'C', 4, NULL , &States[S_BLASTERFXI1+3]),
S_BRIGHT (FX18, 'D', 4, NULL , &States[S_BLASTERFXI1+4]),
S_BRIGHT (FX18, 'E', 4, NULL , &States[S_BLASTERFXI1+5]),
S_BRIGHT (FX18, 'F', 4, NULL , &States[S_BLASTERFXI1+6]),
S_BRIGHT (FX18, 'G', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterFX1, Heretic, -1, 0)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (184)
PROP_Damage (2)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_SpawnState (S_BLASTERFX1)
PROP_DeathState (S_BLASTERFXI1)
PROP_DeathSound ("weapons/blasterhit")
END_DEFAULTS
int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
{
@ -1106,69 +729,18 @@ int ABlasterFX1::DoSpecialDamage (AActor *target, int damage)
return damage;
}
// Blaster smoke ------------------------------------------------------------
class ABlasterSmoke : public AActor
{
DECLARE_ACTOR (ABlasterSmoke, AActor)
};
FState ABlasterSmoke::States[] =
{
#define S_BLASTERSMOKE 0
S_NORMAL (FX18, 'H', 4, NULL , &States[S_BLASTERSMOKE+1]),
S_NORMAL (FX18, 'I', 4, NULL , &States[S_BLASTERSMOKE+2]),
S_NORMAL (FX18, 'J', 4, NULL , &States[S_BLASTERSMOKE+3]),
S_NORMAL (FX18, 'K', 4, NULL , &States[S_BLASTERSMOKE+4]),
S_NORMAL (FX18, 'L', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterSmoke, Heretic, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HR_SHADOW)
PROP_SpawnState (S_BLASTERSMOKE)
END_DEFAULTS
IMPLEMENT_CLASS(ABlasterFX1)
// Ripper -------------------------------------------------------------------
class ARipper : public AActor
{
DECLARE_ACTOR (ARipper, AActor)
DECLARE_CLASS (ARipper, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ARipper::States[] =
{
#define S_RIPPER 0
S_NORMAL (FX18, 'M', 4, NULL , &States[S_RIPPER+1]),
S_NORMAL (FX18, 'N', 5, NULL , &States[S_RIPPER+0]),
#define S_RIPPERX (S_RIPPER+2)
S_BRIGHT (FX18, 'O', 4, NULL , &States[S_RIPPERX+1]),
S_BRIGHT (FX18, 'P', 4, NULL , &States[S_RIPPERX+2]),
S_BRIGHT (FX18, 'Q', 4, NULL , &States[S_RIPPERX+3]),
S_BRIGHT (FX18, 'R', 4, NULL , &States[S_RIPPERX+4]),
S_BRIGHT (FX18, 'S', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ARipper, Heretic, -1, 157)
PROP_RadiusFixed (8)
PROP_HeightFixed (6)
PROP_SpeedFixed (14)
PROP_Damage (1)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_PCROSS|MF2_IMPACT)
PROP_Flags3 (MF3_WARNBOT)
PROP_SpawnState (S_RIPPER)
PROP_DeathState (S_RIPPERX)
PROP_DeathSound ("weapons/blasterpowhit")
END_DEFAULTS
IMPLEMENT_CLASS(ARipper)
int ARipper::DoSpecialDamage (AActor *target, int damage)
{
@ -1183,41 +755,6 @@ int ARipper::DoSpecialDamage (AActor *target, int damage)
return damage;
}
// Blaster Puff -------------------------------------------------------------
class ABlasterPuff : public AActor
{
DECLARE_ACTOR (ABlasterPuff, AActor)
};
FState ABlasterPuff::States[] =
{
#define S_BLASTERPUFF1 0
S_BRIGHT (FX17, 'A', 4, NULL , &States[S_BLASTERPUFF1+1]),
S_BRIGHT (FX17, 'B', 4, NULL , &States[S_BLASTERPUFF1+2]),
S_BRIGHT (FX17, 'C', 4, NULL , &States[S_BLASTERPUFF1+3]),
S_BRIGHT (FX17, 'D', 4, NULL , &States[S_BLASTERPUFF1+4]),
S_BRIGHT (FX17, 'E', 4, NULL , NULL),
#define S_BLASTERPUFF2 (S_BLASTERPUFF1+5)
S_BRIGHT (FX17, 'F', 3, NULL , &States[S_BLASTERPUFF2+1]),
S_BRIGHT (FX17, 'G', 3, NULL , &States[S_BLASTERPUFF2+2]),
S_BRIGHT (FX17, 'H', 4, NULL , &States[S_BLASTERPUFF2+3]),
S_BRIGHT (FX17, 'I', 4, NULL , &States[S_BLASTERPUFF2+4]),
S_BRIGHT (FX17, 'J', 4, NULL , &States[S_BLASTERPUFF2+5]),
S_BRIGHT (FX17, 'K', 4, NULL , &States[S_BLASTERPUFF2+6]),
S_BRIGHT (FX17, 'L', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlasterPuff, Heretic, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags3 (MF3_PUFFONACTORS)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_BLASTERPUFF2)
PROP_CrashState (S_BLASTERPUFF1)
END_DEFAULTS
//----------------------------------------------------------------------------
//
// PROC A_FireBlasterPL1
@ -1248,36 +785,10 @@ void A_FireBlasterPL1 (AActor *actor)
{
angle += pr_fb1.Random2() << 18;
}
P_LineAttack (actor, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, RUNTIME_CLASS(ABlasterPuff));
P_LineAttack (actor, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, "BlasterPuff");
S_Sound (actor, CHAN_WEAPON, "weapons/blastershoot", 1, ATTN_NORM);
}
//----------------------------------------------------------------------------
//
// PROC A_FireBlasterPL2
//
//----------------------------------------------------------------------------
void A_FireBlasterPL2 (AActor *actor)
{
player_t *player;
if (NULL == (player = actor->player))
{
return;
}
AWeapon *weapon = actor->player->ReadyWeapon;
if (weapon != NULL)
{
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
P_SpawnPlayerMissile (actor, RUNTIME_CLASS(ABlasterFX1));
S_Sound (actor, CHAN_WEAPON, "weapons/blastershoot", 1, ATTN_NORM);
}
//----------------------------------------------------------------------------
//
// PROC A_SpawnRippers
@ -1356,7 +867,7 @@ void ABlasterFX1::Tick ()
}
if (changexy && (pr_bfx1t() < 64))
{
Spawn<ABlasterSmoke> (x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz), ALLOW_REPLACE);
Spawn("BlasterSmoke", x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz), ALLOW_REPLACE);
}
}
}
@ -1376,168 +887,17 @@ void ABlasterFX1::Tick ()
// --- Skull rod ------------------------------------------------------------
void A_FireSkullRodPL1 (AActor *);
void A_FireSkullRodPL2 (AActor *);
void A_SkullRodPL2Seek (AActor *);
void A_AddPlayerRain (AActor *);
void A_HideInCeiling (AActor *);
void A_SkullRodStorm (AActor *);
void A_RainImpact (AActor *);
// Skull (Horn) Rod ---------------------------------------------------------
class ASkullRod : public AHereticWeapon
{
DECLARE_ACTOR (ASkullRod, AHereticWeapon)
};
class ASkullRodPowered : public ASkullRod
{
DECLARE_STATELESS_ACTOR (ASkullRodPowered, ASkullRod)
};
FState ASkullRod::States[] =
{
#define S_WSKL 0
S_NORMAL (WSKL, 'A', -1, NULL , NULL),
#define S_HORNRODREADY (S_WSKL+1)
S_NORMAL (HROD, 'A', 1, A_WeaponReady , &States[S_HORNRODREADY]),
#define S_HORNRODDOWN (S_HORNRODREADY+1)
S_NORMAL (HROD, 'A', 1, A_Lower , &States[S_HORNRODDOWN]),
#define S_HORNRODUP (S_HORNRODDOWN+1)
S_NORMAL (HROD, 'A', 1, A_Raise , &States[S_HORNRODUP]),
#define S_HORNRODATK1 (S_HORNRODUP+1)
S_NORMAL (HROD, 'A', 4, A_FireSkullRodPL1 , &States[S_HORNRODATK1+1]),
S_NORMAL (HROD, 'B', 4, A_FireSkullRodPL1 , &States[S_HORNRODATK1+2]),
S_NORMAL (HROD, 'B', 0, A_ReFire , &States[S_HORNRODREADY]),
#define S_HORNRODATK2 (S_HORNRODATK1+3)
S_NORMAL (HROD, 'C', 2, NULL , &States[S_HORNRODATK2+1]),
S_NORMAL (HROD, 'D', 3, NULL , &States[S_HORNRODATK2+2]),
S_NORMAL (HROD, 'E', 2, NULL , &States[S_HORNRODATK2+3]),
S_NORMAL (HROD, 'F', 3, NULL , &States[S_HORNRODATK2+4]),
S_NORMAL (HROD, 'G', 4, A_FireSkullRodPL2 , &States[S_HORNRODATK2+5]),
S_NORMAL (HROD, 'F', 2, NULL , &States[S_HORNRODATK2+6]),
S_NORMAL (HROD, 'E', 3, NULL , &States[S_HORNRODATK2+7]),
S_NORMAL (HROD, 'D', 2, NULL , &States[S_HORNRODATK2+8]),
S_NORMAL (HROD, 'C', 2, A_ReFire , &States[S_HORNRODREADY])
};
IMPLEMENT_ACTOR (ASkullRod, Heretic, 2004, 30)
PROP_Flags (MF_SPECIAL)
PROP_SpawnState (S_WSKL)
PROP_Weapon_SelectionOrder (200)
PROP_Weapon_AmmoUse1 (USE_SKRD_AMMO_1)
PROP_Weapon_AmmoGive1 (50)
PROP_Weapon_UpState (S_HORNRODUP)
PROP_Weapon_DownState (S_HORNRODDOWN)
PROP_Weapon_ReadyState (S_HORNRODREADY)
PROP_Weapon_AtkState (S_HORNRODATK1)
PROP_Weapon_YAdjust (15)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("SkullRodAmmo")
PROP_Weapon_SisterType ("SkullRodPowered")
PROP_Weapon_ProjectileType ("HornRodFX1")
PROP_Inventory_PickupMessage("$TXT_WPNSKULLROD")
END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (ASkullRodPowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_POWERED_UP)
PROP_Weapon_AmmoUse1 (USE_SKRD_AMMO_2)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AtkState (S_HORNRODATK2)
PROP_Weapon_SisterType ("SkullRod")
PROP_Weapon_ProjectileType ("HornRodFX2")
END_DEFAULTS
// Horn Rod FX 1 ------------------------------------------------------------
class AHornRodFX1 : public AActor
{
DECLARE_ACTOR (AHornRodFX1, AActor)
};
FState AHornRodFX1::States[] =
{
#define S_HRODFX1 0
S_BRIGHT (FX00, 'A', 6, NULL , &States[S_HRODFX1+1]),
S_BRIGHT (FX00, 'B', 6, NULL , &States[S_HRODFX1+0]),
#define S_HRODFXI1 (S_HRODFX1+2)
S_BRIGHT (FX00, 'H', 5, NULL , &States[S_HRODFXI1+1]),
S_BRIGHT (FX00, 'I', 5, NULL , &States[S_HRODFXI1+2]),
S_BRIGHT (FX00, 'J', 4, NULL , &States[S_HRODFXI1+3]),
S_BRIGHT (FX00, 'K', 4, NULL , &States[S_HRODFXI1+4]),
S_BRIGHT (FX00, 'L', 3, NULL , &States[S_HRODFXI1+5]),
S_BRIGHT (FX00, 'M', 3, NULL , NULL)
};
IMPLEMENT_ACTOR (AHornRodFX1, Heretic, -1, 160)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (22)
PROP_Damage (3)
PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_Flags3 (MF3_WARNBOT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_HRODFX1)
PROP_DeathState (S_HRODFXI1)
PROP_SeeSound ("weapons/hornrodshoot")
PROP_DeathSound ("weapons/hornrodhit")
END_DEFAULTS
// Horn Rod FX 2 ------------------------------------------------------------
class AHornRodFX2 : public AActor
{
DECLARE_ACTOR (AHornRodFX2, AActor)
DECLARE_CLASS (AHornRodFX2, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState AHornRodFX2::States[] =
{
#define S_HRODFX2 0
S_BRIGHT (FX00, 'C', 3, NULL , &States[S_HRODFX2+1]),
S_BRIGHT (FX00, 'D', 3, A_SkullRodPL2Seek , &States[S_HRODFX2+2]),
S_BRIGHT (FX00, 'E', 3, NULL , &States[S_HRODFX2+3]),
S_BRIGHT (FX00, 'F', 3, A_SkullRodPL2Seek , &States[S_HRODFX2+0]),
#define S_HRODFXI2 (S_HRODFX2+4)
S_BRIGHT (FX00, 'H', 5, A_AddPlayerRain , &States[S_HRODFXI2+1]),
S_BRIGHT (FX00, 'I', 5, NULL , &States[S_HRODFXI2+2]),
S_BRIGHT (FX00, 'J', 4, NULL , &States[S_HRODFXI2+3]),
S_BRIGHT (FX00, 'K', 3, NULL , &States[S_HRODFXI2+4]),
S_BRIGHT (FX00, 'L', 3, NULL , &States[S_HRODFXI2+5]),
S_BRIGHT (FX00, 'M', 3, NULL , &States[S_HRODFXI2+6]),
S_NORMAL (FX00, 'G', 1, A_HideInCeiling , &States[S_HRODFXI2+7]),
S_NORMAL (FX00, 'G', 1, A_SkullRodStorm , &States[S_HRODFXI2+7])
};
IMPLEMENT_ACTOR (AHornRodFX2, Heretic, -1, 0)
PROP_RadiusFixed (12)
PROP_HeightFixed (8)
PROP_SpeedFixed (22)
PROP_Damage (10)
PROP_SpawnHealth (4*35)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_HRODFX2)
PROP_DeathState (S_HRODFXI2)
PROP_SeeSound ("weapons/hornrodshoot")
PROP_DeathSound ("weapons/hornrodpowhit")
END_DEFAULTS
IMPLEMENT_CLASS (AHornRodFX2)
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
{
@ -1553,41 +913,12 @@ int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
class ARainPillar : public AActor
{
DECLARE_ACTOR (ARainPillar, AActor)
DECLARE_CLASS (ARainPillar, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ARainPillar::States[] =
{
#define S_RAINPLR 0
S_BRIGHT (FX22, 'A', -1, NULL , NULL),
#define S_RAINPLRX (S_RAINPLR+1)
S_BRIGHT (FX22, 'B', 4, A_RainImpact , &States[S_RAINPLRX+1]),
S_BRIGHT (FX22, 'C', 4, NULL , &States[S_RAINPLRX+2]),
S_BRIGHT (FX22, 'D', 4, NULL , &States[S_RAINPLRX+3]),
S_BRIGHT (FX22, 'E', 4, NULL , &States[S_RAINPLRX+4]),
S_BRIGHT (FX22, 'F', 4, NULL , NULL),
#define S_RAINAIRXPLR (S_RAINPLRX+5)
S_BRIGHT (FX22, 'G', 4, NULL , &States[S_RAINAIRXPLR+1]),
S_BRIGHT (FX22, 'H', 4, NULL , &States[S_RAINAIRXPLR+2]),
S_BRIGHT (FX22, 'I', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (ARainPillar, Heretic, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (12)
PROP_SpeedFixed (12)
PROP_Damage (5)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_RAINPLR)
PROP_DeathState (S_RAINPLRX)
END_DEFAULTS
IMPLEMENT_CLASS (ARainPillar)
int ARainPillar::DoSpecialDamage (AActor *target, int damage)
{
@ -1602,16 +933,14 @@ int ARainPillar::DoSpecialDamage (AActor *target, int damage)
class ARainTracker : public AInventory
{
DECLARE_STATELESS_ACTOR (ARainTracker, AInventory)
DECLARE_CLASS (ARainTracker, AInventory)
public:
void Serialize (FArchive &arc);
AActor *Rain1, *Rain2;
};
IMPLEMENT_STATELESS_ACTOR (ARainTracker, Any, -1, 0)
PROP_Inventory_FlagsSet (IF_UNDROPPABLE)
END_DEFAULTS
IMPLEMENT_CLASS (ARainTracker)
void ARainTracker::Serialize (FArchive &arc)
{
Super::Serialize (arc);
@ -1640,7 +969,7 @@ void A_FireSkullRodPL1 (AActor *actor)
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
mo = P_SpawnPlayerMissile (actor, RUNTIME_CLASS(AHornRodFX1));
mo = P_SpawnPlayerMissile (actor, PClass::FindClass("HornRodFX1"));
// Randomize the first frame
if (mo && pr_fsr1() > 128)
{
@ -1822,7 +1151,7 @@ void A_RainImpact (AActor *actor)
{
if (actor->z > actor->floorz)
{
actor->SetState (&ARainPillar::States[S_RAINAIRXPLR]);
actor->SetState (actor->FindState("NotFloor"));
}
else if (pr_impact() < 40)
{

View file

@ -7,77 +7,6 @@
static FRandom pr_batspawn ("BatSpawn");
static FRandom pr_batmove ("BatMove");
void A_BatSpawnInit (AActor *);
void A_BatSpawn (AActor *);
void A_BatMove (AActor *);
// Bat Spawner --------------------------------------------------------------
class ABatSpawner : public AActor
{
DECLARE_ACTOR (ABatSpawner, AActor)
public:
void Activate (AActor *activator);
void Deactivate (AActor *activator);
};
FState ABatSpawner::States[] =
{
#define S_SPAWNBATS1 0
S_NORMAL (TNT1, 'A', 2, NULL , &States[S_SPAWNBATS1+1]),
S_NORMAL (TNT1, 'A', 2, A_BatSpawnInit , &States[S_SPAWNBATS1+2]),
S_NORMAL (TNT1, 'A', 2, A_BatSpawn , &States[S_SPAWNBATS1+2]),
#define S_SPAWNBATS_OFF (S_SPAWNBATS1+3)
S_NORMAL (TNT1, 'A', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (ABatSpawner, Hexen, 10225, 0)
PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_None)
PROP_SpawnState (S_SPAWNBATS1)
END_DEFAULTS
void ABatSpawner::Activate (AActor *activator)
{
SetState (&States[S_SPAWNBATS1]);
}
void ABatSpawner::Deactivate (AActor *activator)
{
SetState (&States[S_SPAWNBATS_OFF]);
}
// Bat ----------------------------------------------------------------------
class ABat : public AActor
{
DECLARE_ACTOR (ABat, AActor)
};
FState ABat::States[] =
{
#define S_BAT1 0
S_NORMAL (ABAT, 'A', 2, A_BatMove , &States[S_BAT1+1]),
S_NORMAL (ABAT, 'B', 2, A_BatMove , &States[S_BAT1+2]),
S_NORMAL (ABAT, 'C', 2, A_BatMove , &States[S_BAT1]),
#define S_BAT_DEATH (S_BAT1+3)
S_NORMAL (ABAT, 'A', 2, NULL , NULL),
};
IMPLEMENT_ACTOR (ABat, Hexen, -1, 0)
PROP_SpeedFixed (5)
PROP_RadiusFixed (3)
PROP_HeightFixed (3)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_PASSMOBJ)
PROP_SpawnState (S_BAT1)
PROP_DeathState (S_BAT_DEATH)
END_DEFAULTS
//===========================================================================
// Bat Spawner Variables
// special1 frequency counter
@ -111,7 +40,7 @@ void A_BatSpawn (AActor *actor)
delta = actor->args[1];
if (delta==0) delta=1;
angle = actor->angle + (((pr_batspawn()%delta)-(delta>>1))<<24);
mo = P_SpawnMissileAngle (actor, RUNTIME_CLASS(ABat), angle, 0);
mo = P_SpawnMissileAngle (actor, PClass::FindClass ("Bat"), angle, 0);
if (mo)
{
mo->args[0] = pr_batspawn()&63; // floatbob index

View file

@ -14,216 +14,6 @@ static FRandom pr_doblur ("BishopDoBlur");
static FRandom pr_sblur ("BishopSpawnBlur");
static FRandom pr_pain ("BishopPainBlur");
void A_BishopDecide (AActor *);
void A_BishopDoBlur (AActor *);
void A_BishopSpawnBlur (AActor *);
void A_BishopPainBlur (AActor *);
void A_BishopChase (AActor *);
void A_BishopAttack (AActor *);
void A_BishopAttack2 (AActor *);
void A_BishopPuff (AActor *);
void A_SetAltShadow (AActor *);
void A_BishopMissileWeave (AActor *);
void A_BishopMissileSeek (AActor *);
// Bishop -------------------------------------------------------------------
FState ABishop::States[] =
{
#define S_BISHOP_LOOK 0
S_NORMAL (BISH, 'A', 10, A_Look , &States[S_BISHOP_LOOK+0]),
#define S_BISHOP_BLUR (S_BISHOP_LOOK+1)
S_NORMAL (BISH, 'A', 2, A_BishopDoBlur , &States[S_BISHOP_BLUR+1]),
S_NORMAL (BISH, 'A', 4, A_BishopSpawnBlur , &States[S_BISHOP_BLUR+1]),
#define S_BISHOP_WALK (S_BISHOP_BLUR+2)
S_NORMAL (BISH, 'A', 2, A_Chase , &States[S_BISHOP_WALK+1]),
S_NORMAL (BISH, 'A', 2, A_BishopChase , &States[S_BISHOP_WALK+2]),
S_NORMAL (BISH, 'A', 2, NULL , &States[S_BISHOP_WALK+3]),
S_NORMAL (BISH, 'B', 2, A_BishopChase , &States[S_BISHOP_WALK+4]),
S_NORMAL (BISH, 'B', 2, A_Chase , &States[S_BISHOP_WALK+5]),
S_NORMAL (BISH, 'B', 2, A_BishopChase , &States[S_BISHOP_WALK+6]), // S_BISHOP_DECIDE
#define S_BISHOP_DECIDE (S_BISHOP_WALK+6)
S_NORMAL (BISH, 'A', 1, A_BishopDecide , &States[S_BISHOP_WALK+0]),
#define S_BISHOP_ATK (S_BISHOP_DECIDE+1)
S_NORMAL (BISH, 'A', 3, A_FaceTarget , &States[S_BISHOP_ATK+1]),
S_BRIGHT (BISH, 'D', 3, A_FaceTarget , &States[S_BISHOP_ATK+2]),
S_BRIGHT (BISH, 'E', 3, A_FaceTarget , &States[S_BISHOP_ATK+3]),
S_BRIGHT (BISH, 'F', 3, A_BishopAttack , &States[S_BISHOP_ATK+4]),
S_BRIGHT (BISH, 'F', 5, A_BishopAttack2 , &States[S_BISHOP_ATK+4]),
#define S_BISHOP_PAIN (S_BISHOP_ATK+5)
S_NORMAL (BISH, 'C', 6, A_Pain , &States[S_BISHOP_PAIN+1]),
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+2]),
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+3]),
S_NORMAL (BISH, 'C', 6, A_BishopPainBlur , &States[S_BISHOP_PAIN+4]),
S_NORMAL (BISH, 'C', 0, NULL , &States[S_BISHOP_WALK+0]),
#define S_BISHOP_DEATH (S_BISHOP_PAIN+5)
S_NORMAL (BISH, 'G', 6, NULL , &States[S_BISHOP_DEATH+1]),
S_BRIGHT (BISH, 'H', 6, A_Scream , &States[S_BISHOP_DEATH+2]),
S_BRIGHT (BISH, 'I', 5, A_NoBlocking , &States[S_BISHOP_DEATH+3]),
S_BRIGHT (BISH, 'J', 5, A_Explode , &States[S_BISHOP_DEATH+4]),
S_BRIGHT (BISH, 'K', 5, NULL , &States[S_BISHOP_DEATH+5]),
S_BRIGHT (BISH, 'L', 4, NULL , &States[S_BISHOP_DEATH+6]),
S_BRIGHT (BISH, 'M', 4, NULL , &States[S_BISHOP_DEATH+7]),
S_NORMAL (BISH, 'N', 4, A_BishopPuff , &States[S_BISHOP_DEATH+8]),
S_NORMAL (BISH, 'O', 4, A_QueueCorpse , &States[S_BISHOP_DEATH+9]),
S_NORMAL (BISH, 'P', -1, NULL , NULL),
#define S_BISHOP_ICE (S_BISHOP_DEATH+10)
S_NORMAL (BISH, 'X', 5, A_FreezeDeath , &States[S_BISHOP_ICE+1]),
S_NORMAL (BISH, 'X', 1, A_FreezeDeathChunks , &States[S_BISHOP_ICE+1])
};
IMPLEMENT_ACTOR (ABishop, Hexen, 114, 19)
PROP_SpawnHealth (130)
PROP_RadiusFixed (22)
PROP_HeightFixed (65)
PROP_SpeedFixed (10)
PROP_PainChance (110)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY|MF_NOBLOOD)
PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP)
PROP_Flags3 (MF3_DONTOVERLAP)
PROP_Flags4 (MF4_NOTARGETSWITCH)
PROP_SpawnState (S_BISHOP_LOOK)
PROP_SeeState (S_BISHOP_WALK)
PROP_PainState (S_BISHOP_PAIN)
PROP_MissileState (S_BISHOP_ATK)
PROP_DeathState (S_BISHOP_DEATH)
PROP_IDeathState (S_BISHOP_ICE)
PROP_SeeSound ("BishopSight")
PROP_AttackSound ("BishopAttack")
PROP_PainSound ("BishopPain")
PROP_DeathSound ("BishopDeath")
PROP_ActiveSound ("BishopActiveSounds")
PROP_Obituary("$OB_BISHOP")
END_DEFAULTS
void ABishop::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
{ // Bishop radius death
damage = 25 + (pr_boom() & 15);
}
// Bishop puff --------------------------------------------------------------
class ABishopPuff : public AActor
{
DECLARE_ACTOR (ABishopPuff, AActor)
};
FState ABishopPuff::States[] =
{
S_NORMAL (BISH, 'Q', 5, NULL , &States[1]),
S_NORMAL (BISH, 'R', 5, NULL , &States[2]),
S_NORMAL (BISH, 'S', 5, NULL , &States[3]),
S_NORMAL (BISH, 'T', 5, NULL , &States[4]),
S_NORMAL (BISH, 'U', 6, NULL , &States[5]),
S_NORMAL (BISH, 'V', 6, NULL , &States[6]),
S_NORMAL (BISH, 'W', 5, NULL , NULL)
};
IMPLEMENT_ACTOR (ABishopPuff, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Bishop blur --------------------------------------------------------------
class ABishopBlur : public AActor
{
DECLARE_ACTOR (ABishopBlur, AActor)
};
FState ABishopBlur::States[] =
{
S_NORMAL (BISH, 'A', 16, NULL , &States[1]),
S_NORMAL (BISH, 'A', 8, A_SetAltShadow , NULL)
};
IMPLEMENT_ACTOR (ABishopBlur, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Bishop pain blur ---------------------------------------------------------
class ABishopPainBlur : public AActor
{
DECLARE_ACTOR (ABishopPainBlur, AActor)
};
FState ABishopPainBlur::States[] =
{
S_NORMAL (BISH, 'C', 8, NULL , NULL)
};
IMPLEMENT_ACTOR (ABishopPainBlur, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Bishop FX ----------------------------------------------------------------
class ABishopFX : public AActor
{
DECLARE_ACTOR (ABishopFX, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ABishopFX::States[] =
{
#define S_BISHFX1 0
S_BRIGHT (BPFX, 'A', 1, A_BishopMissileWeave , &States[S_BISHFX1+1]),
S_BRIGHT (BPFX, 'B', 1, A_BishopMissileWeave , &States[S_BISHFX1+2]),
S_BRIGHT (BPFX, 'A', 1, A_BishopMissileWeave , &States[S_BISHFX1+3]),
S_BRIGHT (BPFX, 'B', 1, A_BishopMissileWeave , &States[S_BISHFX1+4]),
S_BRIGHT (BPFX, 'B', 0, A_BishopMissileSeek , &States[S_BISHFX1+0]),
#define S_BISHFXI1 (S_BISHFX1+5)
S_BRIGHT (BPFX, 'C', 4, NULL , &States[S_BISHFXI1+1]),
S_BRIGHT (BPFX, 'D', 4, NULL , &States[S_BISHFXI1+2]),
S_BRIGHT (BPFX, 'E', 4, NULL , &States[S_BISHFXI1+3]),
S_BRIGHT (BPFX, 'F', 4, NULL , &States[S_BISHFXI1+4]),
S_BRIGHT (BPFX, 'G', 3, NULL , &States[S_BISHFXI1+5]),
S_BRIGHT (BPFX, 'H', 3, NULL , NULL)
};
IMPLEMENT_ACTOR (ABishopFX, Hexen, -1, 0)
PROP_RadiusFixed (10)
PROP_HeightFixed (6)
PROP_SpeedFixed (10)
PROP_Damage (1)
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT|MF2_SEEKERMISSILE)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_BISHFX1)
PROP_DeathState (S_BISHFXI1)
PROP_DeathSound ("BishopMissileExplode")
END_DEFAULTS
int ABishopFX::DoSpecialDamage (AActor *target, int damage)
{ // Bishops are just too nasty
return damage >> 1;
}
//============================================================================
//
// A_BishopAttack
@ -264,7 +54,7 @@ void A_BishopAttack2 (AActor *actor)
actor->SetState (actor->SeeState);
return;
}
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ABishopFX));
mo = P_SpawnMissile (actor, actor->target, PClass::FindClass("BishopFX"));
if (mo != NULL)
{
mo->tracer = actor->target;
@ -302,17 +92,6 @@ void A_BishopMissileWeave (AActor *actor)
actor->special2 = weaveZ + (weaveXY<<16);
}
//============================================================================
//
// A_BishopMissileSeek
//
//============================================================================
void A_BishopMissileSeek (AActor *actor)
{
P_SeekerMissile (actor, ANGLE_1*2, ANGLE_1*3);
}
//============================================================================
//
// A_BishopDecide
@ -327,7 +106,7 @@ void A_BishopDecide (AActor *actor)
}
else
{
actor->SetState (&ABishop::States[S_BISHOP_BLUR]);
actor->SetState (actor->FindState ("Blur"));
}
}
@ -378,7 +157,7 @@ void A_BishopSpawnBlur (AActor *actor)
actor->SetState (actor->MissileState);
}
}
mo = Spawn<ABishopBlur> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo = Spawn ("BishopBlur", actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo)
{
mo->angle = actor->angle;
@ -408,7 +187,7 @@ void A_BishopPuff (AActor *actor)
{
AActor *mo;
mo = Spawn<ABishopPuff> (actor->x, actor->y, actor->z + 40*FRACUNIT, ALLOW_REPLACE);
mo = Spawn ("BishopPuff", actor->x, actor->y, actor->z + 40*FRACUNIT, ALLOW_REPLACE);
if (mo)
{
mo->momz = FRACUNIT/2;
@ -427,27 +206,15 @@ void A_BishopPainBlur (AActor *actor)
if (pr_pain() < 64)
{
actor->SetState (&ABishop::States[S_BISHOP_BLUR]);
actor->SetState (actor->FindState ("Blur"));
return;
}
fixed_t x = actor->x + (pr_pain.Random2()<<12);
fixed_t y = actor->y + (pr_pain.Random2()<<12);
fixed_t z = actor->z + (pr_pain.Random2()<<11);
mo = Spawn<ABishopPainBlur> (x, y, z, ALLOW_REPLACE);
mo = Spawn ("BishopPainBlur", x, y, z, ALLOW_REPLACE);
if (mo)
{
mo->angle = actor->angle;
}
}
//==========================================================================
//
// A_SetAltShadow
//
//==========================================================================
void A_SetAltShadow (AActor *actor)
{
actor->alpha = HX_ALTSHADOW;
actor->RenderStyle = STYLE_Translucent;
}

View file

@ -14,64 +14,14 @@
class AArtiBlastRadius : public AInventory
{
DECLARE_ACTOR (AArtiBlastRadius, AInventory)
DECLARE_CLASS (AArtiBlastRadius, AInventory)
public:
bool Use (bool pickup);
protected:
void BlastActor (AActor *victim, fixed_t strength);
};
FState AArtiBlastRadius::States[] =
{
S_BRIGHT (BLST, 'A', 4, NULL , &States[1]),
S_BRIGHT (BLST, 'B', 4, NULL , &States[2]),
S_BRIGHT (BLST, 'C', 4, NULL , &States[3]),
S_BRIGHT (BLST, 'D', 4, NULL , &States[4]),
S_BRIGHT (BLST, 'E', 4, NULL , &States[5]),
S_BRIGHT (BLST, 'F', 4, NULL , &States[6]),
S_BRIGHT (BLST, 'G', 4, NULL , &States[7]),
S_BRIGHT (BLST, 'H', 4, NULL , &States[0]),
};
IMPLEMENT_ACTOR (AArtiBlastRadius, Hexen, 10110, 74)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
PROP_Inventory_DefMaxAmount
PROP_Inventory_PickupFlash (1)
PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND)
PROP_Inventory_Icon ("ARTIBLST")
PROP_Inventory_PickupSound ("misc/p_pkup")
PROP_Inventory_PickupMessage("$TXT_ARTIBLASTRADIUS")
END_DEFAULTS
// Blast Effect -------------------------------------------------------------
class ABlastEffect : public AActor
{
DECLARE_ACTOR (ABlastEffect, AActor)
};
FState ABlastEffect::States[] =
{
S_NORMAL (RADE, 'A', 4, NULL , &States[1]),
S_NORMAL (RADE, 'B', 4, NULL , &States[2]),
S_NORMAL (RADE, 'C', 4, NULL , &States[3]),
S_NORMAL (RADE, 'D', 4, NULL , &States[4]),
S_NORMAL (RADE, 'E', 4, NULL , &States[5]),
S_NORMAL (RADE, 'F', 4, NULL , &States[6]),
S_NORMAL (RADE, 'G', 4, NULL , &States[7]),
S_NORMAL (RADE, 'H', 4, NULL , &States[8]),
S_NORMAL (RADE, 'I', 4, NULL , NULL)
};
IMPLEMENT_ACTOR (ABlastEffect, Any, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (TRANSLUC66)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (AArtiBlastRadius)
//==========================================================================
//
@ -182,7 +132,7 @@ void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength)
x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]);
y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]);
z = victim->z - victim->floorclip + (victim->height>>1);
mo = Spawn<ABlastEffect> (x, y, z, ALLOW_REPLACE);
mo = Spawn ("BlastEffect", x, y, z, ALLOW_REPLACE);
if (mo)
{
mo->momx = victim->momx;

View file

@ -10,35 +10,12 @@
class AArtiBoostArmor : public AInventory
{
DECLARE_ACTOR (AArtiBoostArmor, AInventory)
DECLARE_CLASS (AArtiBoostArmor, AInventory)
public:
bool Use (bool pickup);
};
FState AArtiBoostArmor::States[] =
{
#define S_ARTI_ARMOR1 0
S_BRIGHT (BRAC, 'A', 4, NULL , &States[1]),
S_BRIGHT (BRAC, 'B', 4, NULL , &States[2]),
S_BRIGHT (BRAC, 'C', 4, NULL , &States[3]),
S_BRIGHT (BRAC, 'D', 4, NULL , &States[4]),
S_BRIGHT (BRAC, 'E', 4, NULL , &States[5]),
S_BRIGHT (BRAC, 'F', 4, NULL , &States[6]),
S_BRIGHT (BRAC, 'G', 4, NULL , &States[7]),
S_BRIGHT (BRAC, 'H', 4, NULL , &States[0]),
};
IMPLEMENT_ACTOR (AArtiBoostArmor, Hexen, 8041, 22)
PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
PROP_Inventory_DefMaxAmount
PROP_Inventory_PickupFlash (1)
PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND)
PROP_Inventory_Icon ("ARTIBRAC")
PROP_Inventory_PickupSound ("misc/p_pkup")
PROP_Inventory_PickupMessage("$TXT_ARTIBOOSTARMOR")
END_DEFAULTS
IMPLEMENT_CLASS (AArtiBoostArmor)
bool AArtiBoostArmor::Use (bool pickup)
{

View file

@ -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);
}

View file

@ -22,270 +22,17 @@ void A_CFlameRotate (AActor *);
void A_CFlamePuff (AActor *);
void A_CFlameMissile (AActor *);
// The Cleric's Flame Strike ------------------------------------------------
class ACWeapFlame : public AClericWeapon
{
DECLARE_ACTOR (ACWeapFlame, AClericWeapon)
};
FState ACWeapFlame::States[] =
{
#define S_CFLAME1 0
S_BRIGHT (WCFM, 'A', 4, NULL , &States[S_CFLAME1+1]),
S_BRIGHT (WCFM, 'B', 4, NULL , &States[S_CFLAME1+2]),
S_BRIGHT (WCFM, 'C', 4, NULL , &States[S_CFLAME1+3]),
S_BRIGHT (WCFM, 'D', 4, NULL , &States[S_CFLAME1+4]),
S_BRIGHT (WCFM, 'E', 4, NULL , &States[S_CFLAME1+5]),
S_BRIGHT (WCFM, 'F', 4, NULL , &States[S_CFLAME1+6]),
S_BRIGHT (WCFM, 'G', 4, NULL , &States[S_CFLAME1+7]),
S_BRIGHT (WCFM, 'H', 4, NULL , &States[S_CFLAME1]),
#define S_CFLAMEREADY (S_CFLAME1+8)
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+1]),
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+2]),
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+3]),
S_NORMAL (CFLM, 'A', 1, A_WeaponReady , &States[S_CFLAMEREADY+4]),
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+5]),
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+6]),
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+7]),
S_NORMAL (CFLM, 'B', 1, A_WeaponReady , &States[S_CFLAMEREADY+8]),
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+9]),
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+10]),
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY+11]),
S_NORMAL (CFLM, 'C', 1, A_WeaponReady , &States[S_CFLAMEREADY]),
#define S_CFLAMEDOWN (S_CFLAMEREADY+12)
S_NORMAL (CFLM, 'A', 1, A_Lower , &States[S_CFLAMEDOWN]),
#define S_CFLAMEUP (S_CFLAMEDOWN+1)
S_NORMAL (CFLM, 'A', 1, A_Raise , &States[S_CFLAMEUP]),
#define S_CFLAMEATK (S_CFLAMEUP+1)
S_NORMAL2 (CFLM, 'A', 2, NULL , &States[S_CFLAMEATK+1], 0, 40),
S_NORMAL2 (CFLM, 'D', 2, NULL , &States[S_CFLAMEATK+2], 0, 50),
S_NORMAL2 (CFLM, 'D', 2, NULL , &States[S_CFLAMEATK+3], 0, 36),
S_BRIGHT (CFLM, 'E', 4, NULL , &States[S_CFLAMEATK+4]),
S_BRIGHT (CFLM, 'F', 4, A_CFlameAttack , &States[S_CFLAMEATK+5]),
S_BRIGHT (CFLM, 'E', 4, NULL , &States[S_CFLAMEATK+6]),
S_NORMAL2 (CFLM, 'G', 2, NULL , &States[S_CFLAMEATK+7], 0, 40),
S_NORMAL (CFLM, 'G', 2, NULL , &States[S_CFLAMEREADY]),
};
IMPLEMENT_ACTOR (ACWeapFlame, Hexen, 8009, 0)
PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
PROP_SpawnState (S_CFLAME1)
PROP_Weapon_SelectionOrder (1000)
PROP_Weapon_AmmoUse1 (4)
PROP_Weapon_AmmoGive1 (25)
PROP_Weapon_UpState (S_CFLAMEUP)
PROP_Weapon_DownState (S_CFLAMEDOWN)
PROP_Weapon_ReadyState (S_CFLAMEREADY)
PROP_Weapon_AtkState (S_CFLAMEATK)
PROP_Weapon_Kickback (150)
PROP_Weapon_YAdjust (10)
PROP_Weapon_MoveCombatDist (27000000)
PROP_Weapon_AmmoType1 ("Mana2")
PROP_Weapon_ProjectileType ("CFlameMissile")
PROP_Inventory_PickupMessage("$TXT_WEAPON_C3")
END_DEFAULTS
// Floor Flame --------------------------------------------------------------
class ACFlameFloor : public AActor
{
DECLARE_ACTOR (ACFlameFloor, AActor)
};
FState ACFlameFloor::States[] =
{
S_BRIGHT (CFFX, 'N', 5, NULL , &States[1]),
S_BRIGHT (CFFX, 'O', 4, NULL , &States[2]),
S_BRIGHT (CFFX, 'P', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ACFlameFloor, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (0)
END_DEFAULTS
// Flame Puff ---------------------------------------------------------------
class AFlamePuff : public AActor
{
DECLARE_ACTOR (AFlamePuff, AActor)
};
FState AFlamePuff::States[] =
{
S_BRIGHT (CFFX, 'A', 3, NULL , &States[1]),
S_BRIGHT (CFFX, 'B', 3, NULL , &States[2]),
S_BRIGHT (CFFX, 'C', 3, NULL , &States[3]),
S_BRIGHT (CFFX, 'D', 4, NULL , &States[4]),
S_BRIGHT (CFFX, 'E', 3, NULL , &States[5]),
S_BRIGHT (CFFX, 'F', 4, NULL , &States[6]),
S_BRIGHT (CFFX, 'G', 3, NULL , &States[7]),
S_BRIGHT (CFFX, 'H', 4, NULL , &States[8]),
S_BRIGHT (CFFX, 'I', 3, NULL , &States[9]),
S_BRIGHT (CFFX, 'J', 4, NULL , &States[10]),
S_BRIGHT (CFFX, 'K', 3, NULL , &States[11]),
S_BRIGHT (CFFX, 'L', 4, NULL , &States[12]),
S_BRIGHT (CFFX, 'M', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AFlamePuff, Hexen, -1, 0)
PROP_RadiusFixed (1)
PROP_HeightFixed (1)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (0)
PROP_SeeSound ("ClericFlameExplode")
PROP_AttackSound ("ClericFlameExplode")
END_DEFAULTS
// Flame Puff 2 -------------------------------------------------------------
class AFlamePuff2 : public AActor
{
DECLARE_ACTOR (AFlamePuff2, AActor)
};
FState AFlamePuff2::States[] =
{
S_BRIGHT (CFFX, 'A', 3, NULL , &States[1]),
S_BRIGHT (CFFX, 'B', 3, NULL , &States[2]),
S_BRIGHT (CFFX, 'C', 3, NULL , &States[3]),
S_BRIGHT (CFFX, 'D', 4, NULL , &States[4]),
S_BRIGHT (CFFX, 'E', 3, NULL , &States[5]),
S_BRIGHT (CFFX, 'F', 4, NULL , &States[6]),
S_BRIGHT (CFFX, 'G', 3, NULL , &States[7]),
S_BRIGHT (CFFX, 'H', 4, NULL , &States[8]),
S_BRIGHT (CFFX, 'I', 3, NULL , &States[9]),
S_BRIGHT (CFFX, 'C', 3, NULL , &States[10]),
S_BRIGHT (CFFX, 'D', 4, NULL , &States[11]),
S_BRIGHT (CFFX, 'E', 3, NULL , &States[12]),
S_BRIGHT (CFFX, 'F', 4, NULL , &States[13]),
S_BRIGHT (CFFX, 'G', 3, NULL , &States[14]),
S_BRIGHT (CFFX, 'H', 4, NULL , &States[15]),
S_BRIGHT (CFFX, 'I', 3, NULL , &States[16]),
S_BRIGHT (CFFX, 'J', 4, NULL , &States[17]),
S_BRIGHT (CFFX, 'K', 3, NULL , &States[18]),
S_BRIGHT (CFFX, 'L', 4, NULL , &States[19]),
S_BRIGHT (CFFX, 'M', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AFlamePuff2, Hexen, -1, 0)
PROP_RadiusFixed (1)
PROP_HeightFixed (1)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (0)
PROP_SeeSound ("ClericFlameExplode")
PROP_AttackSound ("ClericFlameExplode")
END_DEFAULTS
// Circle Flame -------------------------------------------------------------
class ACircleFlame : public AActor
{
DECLARE_ACTOR (ACircleFlame, AActor)
public:
void GetExplodeParms (int &damage, int &dist, bool &hurtSource);
};
FState ACircleFlame::States[] =
{
#define S_CIRCLE_FLAME1 0
S_BRIGHT (CFCF, 'A', 4, NULL , &States[S_CIRCLE_FLAME1+1]),
S_BRIGHT (CFCF, 'B', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+2]),
S_BRIGHT (CFCF, 'C', 2, NULL , &States[S_CIRCLE_FLAME1+3]),
S_BRIGHT (CFCF, 'D', 1, NULL , &States[S_CIRCLE_FLAME1+4]),
S_BRIGHT (CFCF, 'E', 2, NULL , &States[S_CIRCLE_FLAME1+5]),
S_BRIGHT (CFCF, 'F', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+6]),
S_BRIGHT (CFCF, 'G', 1, NULL , &States[S_CIRCLE_FLAME1+7]),
S_BRIGHT (CFCF, 'H', 2, NULL , &States[S_CIRCLE_FLAME1+8]),
S_BRIGHT (CFCF, 'I', 2, NULL , &States[S_CIRCLE_FLAME1+9]),
S_BRIGHT (CFCF, 'J', 1, A_CFlameRotate , &States[S_CIRCLE_FLAME1+10]),
S_BRIGHT (CFCF, 'K', 2, NULL , &States[S_CIRCLE_FLAME1+11]),
S_BRIGHT (CFCF, 'L', 3, NULL , &States[S_CIRCLE_FLAME1+12]),
S_BRIGHT (CFCF, 'M', 3, NULL , &States[S_CIRCLE_FLAME1+13]),
S_BRIGHT (CFCF, 'N', 2, A_CFlameRotate , &States[S_CIRCLE_FLAME1+14]),
S_BRIGHT (CFCF, 'O', 3, NULL , &States[S_CIRCLE_FLAME1+15]),
S_BRIGHT (CFCF, 'P', 2, NULL , NULL),
#define S_CIRCLE_FLAME_X1 (S_CIRCLE_FLAME1+16)
S_BRIGHT (CFCF, 'Q', 3, NULL , &States[S_CIRCLE_FLAME_X1+1]),
S_BRIGHT (CFCF, 'R', 3, NULL , &States[S_CIRCLE_FLAME_X1+2]),
S_BRIGHT (CFCF, 'S', 3, A_Explode , &States[S_CIRCLE_FLAME_X1+3]),
S_BRIGHT (CFCF, 'T', 3, NULL , &States[S_CIRCLE_FLAME_X1+4]),
S_BRIGHT (CFCF, 'U', 3, NULL , &States[S_CIRCLE_FLAME_X1+5]),
S_BRIGHT (CFCF, 'V', 3, NULL , &States[S_CIRCLE_FLAME_X1+6]),
S_BRIGHT (CFCF, 'W', 3, NULL , &States[S_CIRCLE_FLAME_X1+7]),
S_BRIGHT (CFCF, 'X', 3, NULL , &States[S_CIRCLE_FLAME_X1+8]),
S_BRIGHT (CFCF, 'Y', 3, NULL , &States[S_CIRCLE_FLAME_X1+9]),
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ACircleFlame, Hexen, -1, 0)
PROP_RadiusFixed (6)
PROP_Damage (2)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_CIRCLE_FLAME1)
PROP_DeathState (S_CIRCLE_FLAME_X1)
PROP_DeathSound ("ClericFlameCircle")
END_DEFAULTS
void ACircleFlame::GetExplodeParms (int &damage, int &dist, bool &hurtSource)
{
damage = 20;
hurtSource = false;
}
// Flame Missile ------------------------------------------------------------
class ACFlameMissile : public AActor
{
DECLARE_ACTOR (ACFlameMissile, AActor)
DECLARE_CLASS (ACFlameMissile, AActor)
public:
void BeginPlay ();
void Tick ();
};
FState ACFlameMissile::States[] =
{
#define S_CFLAME_MISSILE1 0
S_BRIGHT (CFFX, 'A', 4, NULL , &States[S_CFLAME_MISSILE1+1]),
S_NORMAL (CFFX, 'A', 1, A_CFlamePuff , &AFlamePuff::States[0]),
#define S_CFLAME_MISSILE_X (S_CFLAME_MISSILE1+2)
S_BRIGHT (CFFX, 'A', 1, A_CFlameMissile , &AFlamePuff::States[0]),
};
IMPLEMENT_ACTOR (ACFlameMissile, Hexen, -1, 0)
PROP_SpeedFixed (200)
PROP_RadiusFixed (14)
PROP_HeightFixed (8)
PROP_Damage (8)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
PROP_RenderFlags (RF_INVISIBLE)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_CFLAME_MISSILE1)
PROP_DeathState (S_CFLAME_MISSILE_X)
END_DEFAULTS
IMPLEMENT_CLASS (ACFlameMissile)
void ACFlameMissile::BeginPlay ()
{
@ -347,7 +94,7 @@ void ACFlameMissile::Tick ()
{
newz = floorz;
}
mo = Spawn<ACFlameFloor> (x, y, newz, ALLOW_REPLACE);
mo = Spawn ("CFlameFloor", x, y, newz, ALLOW_REPLACE);
if (mo)
{
mo->angle = angle;
@ -432,7 +179,7 @@ void A_CFlameMissile (AActor *actor)
{
an = (i*ANG45)>>ANGLETOFINESHIFT;
an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT;
mo = Spawn<ACircleFlame> (BlockingMobj->x+FixedMul(dist, finecosine[an]),
mo = Spawn ("CircleFlame", BlockingMobj->x+FixedMul(dist, finecosine[an]),
BlockingMobj->y+FixedMul(dist, finesine[an]),
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
if (mo)
@ -443,7 +190,7 @@ void A_CFlameMissile (AActor *actor)
mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]);
mo->tics -= pr_missile()&3;
}
mo = Spawn<ACircleFlame> (BlockingMobj->x-FixedMul(dist, finecosine[an]),
mo = Spawn ("CircleFlame", BlockingMobj->x-FixedMul(dist, finecosine[an]),
BlockingMobj->y-FixedMul(dist, finesine[an]),
BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
if(mo)
@ -455,7 +202,7 @@ void A_CFlameMissile (AActor *actor)
mo->tics -= pr_missile()&3;
}
}
actor->SetState (&AFlamePuff2::States[0]);
actor->SetState (actor->SpawnState);
}
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -325,24 +325,6 @@ void A_FSwordAttack (AActor *actor)
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
}
//============================================================================
//
// A_FSwordAttack2
//
//============================================================================
void A_FSwordAttack2 (AActor *actor)
{
angle_t angle = actor->angle;
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/4, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/8, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/8, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/4, 0);
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
}
//============================================================================
//
// A_FSwordFlames
@ -397,3 +379,24 @@ void AFighterWeaponPiece::BeginPlay ()
Super::BeginPlay ();
FourthWeaponClass = RUNTIME_CLASS(AFWeapQuietus);
}
//============================================================================
//
// A_FighterAttack
//
//============================================================================
void A_FighterAttack (AActor *actor)
{
if (!actor->target) return;
angle_t angle = actor->angle;
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/4, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle+ANG45/8, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/8, 0);
P_SpawnMissileAngle (actor, RUNTIME_CLASS(AFSwordMissile), angle-ANG45/4, 0);
S_Sound (actor, CHAN_WEAPON, "FighterSwordFire", 1, ATTN_NORM);
}

View file

@ -21,30 +21,6 @@ void A_PoisonBagCheck (AActor *);
void A_CheckThrowBomb (AActor *);
void A_CheckThrowBomb2 (AActor *);
// Poison Bag (Flechette used by Cleric) ------------------------------------
class APoisonBag : public AActor
{
DECLARE_ACTOR (APoisonBag, AActor)
};
FState APoisonBag::States[] =
{
#define S_POISONBAG1 0
S_BRIGHT (PSBG, 'A', 18, NULL , &States[S_POISONBAG1+1]),
S_BRIGHT (PSBG, 'B', 4, NULL , &States[S_POISONBAG1+2]),
S_NORMAL (PSBG, 'C', 3, NULL , &States[S_POISONBAG1+3]),
S_NORMAL (PSBG, 'C', 1, A_PoisonBagInit , NULL),
};
IMPLEMENT_ACTOR (APoisonBag, Hexen, -1, 0)
PROP_RadiusFixed (5)
PROP_HeightFixed (5)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_SpawnState (S_POISONBAG1)
END_DEFAULTS
// Fire Bomb (Flechette used by Mage) ---------------------------------------
class AFireBomb : public AActor
@ -86,58 +62,6 @@ IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0)
PROP_DeathSound ("FlechetteExplode")
END_DEFAULTS
// Throwing Bomb (Flechette used by Fighter) --------------------------------
class AThrowingBomb : public AActor
{
DECLARE_ACTOR (AThrowingBomb, AActor)
};
FState AThrowingBomb::States[] =
{
#define S_THROWINGBOMB1 0
S_NORMAL (THRW, 'A', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB1+1]),
S_NORMAL (THRW, 'B', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+2]),
S_NORMAL (THRW, 'C', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+3]),
S_NORMAL (THRW, 'D', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+4]),
S_NORMAL (THRW, 'E', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB1+5]),
S_NORMAL (THRW, 'F', 3, A_CheckThrowBomb2 , &States[S_THROWINGBOMB1]),
#define S_THROWINGBOMB7 (S_THROWINGBOMB1+6)
S_NORMAL (THRW, 'G', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+1]),
S_NORMAL (THRW, 'F', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB7+2]),
S_NORMAL (THRW, 'H', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+3]),
S_NORMAL (THRW, 'F', 4, A_CheckThrowBomb , &States[S_THROWINGBOMB7+4]),
S_NORMAL (THRW, 'G', 6, A_CheckThrowBomb , &States[S_THROWINGBOMB7+5]),
S_NORMAL (THRW, 'F', 3, A_CheckThrowBomb , &States[S_THROWINGBOMB7+5]),
#define S_THROWINGBOMB_X1 (S_THROWINGBOMB7+6)
S_BRIGHT (CFCF, 'Q', 4, A_NoGravity , &States[S_THROWINGBOMB_X1+1]),
S_BRIGHT (CFCF, 'R', 3, A_Scream , &States[S_THROWINGBOMB_X1+2]),
S_BRIGHT (CFCF, 'S', 4, A_Explode , &States[S_THROWINGBOMB_X1+3]),
S_BRIGHT (CFCF, 'T', 3, NULL , &States[S_THROWINGBOMB_X1+4]),
S_BRIGHT (CFCF, 'U', 4, NULL , &States[S_THROWINGBOMB_X1+5]),
S_BRIGHT (CFCF, 'W', 3, NULL , &States[S_THROWINGBOMB_X1+6]),
S_BRIGHT (CFCF, 'X', 4, NULL , &States[S_THROWINGBOMB_X1+7]),
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AThrowingBomb, Hexen, -1, 0)
PROP_SpawnHealth (48)
PROP_SpeedFixed (12)
PROP_RadiusFixed (8)
PROP_HeightFixed (10)
PROP_DamageType (NAME_Fire)
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_HEXENBOUNCE)
PROP_SpawnState (S_THROWINGBOMB1)
PROP_DeathState (S_THROWINGBOMB_X1)
PROP_SeeSound ("FlechetteBounce")
PROP_DeathSound ("FlechetteExplode")
END_DEFAULTS
// Poison Bag Artifact (Flechette) ------------------------------------------
class AArtiPoisonBag : public AInventory
@ -184,7 +108,7 @@ bool AArtiPoisonBag1::Use (bool pickup)
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
AActor *mo;
mo = Spawn<APoisonBag> (
mo = Spawn ("PoisonBag",
Owner->x+16*finecosine[angle],
Owner->y+24*finesine[angle], Owner->z-
Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
@ -243,7 +167,7 @@ bool AArtiPoisonBag3::Use (bool pickup)
{
AActor *mo;
mo = Spawn<AThrowingBomb> (Owner->x, Owner->y,
mo = Spawn ("ThrowingBomb", Owner->x, Owner->y,
Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0), ALLOW_REPLACE);
if (mo)
{
@ -547,7 +471,7 @@ void A_CheckThrowBomb2 (AActor *actor)
TMulScale32 (actor->momx, actor->momx, actor->momy, actor->momy, actor->momz, actor->momz)
< (3*3)/(2*2))
{
actor->SetState (&AThrowingBomb::States[S_THROWINGBOMB7]);
actor->SetState (actor->SpawnState + 6);
actor->z = actor->floorz;
actor->momz = 0;
actor->flags2 &= ~MF2_BOUNCETYPE;

View file

@ -1284,7 +1284,7 @@ void A_SorcFX2Orbit (AActor *actor)
void A_SpawnBishop(AActor *actor)
{
AActor *mo;
mo = Spawn<ABishop> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo = Spawn("Bishop", actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo)
{
if (!P_TestMobjLocation(mo))

View file

@ -19,13 +19,6 @@ public:
void BeginPlay ();
};
class ABishop : public AActor
{
DECLARE_ACTOR (ABishop, AActor)
public:
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
};
class AHeresiarch : public AActor
{
DECLARE_ACTOR (AHeresiarch, AActor)

View file

@ -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);
}

View file

@ -343,41 +343,6 @@ bool AMageStaffFX2::SpecialBlastHandling (AActor *source, fixed_t strength)
//============================================================================
//============================================================================
//
// MStaffSpawn2 - for use by mage class boss
//
//============================================================================
void MStaffSpawn2 (AActor *actor, angle_t angle)
{
AActor *mo;
mo = P_SpawnMissileAngleZ (actor, actor->z+40*FRACUNIT,
RUNTIME_CLASS(AMageStaffFX2), angle, 0);
if (mo)
{
mo->target = actor;
mo->tracer = P_BlockmapSearch (mo, 10, FrontBlockCheck);
}
}
//============================================================================
//
// A_MStaffAttack2 - for use by mage class boss
//
//============================================================================
void A_MStaffAttack2 (AActor *actor)
{
angle_t angle;
angle = actor->angle;
MStaffSpawn2 (actor, angle);
MStaffSpawn2 (actor, angle-ANGLE_1*5);
MStaffSpawn2 (actor, angle+ANGLE_1*5);
S_Sound (actor, CHAN_WEAPON, "MageStaffFire", 1, ATTN_NORM);
}
//============================================================================
//
// MStaffSpawn
@ -534,3 +499,41 @@ static AActor *FrontBlockCheck (AActor *mo, int index)
}
return NULL;
}
//============================================================================
//
// MStaffSpawn2 - for use by mage class boss
//
//============================================================================
void MStaffSpawn2 (AActor *actor, angle_t angle)
{
AActor *mo;
mo = P_SpawnMissileAngleZ (actor, actor->z+40*FRACUNIT,
RUNTIME_CLASS(AMageStaffFX2), angle, 0);
if (mo)
{
mo->target = actor;
mo->tracer = P_BlockmapSearch (mo, 10, FrontBlockCheck);
}
}
//============================================================================
//
// A_MStaffAttack2 - for use by mage class boss
//
//============================================================================
void A_MageAttack (AActor *actor)
{
if (!actor->target) return;
angle_t angle;
angle = actor->angle;
MStaffSpawn2 (actor, angle);
MStaffSpawn2 (actor, angle-ANGLE_1*5);
MStaffSpawn2 (actor, angle+ANGLE_1*5);
S_Sound (actor, CHAN_WEAPON, "MageStaffFire", 1, ATTN_NORM);
}

View file

@ -37,70 +37,6 @@ IMPLEMENT_ACTOR (AArtiDarkServant, Hexen, 86, 16)
PROP_Inventory_PickupMessage("$TXT_ARTISUMMON")
END_DEFAULTS
// Summoning Doll -----------------------------------------------------------
class ASummoningDoll : public AActor
{
DECLARE_ACTOR (ASummoningDoll, AActor)
};
FState ASummoningDoll::States[] =
{
#define S_SUMMON_FX1_1 0
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX1_1]),
#define S_SUMMON_FX2_1 (S_SUMMON_FX1_1+1)
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX2_1+1]),
S_NORMAL (SUMN, 'A', 4, NULL , &States[S_SUMMON_FX2_1+2]),
S_NORMAL (SUMN, 'A', 4, A_Summon , NULL),
};
IMPLEMENT_ACTOR (ASummoningDoll, Hexen, -1, 0)
PROP_SpeedFixed (20)
PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_SpawnState (S_SUMMON_FX1_1)
PROP_DeathState (S_SUMMON_FX2_1)
END_DEFAULTS
// Minotaur Smoke -----------------------------------------------------------
class AMinotaurSmoke : public AActor
{
DECLARE_ACTOR (AMinotaurSmoke, AActor)
};
FState AMinotaurSmoke::States[] =
{
S_NORMAL (MNSM, 'A', 3, NULL , &States[1]),
S_NORMAL (MNSM, 'B', 3, NULL , &States[2]),
S_NORMAL (MNSM, 'C', 3, NULL , &States[3]),
S_NORMAL (MNSM, 'D', 3, NULL , &States[4]),
S_NORMAL (MNSM, 'E', 3, NULL , &States[5]),
S_NORMAL (MNSM, 'F', 3, NULL , &States[6]),
S_NORMAL (MNSM, 'G', 3, NULL , &States[7]),
S_NORMAL (MNSM, 'H', 3, NULL , &States[8]),
S_NORMAL (MNSM, 'I', 3, NULL , &States[9]),
S_NORMAL (MNSM, 'J', 3, NULL , &States[10]),
S_NORMAL (MNSM, 'K', 3, NULL , &States[11]),
S_NORMAL (MNSM, 'L', 3, NULL , &States[12]),
S_NORMAL (MNSM, 'M', 3, NULL , &States[13]),
S_NORMAL (MNSM, 'N', 3, NULL , &States[14]),
S_NORMAL (MNSM, 'O', 3, NULL , &States[15]),
S_NORMAL (MNSM, 'P', 3, NULL , &States[16]),
S_NORMAL (MNSM, 'Q', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AMinotaurSmoke, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
//============================================================================
//
@ -110,7 +46,7 @@ END_DEFAULTS
bool AArtiDarkServant::Use (bool pickup)
{
AActor *mo = P_SpawnPlayerMissile (Owner, RUNTIME_CLASS(ASummoningDoll));
AActor *mo = P_SpawnPlayerMissile (Owner, PClass::FindClass ("SummoningDoll"));
if (mo)
{
mo->target = Owner;
@ -158,7 +94,7 @@ void A_Summon (AActor *actor)
}
// Make smoke puff
Spawn<AMinotaurSmoke> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
Spawn ("MinotaurSmoke", actor->x, actor->y, actor->z, ALLOW_REPLACE);
S_Sound (actor, CHAN_VOICE, mo->ActiveSound, 1, ATTN_NORM);
}
}

View file

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

View file

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

View file

@ -2,82 +2,59 @@
#include "info.h"
#include "gi.h"
#include "m_random.h"
#include "thingdef/thingdef.h"
static FRandom pr_orbit ("Orbit");
void A_BridgeOrbit (AActor *);
void A_BridgeInit (AActor *);
// The Hexen (and Heretic) version of the bridge spawns extra floating
// "balls" orbiting the bridge. The Doom version only shows the bridge
// itself.
// Custom bridge --------------------------------------------------------
/*
args[0]: Bridge radius, in mapunits
args[1]: Bridge height, in mapunits
args[2]: Amount of bridge balls (if 0: Doom bridge)
args[3]: Rotation speed of bridge balls, in byte angle per seconds, sorta:
Since an arg is only a byte, it can only go from 0 to 255, while ZDoom's
BAM go from 0 to 65535. Plus, it needs to be able to go either way. So,
up to 128, it goes counterclockwise; 129-255 is clockwise, substracting
256 from it to get the angle. A few example values:
0: Hexen default
11: 15° / seconds
21: 30° / seconds
32: 45° / seconds
64: 90° / seconds
128: 180° / seconds
192: -90° / seconds
223: -45° / seconds
233: -30° / seconds
244: -15° / seconds
This value only matters if args[2] is not zero.
args[4]: Rotation radius of bridge balls, in bridge radius %.
If 0, use Hexen default: ORBIT_RADIUS, regardless of bridge radius.
This value only matters if args[2] is not zero.
*/
// Bridge ball -------------------------------------------------------------
class ABridgeBall : public AActor
class ACustomBridge : public AActor
{
DECLARE_ACTOR (ABridgeBall, AActor)
DECLARE_CLASS (ACustomBridge, AActor)
public:
void BeginPlay ();
};
FState ABridgeBall::States[] =
IMPLEMENT_CLASS(ACustomBridge)
void ACustomBridge::BeginPlay ()
{
S_NORMAL (TLGL, 'A', 2, NULL , &States[1]),
S_NORMAL (TLGL, 'A', 1, A_BridgeOrbit , &States[1])
};
IMPLEMENT_ACTOR (ABridgeBall, Any, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_SpawnState (0)
END_DEFAULTS
// The bridge itself -------------------------------------------------------
class ABridge : public AActor
{
DECLARE_ACTOR (ABridge, AActor)
};
FState ABridge::States[] =
{
#define S_DBRIDGE 0
S_BRIGHT (TLGL, 'A', 4, NULL , &States[S_DBRIDGE+1]),
S_BRIGHT (TLGL, 'B', 4, NULL , &States[S_DBRIDGE+2]),
S_BRIGHT (TLGL, 'C', 4, NULL , &States[S_DBRIDGE+3]),
S_BRIGHT (TLGL, 'D', 4, NULL , &States[S_DBRIDGE+4]),
S_BRIGHT (TLGL, 'E', 4, NULL , &States[S_DBRIDGE+0]),
#define S_BRIDGE (S_DBRIDGE+5)
S_NORMAL (TLGL, 'A', 2, NULL , &States[S_BRIDGE+1]),
S_NORMAL (TLGL, 'A', 2, A_BridgeInit , &States[S_BRIDGE+2]),
S_NORMAL (TLGL, 'A', -1, NULL , NULL),
#define S_FREE_BRIDGE (S_BRIDGE+3)
S_NORMAL (TLGL, 'A', 2, NULL , &States[S_FREE_BRIDGE+1]),
S_NORMAL (TLGL, 'A', 300, NULL , NULL)
};
IMPLEMENT_ACTOR (ABridge, Any, 118, 21)
PROP_Flags (MF_SOLID|MF_NOGRAVITY|MF_NOLIFTDROP)
END_DEFAULTS
AT_GAME_SET (Bridge)
{
ABridge *def = GetDefault<ABridge> ();
if (gameinfo.gametype == GAME_Doom)
if (args[2]) // Hexen bridge if there are balls
{
def->SpawnState = &ABridge::States[S_DBRIDGE];
def->radius = 36 * FRACUNIT;
def->height = 4 * FRACUNIT;
def->RenderStyle = STYLE_Normal;
SetState(SeeState);
radius = args[0] ? args[0] << FRACBITS : 32 * FRACUNIT;
height = args[1] ? args[1] << FRACBITS : 2 * FRACUNIT;
}
else
else // No balls? Then a Doom bridge.
{
def->SpawnState = &ABridge::States[S_BRIDGE];
def->radius = 32 * FRACUNIT;
def->height = 2 * FRACUNIT;
def->RenderStyle = STYLE_None;
radius = args[0] ? args[0] << FRACBITS : 36 * FRACUNIT;
height = args[1] ? args[1] << FRACBITS : 4 * FRACUNIT;
RenderStyle = STYLE_Normal;
}
}
@ -100,21 +77,47 @@ void A_BridgeOrbit (AActor *self)
// independantly of a Bridge actor.
return;
}
// Set default values
// Every five tics, Hexen moved the ball 3/256th of a revolution.
int rotationspeed = ANGLE_45/32*3/5;
int rotationradius = ORBIT_RADIUS;
// If the bridge is custom, set non-default values if any.
// Set angular speed; 1--128: counterclockwise rotation ~=1--180°; 129--255: clockwise rotation ~= 180--1°
if (self->target->args[3] > 128) rotationspeed = ANGLE_45/32 * (self->target->args[3]-256) / TICRATE;
else if (self->target->args[3] > 0) rotationspeed = ANGLE_45/32 * (self->target->args[3]) / TICRATE;
// Set rotation radius
if (self->target->args[4]) rotationradius = ((self->target->args[4] * self->target->radius) / (100 * FRACUNIT));
if (self->target->special1)
{
self->SetState (NULL);
}
// Every five tics, Hexen moved the ball 3/256th of a revolution.
self->angle += ANGLE_45/32*3/5;
self->x = self->target->x + ORBIT_RADIUS * finecosine[self->angle >> ANGLETOFINESHIFT];
self->y = self->target->y + ORBIT_RADIUS * finesine[self->angle >> ANGLETOFINESHIFT];
self->angle += rotationspeed;
self->x = self->target->x + rotationradius * finecosine[self->angle >> ANGLETOFINESHIFT];
self->y = self->target->y + rotationradius * finesine[self->angle >> ANGLETOFINESHIFT];
self->z = self->target->z;
}
static const PClass *GetBallType()
{
const PClass *balltype = NULL;
int index=CheckIndex(1, NULL);
if (index>=0)
{
balltype = PClass::FindClass((ENamedName)StateParameters[index]);
}
if (balltype == NULL) balltype = PClass::FindClass("BridgeBall");
return balltype;
}
void A_BridgeInit (AActor *self)
{
angle_t startangle;
AActor *ball1, *ball2, *ball3;
AActor *ball;
fixed_t cx, cy, cz;
cx = self->x;
@ -123,56 +126,37 @@ void A_BridgeInit (AActor *self)
startangle = pr_orbit() << 24;
self->special1 = 0;
// Spawn triad into world
ball1 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball1->angle = startangle;
ball1->target = self;
ball2 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball2->angle = startangle + ANGLE_45/32*85;
ball2->target = self;
ball3 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball3->angle = startangle + (angle_t)ANGLE_45/32*170;
ball3->target = self;
A_BridgeOrbit (ball1);
A_BridgeOrbit (ball2);
A_BridgeOrbit (ball3);
// Spawn triad into world -- may be more than a triad now.
int ballcount = self->args[2]==0 ? 3 : self->args[2];
const PClass *balltype = GetBallType();
for (int i = 0; i < ballcount; i++)
{
ball = Spawn(balltype, cx, cy, cz, ALLOW_REPLACE);
ball->angle = startangle + (ANGLE_45/32) * (256/ballcount) * i;
ball->target = self;
A_BridgeOrbit(ball);
}
}
/* never used
void A_BridgeRemove (AActor *self)
{
self->special1 = true; // Removing the bridge
self->flags &= ~MF_SOLID;
self->SetState (&ABridge::States[S_FREE_BRIDGE]);
}
*/
// Invisible bridge --------------------------------------------------------
class AInvisibleBridge : public ABridge
class AInvisibleBridge : public AActor
{
DECLARE_ACTOR (AInvisibleBridge, ABridge)
DECLARE_CLASS (AInvisibleBridge, AActor)
public:
void BeginPlay ();
void Tick ()
{
Super::Tick ();
}
};
FState AInvisibleBridge::States[] =
{
S_NORMAL (TNT1, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AInvisibleBridge, Any, 9990, 0)
PROP_RenderStyle (STYLE_None)
PROP_SpawnState (0)
PROP_RadiusFixed (32)
PROP_HeightFixed (4)
PROP_Flags4 (MF4_ACTLIKEBRIDGE)
END_DEFAULTS
IMPLEMENT_CLASS(AInvisibleBridge)
void AInvisibleBridge::BeginPlay ()
{
@ -183,36 +167,3 @@ void AInvisibleBridge::BeginPlay ()
height = args[1] << FRACBITS;
}
// And some invisible bridges from Skull Tag -------------------------------
class AInvisibleBridge32 : public AInvisibleBridge
{
DECLARE_STATELESS_ACTOR (AInvisibleBridge32, AInvisibleBridge)
};
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge32, Any, 5061, 0)
PROP_RadiusFixed (32)
PROP_HeightFixed (8)
END_DEFAULTS
class AInvisibleBridge16 : public AInvisibleBridge
{
DECLARE_STATELESS_ACTOR (AInvisibleBridge16, AInvisibleBridge)
};
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge16, Any, 5064, 0)
PROP_RadiusFixed (16)
PROP_HeightFixed (8)
END_DEFAULTS
class AInvisibleBridge8 : public AInvisibleBridge
{
DECLARE_STATELESS_ACTOR (AInvisibleBridge8, AInvisibleBridge)
};
IMPLEMENT_STATELESS_ACTOR (AInvisibleBridge8, Any, 5065, 0)
PROP_RadiusFixed (8)
PROP_HeightFixed (8)
END_DEFAULTS

View file

@ -14,6 +14,7 @@
#include "templates.h"
#include "a_strifeglobal.h"
#include "a_morph.h"
#include "a_specialspot.h"
static FRandom pr_restore ("RestorePos");
@ -489,7 +490,7 @@ void AInventory::Tick ()
void AInventory::Serialize (FArchive &arc)
{
Super::Serialize (arc);
arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound;
arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound << SpawnPointClass;
}
//===========================================================================
@ -1168,6 +1169,18 @@ END_DEFAULTS
bool AInventory::DoRespawn ()
{
if (SpawnPointClass != NULL)
{
AActor *spot = NULL;
DSpotState *state = DSpotState::GetSpotState();
if (state != NULL) spot = state->GetRandomSpot(SpawnPointClass);
if (spot != NULL)
{
SetOrigin (spot->x, spot->y, spot->z);
z = floorz;
}
}
return true;
}

View file

@ -117,7 +117,6 @@ public:
virtual bool ShouldRespawn ();
virtual bool ShouldStay ();
virtual void Hide ();
virtual bool DoRespawn ();
virtual bool TryPickup (AActor *toucher);
virtual void DoPickupSpecial (AActor *toucher);
virtual bool SpecialDropAction (AActor *dropper);
@ -127,6 +126,7 @@ public:
virtual const char *PickupMessage ();
virtual void PlayPickupSound (AActor *toucher);
bool DoRespawn ();
AInventory *PrevItem(); // Returns the item preceding this one in the list.
AInventory *PrevInv(); // Returns the previous item with IF_INVBAR set.
AInventory *NextInv(); // Returns the next item with IF_INVBAR set.
@ -137,6 +137,7 @@ public:
int RespawnTics; // Tics from pickup time to respawn time
FTextureID Icon; // Icon to show on status bar or HUD
int DropTime; // Countdown after dropping
const PClass *SpawnPointClass; // For respawning like Heretic's mace
DWORD ItemFlags;
const PClass *PickupFlash; // actor to spawn as pickup flash

View file

@ -37,12 +37,14 @@
#include "p_local.h"
#include "statnums.h"
#include "i_system.h"
#include "thingdef/thingdef.h"
static FRandom pr_spot ("SpecialSpot");
static FRandom pr_spawnmace ("SpawnMace");
IMPLEMENT_CLASS(DSpotState)
IMPLEMENT_ABSTRACT_ACTOR (ASpecialSpot)
IMPLEMENT_CLASS (ASpecialSpot)
TObjPtr<DSpotState> DSpotState::SpotState;
//----------------------------------------------------------------------------
@ -146,6 +148,7 @@ struct FSpotList
ASpecialSpot *GetSpotWithMinDistance(fixed_t x, fixed_t y, fixed_t distance)
{
if (Spots.Size() == 0) return NULL;
int i = pr_spot() % Spots.Size();
int initial = i;
@ -166,7 +169,7 @@ struct FSpotList
ASpecialSpot *GetRandomSpot(bool onlyfirst)
{
if (!numcalls)
if (Spots.Size() && !numcalls)
{
int i = pr_spot() % Spots.Size();
numcalls++;
@ -370,3 +373,65 @@ void ASpecialSpot::Destroy()
if (state != NULL) state->RemoveSpot(this);
Super::Destroy();
}
// Mace spawn spot ----------------------------------------------------------
// Every mace spawn spot will execute this action. The first one
// will build a list of all mace spots in the level and spawn a
// mace. The rest of the spots will do nothing.
void A_SpawnSingleItem (AActor *self)
{
AActor *spot = NULL;
DSpotState *state = DSpotState::GetSpotState();
if (state != NULL) spot = state->GetRandomSpot(RUNTIME_TYPE(self), true);
if (spot == NULL) return;
int index=CheckIndex(4);
if (index<0) return;
ENamedName SpawnType = (ENamedName)StateParameters[index];
int fail_sp = EvalExpressionI (StateParameters[index+1], self);
int fail_co = EvalExpressionI (StateParameters[index+2], self);
int fail_dm = EvalExpressionI (StateParameters[index+3], self);
if (!multiplayer && pr_spawnmace() < fail_sp)
{ // Sometimes doesn't show up if not in deathmatch
return;
}
if (multiplayer && !deathmatch && pr_spawnmace() < fail_co)
{
return;
}
if (deathmatch && pr_spawnmace() < fail_dm)
{
return;
}
const PClass *cls = PClass::FindClass(SpawnType);
if (cls == NULL)
{
return;
}
AActor *spawned = Spawn(cls, self->x, self->y, self->z, ALLOW_REPLACE);
if (spawned)
{
spawned->SetOrigin (spot->x, spot->y, spot->z);
spawned->z = spawned->floorz;
// We want this to respawn.
if (!(self->flags & MF_DROPPED))
{
spawned->flags &= ~MF_DROPPED;
}
if (spawned->IsKindOf(RUNTIME_CLASS(AInventory)))
{
static_cast<AInventory*>(spawned)->SpawnPointClass = RUNTIME_TYPE(self);
}
}
}

View file

@ -6,7 +6,7 @@
class ASpecialSpot : public AActor
{
DECLARE_STATELESS_ACTOR (ASpecialSpot, AActor)
DECLARE_CLASS (ASpecialSpot, AActor)
public:

View file

@ -42,7 +42,7 @@ struct RenderContext
void (APIENTRY * SetTextureMode) (int type);
void (APIENTRY * ArrayPointer) (void * data, int stride);
void (APIENTRY * PrintStartupLog) ();
bool (APIENTRY * SetVSync) (int on);
BOOL (APIENTRY * SetVSync) (int on);
#ifndef unix
bool (APIENTRY * InitHardware) (HWND, bool allowsoftware, bool nostencil, int multisample);
void (APIENTRY * Shutdown) ();

View file

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

View file

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

View file

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

View file

@ -78,7 +78,7 @@
struct MusPlayingInfo
{
FString name;
void *handle;
MusInfo *handle;
int baseorder;
bool loop;
};
@ -1838,8 +1838,10 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
{
if (order != mus_playing.baseorder)
{
mus_playing.baseorder =
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
if (mus_playing.handle->SetSubsong(order))
{
mus_playing.baseorder = order;
}
}
return true;
}
@ -1862,7 +1864,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
int lumpnum = -1;
int offset = 0, length = 0;
int device = MDEV_DEFAULT;
void *handle = NULL;
MusInfo *handle = NULL;
int *devp = MidiDevices.CheckKey(FName(musicname));
if (devp != NULL) device = *devp;
@ -1932,7 +1934,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
{
mus_playing.loop = looping;
mus_playing.name = "";
mus_playing.baseorder = 0;
mus_playing.baseorder = order;
LastSong = musicname;
return true;
}
@ -1956,13 +1958,13 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
mus_playing.loop = looping;
mus_playing.name = musicname;
mus_playing.baseorder = 0;
LastSong = "";
if (mus_playing.handle != 0)
{ // play it
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname));
mus_playing.baseorder =
(I_SetSongPosition (mus_playing.handle, order) ? order : 0);
I_PlaySong (mus_playing.handle, looping, S_GetMusicVolume (musicname), order);
mus_playing.baseorder = order;
return true;
}
return false;

View file

@ -454,21 +454,16 @@ public:
Volume = volume;
}
// Sets the current order number for a MOD-type song, or the position in ms
// for anything else.
bool SetPosition(int pos)
// Sets the position in ms.
bool SetPosition(unsigned int ms_pos)
{
FMOD_SOUND_TYPE type;
return FMOD_OK == Channel->setPosition(ms_pos, FMOD_TIMEUNIT_MS);
}
if (FMOD_OK == Stream->getFormat(&type, NULL, NULL, NULL) &&
(type == FMOD_SOUND_TYPE_IT ||
type == FMOD_SOUND_TYPE_MOD ||
type == FMOD_SOUND_TYPE_S3M ||
type == FMOD_SOUND_TYPE_XM))
{
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MODORDER);
}
return FMOD_OK == Channel->setPosition(pos, FMOD_TIMEUNIT_MS);
// Sets the order number for MOD formats.
bool SetOrder(int order_pos)
{
return FMOD_OK == Channel->setPosition(order_pos, FMOD_TIMEUNIT_MODORDER);
}
FString GetStats()

View file

@ -121,7 +121,12 @@ MusInfo::~MusInfo ()
{
}
bool MusInfo::SetPosition (int order)
bool MusInfo::SetPosition (unsigned int ms)
{
return false;
}
bool MusInfo::SetSubsong (int subsong)
{
return false;
}
@ -197,7 +202,7 @@ void I_ShutdownMusic(void)
}
void I_PlaySong (void *handle, int _looping, float rel_vol)
void I_PlaySong (void *handle, int _looping, float rel_vol, int subsong)
{
MusInfo *info = (MusInfo *)handle;
@ -206,7 +211,7 @@ void I_PlaySong (void *handle, int _looping, float rel_vol)
saved_relative_volume = relative_volume = rel_vol;
info->Stop ();
info->Play (_looping ? true : false);
info->Play (!!_looping, subsong);
info->m_NotStartedYet = false;
if (info->m_Status == MusInfo::STATE_Playing)
@ -256,7 +261,7 @@ void I_UnRegisterSong (void *handle)
}
}
void *I_RegisterURLSong (const char *url)
MusInfo *I_RegisterURLSong (const char *url)
{
StreamSong *song;
@ -269,7 +274,7 @@ void *I_RegisterURLSong (const char *url)
return NULL;
}
void *I_RegisterSong (const char *filename, char *musiccache, int offset, int len, int device)
MusInfo *I_RegisterSong (const char *filename, char *musiccache, int offset, int len, int device)
{
FILE *file;
MusInfo *info = NULL;
@ -539,7 +544,7 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
return info;
}
void *I_RegisterCDSong (int track, int id)
MusInfo *I_RegisterCDSong (int track, int id)
{
MusInfo *info = new CDSong (track, id);
@ -635,7 +640,7 @@ CCMD (writeopl)
}
else
{
dumper->Play(false);
dumper->Play(false, 0); // FIXME: Remember subsong.
delete dumper;
}
}
@ -673,7 +678,7 @@ CCMD (writewave)
}
else
{
dumper->Play(false);
dumper->Play(false, 0); // FIXME: Remember subsong
delete dumper;
}
}

View file

@ -54,14 +54,15 @@ void I_PauseSong (void *handle);
void I_ResumeSong (void *handle);
// Registers a song handle to song data.
void *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
void *I_RegisterCDSong (int track, int cdid = 0);
void *I_RegisterURLSong (const char *url);
class MusInfo;
MusInfo *I_RegisterSong (const char *file, char * musiccache, int offset, int length, int device);
MusInfo *I_RegisterCDSong (int track, int cdid = 0);
MusInfo *I_RegisterURLSong (const char *url);
// Called by anything that wishes to start music.
// Plays a song, and when the song is done,
// starts playing it again in an endless loop.
void I_PlaySong (void *handle, int looping, float relative_vol=1.f);
void I_PlaySong (void *handle, int looping, float relative_vol=1.f, int subsong=0);
// Stops a song.
void I_StopSong (void *handle);
@ -75,4 +76,38 @@ bool I_SetSongPosition (void *handle, int order);
// Is the song still playing?
bool I_QrySongPlaying (void *handle);
// The base music class. Everything is derived from this --------------------
class MusInfo
{
public:
MusInfo ();
virtual ~MusInfo ();
virtual void MusicVolumeChanged(); // snd_musicvolume changed
virtual void TimidityVolumeChanged(); // timidity_mastervolume changed
virtual void Play (bool looping, int subsong) = 0;
virtual void Pause () = 0;
virtual void Resume () = 0;
virtual void Stop () = 0;
virtual bool IsPlaying () = 0;
virtual bool IsMIDI () const = 0;
virtual bool IsValid () const = 0;
virtual bool SetPosition (unsigned int ms);
virtual bool SetSubsong (int subsong);
virtual void Update();
virtual FString GetStats();
virtual MusInfo *GetOPLDumper(const char *filename);
virtual MusInfo *GetWaveDumper(const char *filename, int rate);
enum EState
{
STATE_Stopped,
STATE_Playing,
STATE_Paused
} m_Status;
bool m_Looping;
bool m_NotStartedYet; // Song has been created but not yet played
};
#endif //__I_MUSIC_H__

View file

@ -20,6 +20,7 @@
#include "c_cvars.h"
#include "mus2midi.h"
#include "i_sound.h"
#include "i_music.h"
void I_InitMusicWin32 ();
void I_ShutdownMusicWin32 ();
@ -29,38 +30,6 @@ extern float relative_volume;
EXTERN_CVAR (Float, timidity_mastervolume)
// The base music class. Everything is derived from this --------------------
class MusInfo
{
public:
MusInfo ();
virtual ~MusInfo ();
virtual void MusicVolumeChanged(); // snd_musicvolume changed
virtual void TimidityVolumeChanged(); // timidity_mastervolume changed
virtual void Play (bool looping) = 0;
virtual void Pause () = 0;
virtual void Resume () = 0;
virtual void Stop () = 0;
virtual bool IsPlaying () = 0;
virtual bool IsMIDI () const = 0;
virtual bool IsValid () const = 0;
virtual bool SetPosition (int order);
virtual void Update();
virtual FString GetStats();
virtual MusInfo *GetOPLDumper(const char *filename);
virtual MusInfo *GetWaveDumper(const char *filename, int rate);
enum EState
{
STATE_Stopped,
STATE_Playing,
STATE_Paused
} m_Status;
bool m_Looping;
bool m_NotStartedYet; // Song has been created but not yet played
};
// A device that provides a WinMM-like MIDI streaming interface -------------
#ifndef _WIN32
@ -302,7 +271,7 @@ public:
void MusicVolumeChanged();
void TimidityVolumeChanged();
void Play(bool looping);
void Play(bool looping, int subsong);
void Pause();
void Resume();
void Stop();
@ -441,14 +410,15 @@ class StreamSong : public MusInfo
public:
StreamSong (const char *file, int offset, int length);
~StreamSong ();
void Play (bool looping);
void Play (bool looping, int subsong);
void Pause ();
void Resume ();
void Stop ();
bool IsPlaying ();
bool IsMIDI () const { return false; }
bool IsValid () const { return m_Stream != NULL; }
bool SetPosition (int order);
bool SetPosition (unsigned int pos);
bool SetSubsong (int subsong);
FString GetStats();
protected:
@ -464,7 +434,7 @@ class TimiditySong : public StreamSong
public:
TimiditySong (FILE *file, char * musiccache, int length);
~TimiditySong ();
void Play (bool looping);
void Play (bool looping, int subsong);
void Stop ();
bool IsPlaying ();
bool IsValid () const { return CommandLine.Len() > 0; }
@ -502,7 +472,7 @@ class OPLMUSSong : public StreamSong
public:
OPLMUSSong (FILE *file, char *musiccache, int length);
~OPLMUSSong ();
void Play (bool looping);
void Play (bool looping, int subsong);
bool IsPlaying ();
bool IsValid () const;
void ResetChips ();
@ -530,7 +500,7 @@ class CDSong : public MusInfo
public:
CDSong (int track, int id);
~CDSong ();
void Play (bool looping);
void Play (bool looping, int subsong);
void Pause ();
void Resume ();
void Stop ();

View file

@ -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;
}

View file

@ -65,7 +65,8 @@ public:
virtual bool SetPaused(bool paused) = 0;
virtual unsigned int GetPosition() = 0;
virtual bool IsEnded() = 0;
virtual bool SetPosition(int pos);
virtual bool SetPosition(unsigned int pos);
virtual bool SetOrder(int order);
virtual FString GetStats();
};

View file

@ -1,7 +1,7 @@
#include "i_musicinterns.h"
#include "i_cd.h"
void CDSong::Play (bool looping)
void CDSong::Play (bool looping, int subsong)
{
m_Status = STATE_Stopped;
m_Looping = looping;

View file

@ -45,8 +45,9 @@ class input_mod : public StreamSong
public:
input_mod(DUH *myduh);
~input_mod();
bool SetPosition(int order);
void Play(bool looping);
//bool SetPosition(int ms);
bool SetSubsong(int subsong);
void Play(bool looping, int subsong);
FString GetStats();
FString Codec;
@ -1153,11 +1154,12 @@ input_mod::~input_mod()
//
//==========================================================================
void input_mod::Play(bool looping)
void input_mod::Play(bool looping, int order)
{
m_Status = STATE_Stopped;
m_Looping = looping;
start_order = order;
if (open2(0) && m_Stream->Play(m_Looping, 1))
{
m_Status = STATE_Playing;
@ -1166,15 +1168,11 @@ void input_mod::Play(bool looping)
//==========================================================================
//
// input_mod :: SetPosition
//
// FIXME: Pass the order number as a subsong parameter to Play, so we don't
// need to start playback at one position and then immediately throw that
// playback structure away and create a new one to go to the new order.
// input_mod :: SetSubsong
//
//==========================================================================
bool input_mod::SetPosition(int order)
bool input_mod::SetSubsong(int order)
{
if (order == start_order)
{

View file

@ -85,7 +85,7 @@ CUSTOM_CVAR (Int, timidity_frequency, 22050, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
self = 65000;
}
void TimiditySong::Play (bool looping)
void TimiditySong::Play (bool looping, int subsong)
{
m_Status = STATE_Stopped;
m_Looping = looping;

View file

@ -182,7 +182,7 @@ void MIDIStreamer::CheckCaps()
//
//==========================================================================
void MIDIStreamer::Play(bool looping)
void MIDIStreamer::Play(bool looping, int subsong)
{
DWORD tid;

View file

@ -52,7 +52,7 @@ bool OPLMUSSong::IsPlaying ()
return m_Status == STATE_Playing;
}
void OPLMUSSong::Play (bool looping)
void OPLMUSSong::Play (bool looping, int subsong)
{
m_Status = STATE_Stopped;
m_Looping = looping;

View file

@ -1,12 +1,16 @@
#include "i_musicinterns.h"
void StreamSong::Play (bool looping)
void StreamSong::Play (bool looping, int subsong)
{
m_Status = STATE_Stopped;
m_Looping = looping;
if (m_Stream->Play (m_Looping, 1))
{
if (subsong != 0)
{
m_Stream->SetOrder (subsong);
}
m_Status = STATE_Playing;
}
}
@ -70,14 +74,25 @@ bool StreamSong::IsPlaying ()
//
// StreamSong :: SetPosition
//
// Sets the current order number for a MOD-type song, or the position in ms
// for anything else.
// Sets the position in ms.
bool StreamSong::SetPosition(int order)
bool StreamSong::SetPosition(unsigned int pos)
{
if (m_Stream != NULL)
{
return m_Stream->SetPosition(order);
return m_Stream->SetPosition(pos);
}
else
{
return false;
}
}
bool StreamSong::SetSubsong(int subsong)
{
if (m_Stream != NULL)
{
return m_Stream->SetOrder(subsong);
}
else
{

View file

@ -3,5 +3,5 @@
// This file was automatically generated by the
// updaterevision tool. Do not edit by hand.
#define ZD_SVN_REVISION_STRING "1102"
#define ZD_SVN_REVISION_NUMBER 1102
#define ZD_SVN_REVISION_STRING "1109"
#define ZD_SVN_REVISION_NUMBER 1109

View file

@ -77,7 +77,7 @@
// SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 1076
#define MINSAVEVER 1107
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER
// Never write a savegame with a version lower than what we need

View file

@ -139,8 +139,17 @@ public:
operator const char *() const { return Chars; }
const char *GetChars() const { return Chars; }
const char &operator[] (int index) const { return Chars[index]; }
#if defined(_WIN32) && !defined(_WIN64) && defined(_MSC_VER)
// Compiling 32-bit Windows source with MSVC: size_t is typedefed to an
// unsigned int with the 64-bit portability warning attribute, so the
// prototype cannot substitute unsigned int for size_t, or you get
// spurious warnings.
const char &operator[] (size_t index) const { return Chars[index]; }
#else
const char &operator[] (unsigned int index) const { return Chars[index]; }
#endif
const char &operator[] (unsigned long index) const { return Chars[index]; }
const char &operator[] (unsigned long long index) const { return Chars[index]; }

View file

@ -60,7 +60,7 @@ ACTOR BeakPowered : Beak
ACTOR ChickenPlayer : PlayerPawn native
{
Health 30
Health 24
ReactionTime 0
PainChance 255
Radius 16
@ -112,6 +112,8 @@ ACTOR ChickenPlayer : PlayerPawn native
ACTOR Chicken : MorphedMonster
{
Game Heretic
SpawnID 122
Health 10
Radius 9
Height 22

View file

@ -188,6 +188,8 @@ ACTOR Sorcerer2
ACTOR Sorcerer2FX1
{
Game Heretic
SpawnID 145
Radius 10
Height 6
Speed 20

View file

@ -81,6 +81,7 @@ ACTOR HereticImpLeader : HereticImp 5
{
Game Heretic
SpawnID 7
Health 80
-MISSILEMORE
AttackSound "himp/leaderattack"
States

View file

@ -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
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View file

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

View file

@ -1,6 +1,6 @@
// Temp Small Flame --------------------------------------------------------
ACTOR AFlameSmallTemp 10500
ACTOR FlameSmallTemp 10500
{
Game Hexen
SpawnID 96
@ -21,7 +21,7 @@ ACTOR AFlameSmallTemp 10500
// Temp Large Flame ---------------------------------------------------------
ACTOR AFlameLargeTemp 10502
ACTOR FlameLargeTemp 10502
{
Game Hexen
SpawnID 98

View 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
}
}

View 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
}
}

View 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
}
}

View file

@ -179,6 +179,7 @@ class Actor extends Thinker
action native A_SelectWeapon(class<Weapon> whichweapon);
action native A_Punch();
action native A_Feathers();
action native A_ClassBossHealth();
}
class Inventory extends Actor

View file

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

View file

@ -65,11 +65,11 @@ ACTOR ArtiFly : PowerupGiver 83
}
}
// Invulnerability ----------------------------------------------------------
// Invulnerability Heretic ---------------------------------------------------
ACTOR ArtiInvulnerability : PowerupGiver 84
{
Game Raven
Game Heretic
SpawnID 133
+COUNTITEM
+FLOATBOB
@ -77,7 +77,28 @@ ACTOR ArtiInvulnerability : PowerupGiver 84
Inventory.RespawnTics 4230
Inventory.Icon ARTIINVU
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY"
Inventory.PickupMessage Hexen, "$TXT_ARTIINVULNERABILITY2"
Powerup.Type Invulnerable
Powerup.Color GoldMap
States
{
Spawn:
INVU ABCD 3
Loop
}
}
// Invulnerability Hexen ----------------------------------------------------------
ACTOR ArtiInvulnerability2 : PowerupGiver 84
{
Game Hexen
SpawnID 133
+COUNTITEM
+FLOATBOB
+INVENTORY.PICKUPFLASH
Inventory.RespawnTics 4230
Inventory.Icon ARTIINVU
Inventory.PickupMessage "$TXT_ARTIINVULNERABILITY2"
Powerup.Type Invulnerable
States
{

View 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
}

View 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);
}

View file

@ -9,6 +9,8 @@
#include "actors/shared/pickups.txt"
#include "actors/shared/fountain.txt"
#include "actors/shared/soundsequence.txt"
#include "actors/shared/bridge.txt"
#include "actors/shared/specialspot.txt"
#include "actors/doom/doomplayer.txt"
#include "actors/doom/possessed.txt"
@ -42,6 +44,7 @@
#include "actors/raven/ravenartifacts.txt"
#include "actors/raven/ravenhealth.txt"
#include "actors/raven/ravenambient.txt"
#include "actors/raven/minotaur.txt"
#include "actors/heretic/hereticplayer.txt"
#include "actors/heretic/hereticammo.txt"
@ -80,6 +83,16 @@
#include "actors/hexen/clericmace.txt"
#include "actors/hexen/firedemon.txt"
#include "actors/hexen/fog.txt"
#include "actors/hexen/summon.txt"
#include "actors/hexen/flechette.txt"
#include "actors/hexen/clericboss.txt"
#include "actors/hexen/fighterboss.txt"
#include "actors/hexen/mageboss.txt"
#include "actors/hexen/bats.txt"
#include "actors/hexen/bishop.txt"
#include "actors/hexen/blastradius.txt"
#include "actors/hexen/boostarmor.txt"
#include "actors/hexen/clericflame.txt"
#include "actors/strife/strifeplayer.txt"
#include "actors/strife/beggars.txt"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 B

After

Width:  |  Height:  |  Size: 576 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 974 B

After

Width:  |  Height:  |  Size: 183 B

Before After
Before After