mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-13 07:57:51 +00:00
- fixed: Morphing to a class without a face definition crashed.
- Converted all of Heretic's actors except the weapons to DECORATE. - Added the option to define the ActorInfos for native classes in DECORATE. SVN r1078 (trunk)
This commit is contained in:
parent
b030682834
commit
a8c283dacd
29 changed files with 1633 additions and 2062 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
July 21, 2008 (Changes by Graf Zahl)
|
||||||
|
- fixed: Morphing to a class without a face definition crashed.
|
||||||
|
- Converted all of Heretic's actors except the weapons to DECORATE.
|
||||||
|
- Added the option to define the ActorInfos for native classes in DECORATE.
|
||||||
|
|
||||||
July 20, 2008 (Changes by Graf Zahl)
|
July 20, 2008 (Changes by Graf Zahl)
|
||||||
- Fixed: When copying visplanes the sky texture was forgotten.
|
- Fixed: When copying visplanes the sky texture was forgotten.
|
||||||
- converted the boss brain to DECORATE.
|
- converted the boss brain to DECORATE.
|
||||||
|
|
|
@ -99,12 +99,6 @@ ACTOR(PlayerSkinCheck)
|
||||||
ACTOR(QueueCorpse)
|
ACTOR(QueueCorpse)
|
||||||
ACTOR(DeQueueCorpse)
|
ACTOR(DeQueueCorpse)
|
||||||
ACTOR(SetGravity)
|
ACTOR(SetGravity)
|
||||||
|
|
||||||
// Special code pointers for Strife's player - not to be used elsewhere!
|
|
||||||
ACTOR(ItBurnsItBurns)
|
|
||||||
ACTOR(CrispyPlayer)
|
|
||||||
ACTOR(DropFire)
|
|
||||||
|
|
||||||
ACTOR(ClearTarget)
|
ACTOR(ClearTarget)
|
||||||
ACTOR(LookEx)
|
ACTOR(LookEx)
|
||||||
ACTOR(JumpIfTargetInLOS)
|
ACTOR(JumpIfTargetInLOS)
|
||||||
|
@ -113,3 +107,47 @@ ACTOR(DamageChildren)
|
||||||
ACTOR(CheckForReload)
|
ACTOR(CheckForReload)
|
||||||
ACTOR(ResetReloadCounter)
|
ACTOR(ResetReloadCounter)
|
||||||
ACTOR(ClearReFire)
|
ACTOR(ClearReFire)
|
||||||
|
|
||||||
|
// Heretic stuff
|
||||||
|
ACTOR(Feathers)
|
||||||
|
ACTOR(BeakRaise)
|
||||||
|
ACTOR(BeakAttackPL1)
|
||||||
|
ACTOR(BeakAttackPL2)
|
||||||
|
ACTOR(Sor1Pain)
|
||||||
|
ACTOR(Sor1Chase)
|
||||||
|
ACTOR(Srcr1Attack)
|
||||||
|
ACTOR(SorcererRise)
|
||||||
|
ACTOR(Srcr2Decide)
|
||||||
|
ACTOR(Srcr2Attack)
|
||||||
|
ACTOR(Sor2DthInit)
|
||||||
|
ACTOR(Sor2DthLoop)
|
||||||
|
ACTOR(BlueSpark)
|
||||||
|
ACTOR(GenWizard)
|
||||||
|
ACTOR(TimeBomb)
|
||||||
|
ACTOR(ImpDeath)
|
||||||
|
ACTOR(ImpXDeath1)
|
||||||
|
ACTOR(ImpExplode)
|
||||||
|
ACTOR(PodPain)
|
||||||
|
ACTOR(RemovePod)
|
||||||
|
ACTOR(MakePod)
|
||||||
|
ACTOR(AccTeleGlitter)
|
||||||
|
ACTOR(VolcanoSet)
|
||||||
|
ACTOR(VolcanoBlast)
|
||||||
|
ACTOR(VolcBallImpact)
|
||||||
|
ACTOR(LichAttack)
|
||||||
|
ACTOR(LichIceImpact)
|
||||||
|
ACTOR(LichFireGrow)
|
||||||
|
ACTOR(WhirlwindSeek)
|
||||||
|
ACTOR(KnightAttack)
|
||||||
|
ACTOR(DripBlood)
|
||||||
|
ACTOR(GhostOff)
|
||||||
|
ACTOR(WizAtk1)
|
||||||
|
ACTOR(WizAtk2)
|
||||||
|
ACTOR(WizAtk3)
|
||||||
|
|
||||||
|
|
||||||
|
// Special code pointers for Strife's player - not to be used elsewhere!
|
||||||
|
ACTOR(ItBurnsItBurns)
|
||||||
|
ACTOR(CrispyPlayer)
|
||||||
|
ACTOR(DropFire)
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,14 @@ void PClass::StaticFreeData (PClass *type)
|
||||||
delete type->ActorInfo;
|
delete type->ActorInfo;
|
||||||
type->ActorInfo = NULL;
|
type->ActorInfo = NULL;
|
||||||
}
|
}
|
||||||
delete type;
|
if (type->bRuntimeClass != 2)
|
||||||
|
{
|
||||||
|
delete type;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type->Symbols.ReleaseSymbols();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -290,6 +297,42 @@ PClass *PClass::CreateDerivedClass (FName name, unsigned int size)
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is used by DECORATE to assign ActorInfos to internal classes
|
||||||
|
void PClass::InitializeActorInfo ()
|
||||||
|
{
|
||||||
|
Symbols.SetParentTable (&ParentClass->Symbols);
|
||||||
|
Defaults = new BYTE[Size];
|
||||||
|
if (ParentClass->Defaults != NULL)
|
||||||
|
{
|
||||||
|
memcpy (Defaults, ParentClass->Defaults, Size);
|
||||||
|
if (Size > ParentClass->Size)
|
||||||
|
{
|
||||||
|
memset (Defaults + ParentClass->Size, 0, Size - ParentClass->Size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset (Defaults, 0, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bRuntimeClass = 2; // Class is internal but actor data external
|
||||||
|
|
||||||
|
FActorInfo *info = ActorInfo = new FActorInfo;
|
||||||
|
info->Class = this;
|
||||||
|
info->GameFilter = GAME_Any;
|
||||||
|
info->SpawnID = 0;
|
||||||
|
info->DoomEdNum = -1;
|
||||||
|
info->OwnedStates = NULL;
|
||||||
|
info->NumOwnedStates = 0;
|
||||||
|
info->Replacement = NULL;
|
||||||
|
info->Replacee = NULL;
|
||||||
|
info->StateList = NULL;
|
||||||
|
info->DamageFactors = NULL;
|
||||||
|
info->PainChances = NULL;
|
||||||
|
m_RuntimeActors.Push (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create the FlatPointers array, if it doesn't exist already.
|
// Create the FlatPointers array, if it doesn't exist already.
|
||||||
// It comprises all the Pointers from superclasses plus this class's own Pointers.
|
// It comprises all the Pointers from superclasses plus this class's own Pointers.
|
||||||
// If this class does not define any new Pointers, then FlatPointers will be set
|
// If this class does not define any new Pointers, then FlatPointers will be set
|
||||||
|
|
|
@ -103,7 +103,7 @@ struct PClass
|
||||||
PClass *HashNext;
|
PClass *HashNext;
|
||||||
FMetaTable Meta;
|
FMetaTable Meta;
|
||||||
BYTE *Defaults;
|
BYTE *Defaults;
|
||||||
bool bRuntimeClass; // class was defined at run-time, not compile-time
|
BYTE bRuntimeClass; // class was defined at run-time, not compile-time
|
||||||
unsigned short ClassIndex;
|
unsigned short ClassIndex;
|
||||||
PSymbolTable Symbols;
|
PSymbolTable Symbols;
|
||||||
|
|
||||||
|
@ -113,6 +113,7 @@ struct PClass
|
||||||
void InsertIntoHash ();
|
void InsertIntoHash ();
|
||||||
DObject *CreateNew () const;
|
DObject *CreateNew () const;
|
||||||
PClass *CreateDerivedClass (FName name, unsigned int size);
|
PClass *CreateDerivedClass (FName name, unsigned int size);
|
||||||
|
void InitializeActorInfo ();
|
||||||
void BuildFlatPointers ();
|
void BuildFlatPointers ();
|
||||||
void FreeStateList();
|
void FreeStateList();
|
||||||
|
|
||||||
|
|
|
@ -12,166 +12,22 @@
|
||||||
#include "d_event.h"
|
#include "d_event.h"
|
||||||
#include "gstrings.h"
|
#include "gstrings.h"
|
||||||
|
|
||||||
|
void P_UpdateBeak (AActor *actor);
|
||||||
|
|
||||||
static FRandom pr_chickenplayerthink ("ChickenPlayerThink");
|
static FRandom pr_chickenplayerthink ("ChickenPlayerThink");
|
||||||
static FRandom pr_chicattack ("ChicAttack");
|
static FRandom pr_chicattack ("ChicAttack");
|
||||||
static FRandom pr_feathers ("Feathers");
|
static FRandom pr_feathers ("Feathers");
|
||||||
static FRandom pr_beakatkpl1 ("BeakAtkPL1");
|
static FRandom pr_beakatkpl1 ("BeakAtkPL1");
|
||||||
static FRandom pr_beakatkpl2 ("BeakAtkPL2");
|
static FRandom pr_beakatkpl2 ("BeakAtkPL2");
|
||||||
|
|
||||||
void A_BeakRaise (AActor *);
|
|
||||||
void A_BeakAttackPL1 (AActor *);
|
|
||||||
void A_BeakAttackPL2 (AActor *);
|
|
||||||
|
|
||||||
void A_Feathers (AActor *);
|
|
||||||
void A_ChicAttack (AActor *);
|
|
||||||
|
|
||||||
void P_UpdateBeak (AActor *);
|
|
||||||
|
|
||||||
// Beak puff ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class ABeakPuff : public AStaffPuff
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ABeakPuff, AStaffPuff)
|
|
||||||
public:
|
|
||||||
void BeginPlay ();
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ABeakPuff, Heretic, -1, 0)
|
|
||||||
PROP_Mass (5)
|
|
||||||
PROP_RenderStyle (STYLE_Translucent)
|
|
||||||
PROP_Alpha (HR_SHADOW)
|
|
||||||
PROP_AttackSound ("chicken/attack")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void ABeakPuff::BeginPlay ()
|
|
||||||
{
|
|
||||||
Super::BeginPlay ();
|
|
||||||
momz = FRACUNIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Beak ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
class ABeak : public AWeapon
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ABeak, AWeapon)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ABeakPowered : public ABeak
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ABeakPowered, ABeak)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ABeak::States[] =
|
|
||||||
{
|
|
||||||
#define S_BEAKREADY 0
|
|
||||||
S_NORMAL (BEAK, 'A', 1, A_WeaponReady , &States[S_BEAKREADY]),
|
|
||||||
|
|
||||||
#define S_BEAKDOWN (S_BEAKREADY+1)
|
|
||||||
S_NORMAL (BEAK, 'A', 1, A_Lower , &States[S_BEAKDOWN]),
|
|
||||||
|
|
||||||
#define S_BEAKUP (S_BEAKDOWN+1)
|
|
||||||
S_NORMAL (BEAK, 'A', 1, A_BeakRaise , &States[S_BEAKUP]),
|
|
||||||
|
|
||||||
#define S_BEAKATK1 (S_BEAKUP+1)
|
|
||||||
S_NORMAL (BEAK, 'A', 18, A_BeakAttackPL1 , &States[S_BEAKREADY]),
|
|
||||||
|
|
||||||
#define S_BEAKATK2 (S_BEAKATK1+1)
|
|
||||||
S_NORMAL (BEAK, 'A', 12, A_BeakAttackPL2 , &States[S_BEAKREADY])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ABeak, Heretic, -1, 0)
|
|
||||||
PROP_Weapon_SelectionOrder (10000)
|
|
||||||
PROP_Weapon_Flags (WIF_DONTBOB|WIF_BOT_MELEE)
|
|
||||||
PROP_Weapon_UpState (S_BEAKUP)
|
|
||||||
PROP_Weapon_DownState (S_BEAKDOWN)
|
|
||||||
PROP_Weapon_ReadyState (S_BEAKREADY)
|
|
||||||
PROP_Weapon_AtkState (S_BEAKATK1)
|
|
||||||
PROP_Weapon_HoldAtkState (S_BEAKATK1)
|
|
||||||
PROP_Weapon_YAdjust (15)
|
|
||||||
PROP_Weapon_SisterType ("BeakPowered")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ABeakPowered, Heretic, -1, 0)
|
|
||||||
PROP_Weapon_Flags (WIF_DONTBOB|WIF_BOT_MELEE|WIF_POWERED_UP)
|
|
||||||
PROP_Weapon_AtkState (S_BEAKATK2)
|
|
||||||
PROP_Weapon_HoldAtkState (S_BEAKATK2)
|
|
||||||
PROP_Weapon_SisterType ("Beak")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Chicken player -----------------------------------------------------------
|
|
||||||
|
|
||||||
class AChickenPlayer : public APlayerPawn
|
class AChickenPlayer : public APlayerPawn
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AChickenPlayer, APlayerPawn)
|
DECLARE_CLASS (AChickenPlayer, APlayerPawn)
|
||||||
public:
|
public:
|
||||||
void MorphPlayerThink ();
|
void MorphPlayerThink ();
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AChickenPlayer::States[] =
|
IMPLEMENT_CLASS(AChickenPlayer)
|
||||||
{
|
|
||||||
#define S_CHICPLAY 0
|
|
||||||
S_NORMAL (CHKN, 'A', -1, NULL , NULL),
|
|
||||||
|
|
||||||
#define S_CHICPLAY_RUN (S_CHICPLAY+1)
|
|
||||||
S_NORMAL (CHKN, 'A', 3, NULL , &States[S_CHICPLAY_RUN+1]),
|
|
||||||
S_NORMAL (CHKN, 'B', 3, NULL , &States[S_CHICPLAY_RUN+2]),
|
|
||||||
S_NORMAL (CHKN, 'A', 3, NULL , &States[S_CHICPLAY_RUN+3]),
|
|
||||||
S_NORMAL (CHKN, 'B', 3, NULL , &States[S_CHICPLAY_RUN+0]),
|
|
||||||
|
|
||||||
#define S_CHICPLAY_ATK (S_CHICPLAY_RUN+4)
|
|
||||||
S_NORMAL (CHKN, 'C', 12, NULL , &States[S_CHICPLAY]),
|
|
||||||
|
|
||||||
#define S_CHICPLAY_PAIN (S_CHICPLAY_ATK+1)
|
|
||||||
S_NORMAL (CHKN, 'D', 4, A_Feathers , &States[S_CHICPLAY_PAIN+1]),
|
|
||||||
S_NORMAL (CHKN, 'C', 4, A_Pain , &States[S_CHICPLAY]),
|
|
||||||
|
|
||||||
#define S_CHICPLAY_DIE (S_CHICPLAY_PAIN+2)
|
|
||||||
S_NORMAL (CHKN, 'E', 6, A_Scream , &States[S_CHICPLAY_DIE+1]),
|
|
||||||
S_NORMAL (CHKN, 'F', 6, A_Feathers , &States[S_CHICPLAY_DIE+2]),
|
|
||||||
S_NORMAL (CHKN, 'G', 6, NULL , &States[S_CHICPLAY_DIE+3]),
|
|
||||||
S_NORMAL (CHKN, 'H', 6, A_NoBlocking , &States[S_CHICPLAY_DIE+4]),
|
|
||||||
S_NORMAL (CHKN, 'I', 6, NULL , &States[S_CHICPLAY_DIE+5]),
|
|
||||||
S_NORMAL (CHKN, 'J', 6, NULL , &States[S_CHICPLAY_DIE+6]),
|
|
||||||
S_NORMAL (CHKN, 'K', 6, NULL , &States[S_CHICPLAY_DIE+7]),
|
|
||||||
S_NORMAL (CHKN, 'L', -1, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AChickenPlayer, Heretic, -1, 0)
|
|
||||||
PROP_SpawnHealth (30)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (24)
|
|
||||||
PROP_PainChance (255)
|
|
||||||
PROP_SpeedFixed (1)
|
|
||||||
PROP_Gravity (FRACUNIT/8)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOTDMATCH|MF_FRIENDLY)
|
|
||||||
PROP_Flags2 (MF2_WINDTHRUST|MF2_SLIDE|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_FLOORCLIP|MF2_TELESTOMP)
|
|
||||||
PROP_Flags3 (MF3_NOBLOCKMONST)
|
|
||||||
PROP_Flags4 (MF4_NOSKIN)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_CHICPLAY)
|
|
||||||
PROP_SeeState (S_CHICPLAY_RUN)
|
|
||||||
PROP_PainState (S_CHICPLAY_PAIN)
|
|
||||||
PROP_MissileState (S_CHICPLAY_ATK)
|
|
||||||
PROP_MeleeState (S_CHICPLAY_ATK)
|
|
||||||
PROP_DeathState (S_CHICPLAY_DIE)
|
|
||||||
|
|
||||||
// [GRB]
|
|
||||||
PROP_PlayerPawn_JumpZ (FRACUNIT)
|
|
||||||
PROP_PlayerPawn_ViewHeight (21*FRACUNIT)
|
|
||||||
PROP_PlayerPawn_ForwardMove1 (FRACUNIT * 2500 / 2048)
|
|
||||||
PROP_PlayerPawn_ForwardMove2 (FRACUNIT * 2500 / 2048)
|
|
||||||
PROP_PlayerPawn_SideMove1 (FRACUNIT * 2500 / 2048)
|
|
||||||
PROP_PlayerPawn_SideMove2 (FRACUNIT * 2500 / 2048)
|
|
||||||
PROP_PlayerPawn_MorphWeapon ("Beak")
|
|
||||||
|
|
||||||
PROP_PainSound ("chicken/pain")
|
|
||||||
PROP_DeathSound ("chicken/death")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_GAME_SET(ChickenPlayer)
|
|
||||||
{
|
|
||||||
RUNTIME_CLASS(AChickenPlayer)->Meta.SetMetaString(APMETA_SoundClass, "chicken");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AChickenPlayer::MorphPlayerThink ()
|
void AChickenPlayer::MorphPlayerThink ()
|
||||||
{
|
{
|
||||||
|
@ -200,102 +56,6 @@ void AChickenPlayer::MorphPlayerThink ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Chicken (non-player) -----------------------------------------------------
|
|
||||||
|
|
||||||
class AChicken : public AMorphedMonster
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AChicken, AMorphedMonster)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AChicken::States[] =
|
|
||||||
{
|
|
||||||
#define S_CHICKEN_LOOK 0
|
|
||||||
S_NORMAL (CHKN, 'A', 10, A_Look , &States[S_CHICKEN_LOOK+1]),
|
|
||||||
S_NORMAL (CHKN, 'B', 10, A_Look , &States[S_CHICKEN_LOOK+0]),
|
|
||||||
|
|
||||||
#define S_CHICKEN_WALK (S_CHICKEN_LOOK+2)
|
|
||||||
S_NORMAL (CHKN, 'A', 3, A_Chase , &States[S_CHICKEN_WALK+1]),
|
|
||||||
S_NORMAL (CHKN, 'B', 3, A_Chase , &States[S_CHICKEN_WALK+0]),
|
|
||||||
|
|
||||||
#define S_CHICKEN_PAIN (S_CHICKEN_WALK+2)
|
|
||||||
S_NORMAL (CHKN, 'D', 5, A_Feathers , &States[S_CHICKEN_PAIN+1]),
|
|
||||||
S_NORMAL (CHKN, 'C', 5, A_Pain , &States[S_CHICKEN_WALK+0]),
|
|
||||||
|
|
||||||
#define S_CHICKEN_ATK (S_CHICKEN_PAIN+2)
|
|
||||||
S_NORMAL (CHKN, 'A', 8, A_FaceTarget , &States[S_CHICKEN_ATK+1]),
|
|
||||||
S_NORMAL (CHKN, 'C', 10, A_ChicAttack , &States[S_CHICKEN_WALK+0]),
|
|
||||||
|
|
||||||
#define S_CHICKEN_DIE (S_CHICKEN_ATK+2)
|
|
||||||
S_NORMAL (CHKN, 'E', 6, A_Scream , &States[S_CHICKEN_DIE+1]),
|
|
||||||
S_NORMAL (CHKN, 'F', 6, A_Feathers , &States[S_CHICKEN_DIE+2]),
|
|
||||||
S_NORMAL (CHKN, 'G', 6, NULL , &States[S_CHICKEN_DIE+3]),
|
|
||||||
S_NORMAL (CHKN, 'H', 6, A_NoBlocking , &States[S_CHICKEN_DIE+4]),
|
|
||||||
S_NORMAL (CHKN, 'I', 6, NULL , &States[S_CHICKEN_DIE+5]),
|
|
||||||
S_NORMAL (CHKN, 'J', 6, NULL , &States[S_CHICKEN_DIE+6]),
|
|
||||||
S_NORMAL (CHKN, 'K', 6, NULL , &States[S_CHICKEN_DIE+7]),
|
|
||||||
S_NORMAL (CHKN, 'L', -1, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AChicken, Heretic, -1, 122)
|
|
||||||
PROP_SpawnHealth (10)
|
|
||||||
PROP_RadiusFixed (9)
|
|
||||||
PROP_HeightFixed (22)
|
|
||||||
PROP_Mass (40)
|
|
||||||
PROP_SpeedFixed (4)
|
|
||||||
PROP_PainChance (200)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_ISMONSTER)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_CHICKEN_LOOK)
|
|
||||||
PROP_SeeState (S_CHICKEN_WALK)
|
|
||||||
PROP_PainState (S_CHICKEN_PAIN)
|
|
||||||
PROP_MeleeState (S_CHICKEN_ATK)
|
|
||||||
PROP_DeathState (S_CHICKEN_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("chicken/pain")
|
|
||||||
PROP_AttackSound ("chicken/attack")
|
|
||||||
PROP_PainSound ("chicken/pain")
|
|
||||||
PROP_DeathSound ("chicken/death")
|
|
||||||
PROP_ActiveSound ("chicken/active")
|
|
||||||
PROP_Obituary("$OB_CHICKEN")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Feather ------------------------------------------------------------------
|
|
||||||
|
|
||||||
class AFeather : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AFeather, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AFeather::States[] =
|
|
||||||
{
|
|
||||||
#define S_FEATHER 0
|
|
||||||
S_NORMAL (CHKN, 'M', 3, NULL , &States[S_FEATHER+1]),
|
|
||||||
S_NORMAL (CHKN, 'N', 3, NULL , &States[S_FEATHER+2]),
|
|
||||||
S_NORMAL (CHKN, 'O', 3, NULL , &States[S_FEATHER+3]),
|
|
||||||
S_NORMAL (CHKN, 'P', 3, NULL , &States[S_FEATHER+4]),
|
|
||||||
S_NORMAL (CHKN, 'Q', 3, NULL , &States[S_FEATHER+5]),
|
|
||||||
S_NORMAL (CHKN, 'P', 3, NULL , &States[S_FEATHER+6]),
|
|
||||||
S_NORMAL (CHKN, 'O', 3, NULL , &States[S_FEATHER+7]),
|
|
||||||
S_NORMAL (CHKN, 'N', 3, NULL , &States[S_FEATHER+0]),
|
|
||||||
|
|
||||||
#define S_FEATHERX (S_FEATHER+8)
|
|
||||||
S_NORMAL (CHKN, 'N', 6, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AFeather, Heretic, -1, 121)
|
|
||||||
PROP_RadiusFixed (2)
|
|
||||||
PROP_HeightFixed (4)
|
|
||||||
PROP_Gravity (FRACUNIT/8)
|
|
||||||
PROP_Flags (MF_MISSILE|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH|MF2_WINDTHRUST)
|
|
||||||
PROP_Flags3 (MF3_DONTSPLASH)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_FEATHER)
|
|
||||||
PROP_DeathState (S_FEATHERX)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_ChicAttack
|
// PROC A_ChicAttack
|
||||||
|
@ -338,12 +98,12 @@ void A_Feathers (AActor *actor)
|
||||||
}
|
}
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
mo = Spawn<AFeather> (actor->x, actor->y, actor->z+20*FRACUNIT, NO_REPLACE);
|
mo = Spawn("Feather", actor->x, actor->y, actor->z+20*FRACUNIT, NO_REPLACE);
|
||||||
mo->target = actor;
|
mo->target = actor;
|
||||||
mo->momx = pr_feathers.Random2() << 8;
|
mo->momx = pr_feathers.Random2() << 8;
|
||||||
mo->momy = pr_feathers.Random2() << 8;
|
mo->momy = pr_feathers.Random2() << 8;
|
||||||
mo->momz = FRACUNIT + (pr_feathers() << 9);
|
mo->momz = FRACUNIT + (pr_feathers() << 9);
|
||||||
mo->SetState (&AFeather::States[S_FEATHER+(pr_feathers()&7)]);
|
mo->SetState (mo->SpawnState + (pr_feathers()&7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,7 +173,7 @@ void A_BeakAttackPL1 (AActor *actor)
|
||||||
damage = 1 + (pr_beakatkpl1()&3);
|
damage = 1 + (pr_beakatkpl1()&3);
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff), true);
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
||||||
|
@ -446,7 +206,7 @@ void A_BeakAttackPL2 (AActor *actor)
|
||||||
damage = pr_beakatkpl2.HitDice (4);
|
damage = pr_beakatkpl2.HitDice (4);
|
||||||
angle = player->mo->angle;
|
angle = player->mo->angle;
|
||||||
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
||||||
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(ABeakPuff), true);
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true);
|
||||||
if (linetarget)
|
if (linetarget)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
player->mo->angle = R_PointToAngle2 (player->mo->x,
|
||||||
|
|
|
@ -17,368 +17,6 @@ static FRandom pr_s2d ("Srcr2Decide");
|
||||||
static FRandom pr_s2a ("Srcr2Attack");
|
static FRandom pr_s2a ("Srcr2Attack");
|
||||||
static FRandom pr_bluespark ("BlueSpark");
|
static FRandom pr_bluespark ("BlueSpark");
|
||||||
|
|
||||||
void A_Sor1Chase (AActor *);
|
|
||||||
void A_Sor1Pain (AActor *);
|
|
||||||
void A_Srcr1Attack (AActor *);
|
|
||||||
void A_SorZap (AActor *);
|
|
||||||
void A_SorcererRise (AActor *);
|
|
||||||
void A_SorRise (AActor *);
|
|
||||||
void A_SorSightSnd (AActor *);
|
|
||||||
void A_Srcr2Decide (AActor *);
|
|
||||||
void A_Srcr2Attack (AActor *);
|
|
||||||
void A_Sor2DthInit (AActor *);
|
|
||||||
void A_SorDSph (AActor *);
|
|
||||||
void A_Sor2DthLoop (AActor *);
|
|
||||||
void A_SorDExp (AActor *);
|
|
||||||
void A_SorDBon (AActor *);
|
|
||||||
void A_BlueSpark (AActor *);
|
|
||||||
void A_GenWizard (AActor *);
|
|
||||||
|
|
||||||
// Boss spot ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class ABossSpot : public ASpecialSpot
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (ABossSpot, ASpecialSpot)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ABossSpot, Heretic, 56, 141)
|
|
||||||
PROP_RenderFlags (RF_INVISIBLE)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sorcerer (D'Sparil on his serpent) ---------------------------------------
|
|
||||||
|
|
||||||
class ASorcerer1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcerer1::States[] =
|
|
||||||
{
|
|
||||||
#define S_SRCR1_LOOK 0
|
|
||||||
S_NORMAL (SRCR, 'A', 10, A_Look , &States[S_SRCR1_LOOK+1]),
|
|
||||||
S_NORMAL (SRCR, 'B', 10, A_Look , &States[S_SRCR1_LOOK+0]),
|
|
||||||
|
|
||||||
#define S_SRCR1_WALK (S_SRCR1_LOOK+2)
|
|
||||||
S_NORMAL (SRCR, 'A', 5, A_Sor1Chase , &States[S_SRCR1_WALK+1]),
|
|
||||||
S_NORMAL (SRCR, 'B', 5, A_Sor1Chase , &States[S_SRCR1_WALK+2]),
|
|
||||||
S_NORMAL (SRCR, 'C', 5, A_Sor1Chase , &States[S_SRCR1_WALK+3]),
|
|
||||||
S_NORMAL (SRCR, 'D', 5, A_Sor1Chase , &States[S_SRCR1_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SRCR1_PAIN (S_SRCR1_WALK+4)
|
|
||||||
S_NORMAL (SRCR, 'Q', 6, A_Sor1Pain , &States[S_SRCR1_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SRCR1_ATK (S_SRCR1_PAIN+1)
|
|
||||||
S_NORMAL (SRCR, 'Q', 7, A_FaceTarget , &States[S_SRCR1_ATK+1]),
|
|
||||||
S_NORMAL (SRCR, 'R', 6, A_FaceTarget , &States[S_SRCR1_ATK+2]),
|
|
||||||
S_NORMAL (SRCR, 'S', 10, A_Srcr1Attack , &States[S_SRCR1_WALK+0]),
|
|
||||||
S_NORMAL (SRCR, 'S', 10, A_FaceTarget , &States[S_SRCR1_ATK+4]),
|
|
||||||
S_NORMAL (SRCR, 'Q', 7, A_FaceTarget , &States[S_SRCR1_ATK+5]),
|
|
||||||
S_NORMAL (SRCR, 'R', 6, A_FaceTarget , &States[S_SRCR1_ATK+6]),
|
|
||||||
S_NORMAL (SRCR, 'S', 10, A_Srcr1Attack , &States[S_SRCR1_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SRCR1_DIE (S_SRCR1_ATK+7)
|
|
||||||
S_NORMAL (SRCR, 'E', 7, NULL , &States[S_SRCR1_DIE+1]),
|
|
||||||
S_NORMAL (SRCR, 'F', 7, A_Scream , &States[S_SRCR1_DIE+2]),
|
|
||||||
S_NORMAL (SRCR, 'G', 7, NULL , &States[S_SRCR1_DIE+3]),
|
|
||||||
S_NORMAL (SRCR, 'H', 6, NULL , &States[S_SRCR1_DIE+4]),
|
|
||||||
S_NORMAL (SRCR, 'I', 6, NULL , &States[S_SRCR1_DIE+5]),
|
|
||||||
S_NORMAL (SRCR, 'J', 6, NULL , &States[S_SRCR1_DIE+6]),
|
|
||||||
S_NORMAL (SRCR, 'K', 6, NULL , &States[S_SRCR1_DIE+7]),
|
|
||||||
S_NORMAL (SRCR, 'L', 25, A_SorZap , &States[S_SRCR1_DIE+8]),
|
|
||||||
S_NORMAL (SRCR, 'M', 5, NULL , &States[S_SRCR1_DIE+9]),
|
|
||||||
S_NORMAL (SRCR, 'N', 5, NULL , &States[S_SRCR1_DIE+10]),
|
|
||||||
S_NORMAL (SRCR, 'O', 4, NULL , &States[S_SRCR1_DIE+11]),
|
|
||||||
S_NORMAL (SRCR, 'L', 20, A_SorZap , &States[S_SRCR1_DIE+12]),
|
|
||||||
S_NORMAL (SRCR, 'M', 5, NULL , &States[S_SRCR1_DIE+13]),
|
|
||||||
S_NORMAL (SRCR, 'N', 5, NULL , &States[S_SRCR1_DIE+14]),
|
|
||||||
S_NORMAL (SRCR, 'O', 4, NULL , &States[S_SRCR1_DIE+15]),
|
|
||||||
S_NORMAL (SRCR, 'L', 12, NULL , &States[S_SRCR1_DIE+16]),
|
|
||||||
S_NORMAL (SRCR, 'P', -1, A_SorcererRise , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer1, Heretic, 7, 142)
|
|
||||||
PROP_SpawnHealth (2000)
|
|
||||||
PROP_RadiusFixed (28)
|
|
||||||
PROP_HeightFixed (100)
|
|
||||||
PROP_Mass (800)
|
|
||||||
PROP_SpeedFixed (16)
|
|
||||||
PROP_PainChance (56)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_NORADIUSDMG|MF3_NOTARGET)
|
|
||||||
PROP_Flags4 (MF4_NOICEDEATH)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SRCR1_LOOK)
|
|
||||||
PROP_SeeState (S_SRCR1_WALK)
|
|
||||||
PROP_PainState (S_SRCR1_PAIN)
|
|
||||||
PROP_MissileState (S_SRCR1_ATK)
|
|
||||||
PROP_DeathState (S_SRCR1_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("dsparilserpent/sight")
|
|
||||||
PROP_AttackSound ("dsparilserpent/attack")
|
|
||||||
PROP_PainSound ("dsparilserpent/pain")
|
|
||||||
PROP_DeathSound ("dsparilserpent/death")
|
|
||||||
PROP_ActiveSound ("dsparilserpent/active")
|
|
||||||
PROP_Obituary("$OB_DSPARIL1")
|
|
||||||
PROP_HitObituary("$OB_DSPARIL1HIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sorcerer FX 1 ------------------------------------------------------------
|
|
||||||
|
|
||||||
class ASorcererFX1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcererFX1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcererFX1::States[] =
|
|
||||||
{
|
|
||||||
#define S_SRCRFX1 0
|
|
||||||
S_BRIGHT (FX14, 'A', 6, NULL , &States[S_SRCRFX1+1]),
|
|
||||||
S_BRIGHT (FX14, 'B', 6, NULL , &States[S_SRCRFX1+2]),
|
|
||||||
S_BRIGHT (FX14, 'C', 6, NULL , &States[S_SRCRFX1+0]),
|
|
||||||
|
|
||||||
#define S_SRCRFXI1 (S_SRCRFX1+3)
|
|
||||||
S_BRIGHT (FX14, 'D', 5, NULL , &States[S_SRCRFXI1+1]),
|
|
||||||
S_BRIGHT (FX14, 'E', 5, NULL , &States[S_SRCRFXI1+2]),
|
|
||||||
S_BRIGHT (FX14, 'F', 5, NULL , &States[S_SRCRFXI1+3]),
|
|
||||||
S_BRIGHT (FX14, 'G', 5, NULL , &States[S_SRCRFXI1+4]),
|
|
||||||
S_BRIGHT (FX14, 'H', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcererFX1, Heretic, -1, 144)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (10)
|
|
||||||
PROP_SpeedFixed (20)
|
|
||||||
PROP_Damage (10)
|
|
||||||
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_SRCRFX1)
|
|
||||||
PROP_DeathState (S_SRCRFXI1)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (SorcererFX1, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (ASorcererFX1, 20*FRACUNIT, 28*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sorcerer 2 (D'Sparil without his serpent) --------------------------------
|
|
||||||
|
|
||||||
FState ASorcerer2::States[] =
|
|
||||||
{
|
|
||||||
#define S_SOR2_LOOK 0
|
|
||||||
S_NORMAL (SOR2, 'M', 10, A_Look , &States[S_SOR2_LOOK+1]),
|
|
||||||
S_NORMAL (SOR2, 'N', 10, A_Look , &States[S_SOR2_LOOK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_WALK (S_SOR2_LOOK+2)
|
|
||||||
S_NORMAL (SOR2, 'M', 4, A_Chase , &States[S_SOR2_WALK+1]),
|
|
||||||
S_NORMAL (SOR2, 'N', 4, A_Chase , &States[S_SOR2_WALK+2]),
|
|
||||||
S_NORMAL (SOR2, 'O', 4, A_Chase , &States[S_SOR2_WALK+3]),
|
|
||||||
S_NORMAL (SOR2, 'P', 4, A_Chase , &States[S_SOR2_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_RISE (S_SOR2_WALK+4)
|
|
||||||
S_NORMAL (SOR2, 'A', 4, NULL , &States[S_SOR2_RISE+1]),
|
|
||||||
S_NORMAL (SOR2, 'B', 4, NULL , &States[S_SOR2_RISE+2]),
|
|
||||||
S_NORMAL (SOR2, 'C', 4, A_SorRise , &States[S_SOR2_RISE+3]),
|
|
||||||
S_NORMAL (SOR2, 'D', 4, NULL , &States[S_SOR2_RISE+4]),
|
|
||||||
S_NORMAL (SOR2, 'E', 4, NULL , &States[S_SOR2_RISE+5]),
|
|
||||||
S_NORMAL (SOR2, 'F', 4, NULL , &States[S_SOR2_RISE+6]),
|
|
||||||
S_NORMAL (SOR2, 'G', 12, A_SorSightSnd , &States[S_SOR2_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_PAIN (S_SOR2_RISE+7)
|
|
||||||
S_NORMAL (SOR2, 'Q', 3, NULL , &States[S_SOR2_PAIN+1]),
|
|
||||||
S_NORMAL (SOR2, 'Q', 6, A_Pain , &States[S_SOR2_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_ATK (S_SOR2_PAIN+2)
|
|
||||||
S_NORMAL (SOR2, 'R', 9, A_Srcr2Decide , &States[S_SOR2_ATK+1]),
|
|
||||||
S_NORMAL (SOR2, 'S', 9, A_FaceTarget , &States[S_SOR2_ATK+2]),
|
|
||||||
S_NORMAL (SOR2, 'T', 20, A_Srcr2Attack , &States[S_SOR2_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_TELE (S_SOR2_ATK+3)
|
|
||||||
S_NORMAL (SOR2, 'L', 6, NULL , &States[S_SOR2_TELE+1]),
|
|
||||||
S_NORMAL (SOR2, 'K', 6, NULL , &States[S_SOR2_TELE+2]),
|
|
||||||
S_NORMAL (SOR2, 'J', 6, NULL , &States[S_SOR2_TELE+3]),
|
|
||||||
S_NORMAL (SOR2, 'I', 6, NULL , &States[S_SOR2_TELE+4]),
|
|
||||||
S_NORMAL (SOR2, 'H', 6, NULL , &States[S_SOR2_TELE+5]),
|
|
||||||
S_NORMAL (SOR2, 'G', 6, NULL , &States[S_SOR2_WALK+0]),
|
|
||||||
|
|
||||||
#define S_SOR2_DIE (S_SOR2_TELE+6)
|
|
||||||
S_NORMAL (SDTH, 'A', 8, A_Sor2DthInit , &States[S_SOR2_DIE+1]),
|
|
||||||
S_NORMAL (SDTH, 'B', 8, NULL , &States[S_SOR2_DIE+2]),
|
|
||||||
S_NORMAL (SDTH, 'C', 8, A_SorDSph , &States[S_SOR2_DIE+3]),
|
|
||||||
S_NORMAL (SDTH, 'D', 7, NULL , &States[S_SOR2_DIE+4]),
|
|
||||||
S_NORMAL (SDTH, 'E', 7, NULL , &States[S_SOR2_DIE+5]),
|
|
||||||
S_NORMAL (SDTH, 'F', 7, A_Sor2DthLoop , &States[S_SOR2_DIE+6]),
|
|
||||||
S_NORMAL (SDTH, 'G', 6, A_SorDExp , &States[S_SOR2_DIE+7]),
|
|
||||||
S_NORMAL (SDTH, 'H', 6, NULL , &States[S_SOR2_DIE+8]),
|
|
||||||
S_NORMAL (SDTH, 'I', 18, NULL , &States[S_SOR2_DIE+9]),
|
|
||||||
S_NORMAL (SDTH, 'J', 6, A_NoBlocking , &States[S_SOR2_DIE+10]),
|
|
||||||
S_NORMAL (SDTH, 'K', 6, A_SorDBon , &States[S_SOR2_DIE+11]),
|
|
||||||
S_NORMAL (SDTH, 'L', 6, NULL , &States[S_SOR2_DIE+12]),
|
|
||||||
S_NORMAL (SDTH, 'M', 6, NULL , &States[S_SOR2_DIE+13]),
|
|
||||||
S_NORMAL (SDTH, 'N', 6, NULL , &States[S_SOR2_DIE+14]),
|
|
||||||
S_NORMAL (SDTH, 'O', -1, A_BossDeath , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer2, Heretic, -1, 143)
|
|
||||||
PROP_SpawnHealth (3500)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (70)
|
|
||||||
PROP_Mass (300)
|
|
||||||
PROP_SpeedFixed (14)
|
|
||||||
PROP_PainChance (32)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_FULLVOLACTIVE|MF3_NORADIUSDMG|MF3_NOTARGET)
|
|
||||||
PROP_Flags4 (MF4_NOICEDEATH)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SOR2_LOOK)
|
|
||||||
PROP_SeeState (S_SOR2_WALK)
|
|
||||||
PROP_PainState (S_SOR2_PAIN)
|
|
||||||
PROP_MissileState (S_SOR2_ATK)
|
|
||||||
PROP_DeathState (S_SOR2_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("dsparil/sight")
|
|
||||||
PROP_AttackSound ("dsparil/attack")
|
|
||||||
PROP_PainSound ("dsparil/pain")
|
|
||||||
PROP_ActiveSound ("dsparil/active")
|
|
||||||
PROP_Obituary("$OB_DSPARIL2")
|
|
||||||
PROP_HitObituary("$OB_DSPARIL2HIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sorcerer 2 FX 1 ----------------------------------------------------------
|
|
||||||
|
|
||||||
class ASorcerer2FX1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer2FX1, AActor)
|
|
||||||
public:
|
|
||||||
void GetExplodeParms (int &damage, int &distance, bool &hurtSource);
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcerer2FX1::States[] =
|
|
||||||
{
|
|
||||||
#define S_SOR2FX1 0
|
|
||||||
S_BRIGHT (FX16, 'A', 3, A_BlueSpark , &States[S_SOR2FX1+1]),
|
|
||||||
S_BRIGHT (FX16, 'B', 3, A_BlueSpark , &States[S_SOR2FX1+2]),
|
|
||||||
S_BRIGHT (FX16, 'C', 3, A_BlueSpark , &States[S_SOR2FX1+0]),
|
|
||||||
|
|
||||||
#define S_SOR2FXI1 (S_SOR2FX1+3)
|
|
||||||
S_BRIGHT (FX16, 'G', 5, A_Explode , &States[S_SOR2FXI1+1]),
|
|
||||||
S_BRIGHT (FX16, 'H', 5, NULL , &States[S_SOR2FXI1+2]),
|
|
||||||
S_BRIGHT (FX16, 'I', 5, NULL , &States[S_SOR2FXI1+3]),
|
|
||||||
S_BRIGHT (FX16, 'J', 5, NULL , &States[S_SOR2FXI1+4]),
|
|
||||||
S_BRIGHT (FX16, 'K', 5, NULL , &States[S_SOR2FXI1+5]),
|
|
||||||
S_BRIGHT (FX16, 'L', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer2FX1, Heretic, -1, 145)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (20)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SOR2FX1)
|
|
||||||
PROP_DeathState (S_SOR2FXI1)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (Sorcerer2FX1, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (ASorcerer2FX1, 20*FRACUNIT, 28*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASorcerer2FX1::GetExplodeParms (int &damage, int &distance, bool &hurtSource)
|
|
||||||
{
|
|
||||||
damage = 80 + (pr_s2fx1() & 31);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sorcerer 2 FX Spark ------------------------------------------------------
|
|
||||||
|
|
||||||
class ASorcerer2FXSpark : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer2FXSpark, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcerer2FXSpark::States[] =
|
|
||||||
{
|
|
||||||
#define S_SOR2FXSPARK 0
|
|
||||||
S_BRIGHT (FX16, 'D', 12, NULL , &States[S_SOR2FXSPARK+1]),
|
|
||||||
S_BRIGHT (FX16, 'E', 12, NULL , &States[S_SOR2FXSPARK+2]),
|
|
||||||
S_BRIGHT (FX16, 'F', 12, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer2FXSpark, Heretic, -1, 0)
|
|
||||||
PROP_RadiusFixed (20)
|
|
||||||
PROP_HeightFixed (16)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SOR2FXSPARK)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sorcerer 2 FX 2 ----------------------------------------------------------
|
|
||||||
|
|
||||||
class ASorcerer2FX2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer2FX2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcerer2FX2::States[] =
|
|
||||||
{
|
|
||||||
#define S_SOR2FX2 0
|
|
||||||
S_BRIGHT (FX11, 'A', 35, NULL , &States[S_SOR2FX2+1]),
|
|
||||||
S_BRIGHT (FX11, 'A', 5, A_GenWizard , &States[S_SOR2FX2+2]),
|
|
||||||
S_BRIGHT (FX11, 'B', 5, NULL , &States[S_SOR2FX2+1]),
|
|
||||||
|
|
||||||
#define S_SOR2FXI2 (S_SOR2FX2+3)
|
|
||||||
S_BRIGHT (FX11, 'C', 5, NULL , &States[S_SOR2FXI2+1]),
|
|
||||||
S_BRIGHT (FX11, 'D', 5, NULL , &States[S_SOR2FXI2+2]),
|
|
||||||
S_BRIGHT (FX11, 'E', 5, NULL , &States[S_SOR2FXI2+3]),
|
|
||||||
S_BRIGHT (FX11, 'F', 5, NULL , &States[S_SOR2FXI2+4]),
|
|
||||||
S_BRIGHT (FX11, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer2FX2, Heretic, -1, 146)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (6)
|
|
||||||
PROP_Damage (10)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SOR2FX2)
|
|
||||||
PROP_DeathState (S_SOR2FXI2)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Sorcerer 2 Telefade ------------------------------------------------------
|
|
||||||
|
|
||||||
class ASorcerer2Telefade : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer2Telefade, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ASorcerer2Telefade::States[] =
|
|
||||||
{
|
|
||||||
#define S_SOR2TELEFADE 0
|
|
||||||
S_NORMAL (SOR2, 'G', 8, NULL , &States[S_SOR2TELEFADE+1]),
|
|
||||||
S_NORMAL (SOR2, 'H', 6, NULL , &States[S_SOR2TELEFADE+2]),
|
|
||||||
S_NORMAL (SOR2, 'I', 6, NULL , &States[S_SOR2TELEFADE+3]),
|
|
||||||
S_NORMAL (SOR2, 'J', 6, NULL , &States[S_SOR2TELEFADE+4]),
|
|
||||||
S_NORMAL (SOR2, 'K', 6, NULL , &States[S_SOR2TELEFADE+5]),
|
|
||||||
S_NORMAL (SOR2, 'L', 6, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ASorcerer2Telefade, Heretic, -1, 0)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP)
|
|
||||||
PROP_SpawnState (S_SOR2TELEFADE)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_Sor1Pain
|
// PROC A_Sor1Pain
|
||||||
|
@ -433,19 +71,21 @@ void A_Srcr1Attack (AActor *actor)
|
||||||
P_TraceBleed (damage, actor->target, actor);
|
P_TraceBleed (damage, actor->target, actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const PClass *fx = PClass::FindClass("SorcererFX1");
|
||||||
if (actor->health > (actor->GetDefault()->health/3)*2)
|
if (actor->health > (actor->GetDefault()->health/3)*2)
|
||||||
{ // Spit one fireball
|
{ // Spit one fireball
|
||||||
P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, RUNTIME_CLASS(ASorcererFX1));
|
P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, fx );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // Spit three fireballs
|
{ // Spit three fireballs
|
||||||
mo = P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, RUNTIME_CLASS(ASorcererFX1));
|
mo = P_SpawnMissileZ (actor, actor->z + 48*FRACUNIT, actor->target, fx);
|
||||||
if (mo != NULL)
|
if (mo != NULL)
|
||||||
{
|
{
|
||||||
momz = mo->momz;
|
momz = mo->momz;
|
||||||
angle = mo->angle;
|
angle = mo->angle;
|
||||||
P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, RUNTIME_CLASS(ASorcererFX1), angle-ANGLE_1*3, momz);
|
P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, fx, angle-ANGLE_1*3, momz);
|
||||||
P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, RUNTIME_CLASS(ASorcererFX1), angle+ANGLE_1*3, momz);
|
P_SpawnMissileAngleZ (actor, actor->z + 48*FRACUNIT, fx, angle+ANGLE_1*3, momz);
|
||||||
}
|
}
|
||||||
if (actor->health < actor->GetDefault()->health/3)
|
if (actor->health < actor->GetDefault()->health/3)
|
||||||
{ // Maybe attack again
|
{ // Maybe attack again
|
||||||
|
@ -456,7 +96,7 @@ void A_Srcr1Attack (AActor *actor)
|
||||||
else
|
else
|
||||||
{ // Set state to attack again
|
{ // Set state to attack again
|
||||||
actor->special1 = 1;
|
actor->special1 = 1;
|
||||||
actor->SetState (&ASorcerer1::States[S_SRCR1_ATK+3]);
|
actor->SetState (actor->FindState("Missile2"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -473,8 +113,8 @@ void A_SorcererRise (AActor *actor)
|
||||||
AActor *mo;
|
AActor *mo;
|
||||||
|
|
||||||
actor->flags &= ~MF_SOLID;
|
actor->flags &= ~MF_SOLID;
|
||||||
mo = Spawn<ASorcerer2> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
mo = Spawn("Sorcerer2", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||||
mo->SetState (&ASorcerer2::States[S_SOR2_RISE]);
|
mo->SetState (mo->FindState("Rise"));
|
||||||
mo->angle = actor->angle;
|
mo->angle = actor->angle;
|
||||||
mo->CopyFriendliness (actor, true);
|
mo->CopyFriendliness (actor, true);
|
||||||
}
|
}
|
||||||
|
@ -496,7 +136,7 @@ void P_DSparilTeleport (AActor *actor)
|
||||||
DSpotState *state = DSpotState::GetSpotState();
|
DSpotState *state = DSpotState::GetSpotState();
|
||||||
if (state == NULL) return;
|
if (state == NULL) return;
|
||||||
|
|
||||||
spot = state->GetSpotWithMinDistance(RUNTIME_CLASS(ABossSpot), actor->x, actor->y, 128*FRACUNIT);
|
spot = state->GetSpotWithMinDistance(PClass::FindClass("BossSpot"), actor->x, actor->y, 128*FRACUNIT);
|
||||||
if (spot == NULL) return;
|
if (spot == NULL) return;
|
||||||
|
|
||||||
prevX = actor->x;
|
prevX = actor->x;
|
||||||
|
@ -504,9 +144,9 @@ void P_DSparilTeleport (AActor *actor)
|
||||||
prevZ = actor->z;
|
prevZ = actor->z;
|
||||||
if (P_TeleportMove (actor, spot->x, spot->y, spot->z, false))
|
if (P_TeleportMove (actor, spot->x, spot->y, spot->z, false))
|
||||||
{
|
{
|
||||||
mo = Spawn<ASorcerer2Telefade> (prevX, prevY, prevZ, ALLOW_REPLACE);
|
mo = Spawn("Sorcerer2Telefade", prevX, prevY, prevZ, ALLOW_REPLACE);
|
||||||
S_Sound (mo, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
|
S_Sound (mo, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
|
||||||
actor->SetState (&ASorcerer2::States[S_SOR2_TELE]);
|
actor->SetState (actor->FindState("Teleport"));
|
||||||
S_Sound (actor, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
|
||||||
actor->z = actor->floorz;
|
actor->z = actor->floorz;
|
||||||
actor->angle = spot->angle;
|
actor->angle = spot->angle;
|
||||||
|
@ -565,14 +205,17 @@ void A_Srcr2Attack (AActor *actor)
|
||||||
chance = actor->health < actor->GetDefault()->health/2 ? 96 : 48;
|
chance = actor->health < actor->GetDefault()->health/2 ? 96 : 48;
|
||||||
if (pr_s2a() < chance)
|
if (pr_s2a() < chance)
|
||||||
{ // Wizard spawners
|
{ // Wizard spawners
|
||||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(ASorcerer2FX2),
|
|
||||||
actor->angle-ANG45, FRACUNIT/2);
|
const PClass *fx = PClass::FindClass("Sorcerer2FX2");
|
||||||
P_SpawnMissileAngle (actor, RUNTIME_CLASS(ASorcerer2FX2),
|
if (fx)
|
||||||
actor->angle+ANG45, FRACUNIT/2);
|
{
|
||||||
|
P_SpawnMissileAngle (actor, fx, actor->angle-ANG45, FRACUNIT/2);
|
||||||
|
P_SpawnMissileAngle (actor, fx, actor->angle+ANG45, FRACUNIT/2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // Blue bolt
|
{ // Blue bolt
|
||||||
P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ASorcerer2FX1));
|
P_SpawnMissile (actor, actor->target, PClass::FindClass("Sorcerer2FX1"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,7 +232,7 @@ void A_BlueSpark (AActor *actor)
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
mo = Spawn<ASorcerer2FXSpark> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
mo = Spawn("Sorcerer2FXSpark", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||||
mo->momx = pr_bluespark.Random2() << 9;
|
mo->momx = pr_bluespark.Random2() << 9;
|
||||||
mo->momy = pr_bluespark.Random2() << 9;
|
mo->momy = pr_bluespark.Random2() << 9;
|
||||||
mo->momz = FRACUNIT + (pr_bluespark()<<8);
|
mo->momz = FRACUNIT + (pr_bluespark()<<8);
|
||||||
|
@ -606,9 +249,10 @@ void A_GenWizard (AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *mo;
|
AActor *mo;
|
||||||
|
|
||||||
mo = Spawn<AWizard> (actor->x, actor->y, actor->z - GetDefault<AWizard>()->height/2, ALLOW_REPLACE);
|
mo = Spawn("Wizard", actor->x, actor->y, actor->z, ALLOW_REPLACE);
|
||||||
if (mo != NULL)
|
if (mo != NULL)
|
||||||
{
|
{
|
||||||
|
mo->z -= mo->GetDefault()->height/2;
|
||||||
if (!P_TestMobjLocation (mo))
|
if (!P_TestMobjLocation (mo))
|
||||||
{ // Didn't fit
|
{ // Didn't fit
|
||||||
mo->Destroy ();
|
mo->Destroy ();
|
||||||
|
@ -650,19 +294,7 @@ void A_Sor2DthLoop (AActor *actor)
|
||||||
{
|
{
|
||||||
if (--actor->special1)
|
if (--actor->special1)
|
||||||
{ // Need to loop
|
{ // Need to loop
|
||||||
actor->SetState (&ASorcerer2::States[S_SOR2_DIE+3]);
|
actor->SetState (actor->FindState("DeathLoop"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// D'Sparil Sound Routines
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_SorZap (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/zap", 1, ATTN_NONE);}
|
|
||||||
void A_SorRise (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/rise", 1, ATTN_NONE);}
|
|
||||||
void A_SorDSph (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/scream", 1, ATTN_NONE);}
|
|
||||||
void A_SorDExp (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/explode", 1, ATTN_NONE);}
|
|
||||||
void A_SorDBon (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/bones", 1, ATTN_NONE);}
|
|
||||||
void A_SorSightSnd (AActor *actor) {S_Sound (actor, CHAN_BODY, "dsparil/sight", 1, ATTN_NONE);}
|
|
||||||
|
|
|
@ -10,25 +10,13 @@
|
||||||
|
|
||||||
class AArtiTomeOfPower : public APowerupGiver
|
class AArtiTomeOfPower : public APowerupGiver
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AArtiTomeOfPower, APowerupGiver)
|
DECLARE_CLASS (AArtiTomeOfPower, APowerupGiver)
|
||||||
public:
|
public:
|
||||||
bool Use (bool pickup);
|
bool Use (bool pickup);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AArtiTomeOfPower::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (PWBK, 'A', 350, NULL, &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AArtiTomeOfPower, Heretic, 86, 134)
|
IMPLEMENT_CLASS (AArtiTomeOfPower)
|
||||||
PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
|
|
||||||
PROP_Flags2 (MF2_FLOATBOB)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_Inventory_PickupFlash (1)
|
|
||||||
PROP_Inventory_Icon ("ARTIPWBK")
|
|
||||||
PROP_PowerupGiver_Powerup ("PowerWeaponLevel2")
|
|
||||||
PROP_Inventory_PickupMessage("$TXT_ARTITOMEOFPOWER")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
bool AArtiTomeOfPower::Use (bool pickup)
|
bool AArtiTomeOfPower::Use (bool pickup)
|
||||||
{
|
{
|
||||||
|
@ -55,70 +43,28 @@ bool AArtiTomeOfPower::Use (bool pickup)
|
||||||
|
|
||||||
// Time bomb ----------------------------------------------------------------
|
// Time bomb ----------------------------------------------------------------
|
||||||
|
|
||||||
class AActivatedTimeBomb : public AActor
|
void A_TimeBomb(AActor *self)
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AActivatedTimeBomb, AActor)
|
self->z += 32*FRACUNIT;
|
||||||
public:
|
self->RenderStyle = STYLE_Add;
|
||||||
void PreExplode ()
|
self->alpha = FRACUNIT;
|
||||||
{
|
A_Explode(self);
|
||||||
z += 32*FRACUNIT;
|
}
|
||||||
alpha = OPAQUE;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AActivatedTimeBomb::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (FBMB, 'A', 10, NULL , &States[1]),
|
|
||||||
S_NORMAL (FBMB, 'B', 10, NULL , &States[2]),
|
|
||||||
S_NORMAL (FBMB, 'C', 10, NULL , &States[3]),
|
|
||||||
S_NORMAL (FBMB, 'D', 10, NULL , &States[4]),
|
|
||||||
S_NORMAL (FBMB, 'E', 6, A_Scream , &States[5]),
|
|
||||||
S_BRIGHT (XPL1, 'A', 4, A_Explode, &States[6]),
|
|
||||||
S_BRIGHT (XPL1, 'B', 4, NULL , &States[7]),
|
|
||||||
S_BRIGHT (XPL1, 'C', 4, NULL , &States[8]),
|
|
||||||
S_BRIGHT (XPL1, 'D', 4, NULL , &States[9]),
|
|
||||||
S_BRIGHT (XPL1, 'E', 4, NULL , &States[10]),
|
|
||||||
S_BRIGHT (XPL1, 'F', 4, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AActivatedTimeBomb, Heretic, -1, 0)
|
|
||||||
PROP_Flags (MF_NOGRAVITY)
|
|
||||||
PROP_RenderStyle (STYLE_Translucent)
|
|
||||||
PROP_Alpha (HR_SHADOW)
|
|
||||||
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
|
|
||||||
PROP_DeathSound ("misc/timebomb")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
class AArtiTimeBomb : public AInventory
|
class AArtiTimeBomb : public AInventory
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AArtiTimeBomb, AInventory)
|
DECLARE_CLASS (AArtiTimeBomb, AInventory)
|
||||||
public:
|
public:
|
||||||
bool Use (bool pickup);
|
bool Use (bool pickup);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AArtiTimeBomb::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (FBMB, 'E', 350, NULL, &States[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AArtiTimeBomb, Heretic, 34, 72)
|
IMPLEMENT_CLASS (AArtiTimeBomb)
|
||||||
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 ("ARTIFBMB")
|
|
||||||
PROP_Inventory_PickupSound ("misc/p_pkup")
|
|
||||||
PROP_Inventory_PickupMessage("$TXT_ARTIFIREBOMB")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
bool AArtiTimeBomb::Use (bool pickup)
|
bool AArtiTimeBomb::Use (bool pickup)
|
||||||
{
|
{
|
||||||
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
|
angle_t angle = Owner->angle >> ANGLETOFINESHIFT;
|
||||||
AActor *mo = Spawn<AActivatedTimeBomb> (
|
AActor *mo = Spawn("ActivatedTimeBomb",
|
||||||
Owner->x + 24*finecosine[angle],
|
Owner->x + 24*finecosine[angle],
|
||||||
Owner->y + 24*finesine[angle],
|
Owner->y + 24*finesine[angle],
|
||||||
Owner->z - Owner->floorclip, ALLOW_REPLACE);
|
Owner->z - Owner->floorclip, ALLOW_REPLACE);
|
||||||
|
|
|
@ -21,18 +21,6 @@ class APhoenixPuff : public AActor
|
||||||
DECLARE_ACTOR (APhoenixPuff, AActor)
|
DECLARE_ACTOR (APhoenixPuff, AActor)
|
||||||
};
|
};
|
||||||
|
|
||||||
class ASorcerer2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ASorcerer2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
class AWizard : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AWizard, AActor)
|
|
||||||
public:
|
|
||||||
void NoBlockingSet ();
|
|
||||||
};
|
|
||||||
|
|
||||||
void P_DSparilTeleport (AActor *actor);
|
void P_DSparilTeleport (AActor *actor);
|
||||||
|
|
||||||
class AStaffPuff : public AActor
|
class AStaffPuff : public AActor
|
||||||
|
|
|
@ -8,218 +8,6 @@
|
||||||
#include "gstrings.h"
|
#include "gstrings.h"
|
||||||
|
|
||||||
static FRandom pr_imp ("ImpExplode");
|
static FRandom pr_imp ("ImpExplode");
|
||||||
static FRandom pr_impmeatk ("ImpMeAttack");
|
|
||||||
static FRandom pr_impmsatk ("ImpMsAttack");
|
|
||||||
static FRandom pr_impmsatk2 ("ImpMsAttack2");
|
|
||||||
|
|
||||||
void A_ImpExplode (AActor *);
|
|
||||||
void A_ImpMeAttack (AActor *);
|
|
||||||
void A_ImpMsAttack (AActor *);
|
|
||||||
void A_ImpMsAttack2 (AActor *);
|
|
||||||
void A_ImpDeath (AActor *);
|
|
||||||
void A_ImpXDeath1 (AActor *);
|
|
||||||
void A_ImpXDeath2 (AActor *);
|
|
||||||
|
|
||||||
// Heretic imp (as opposed to the Doom variety) -----------------------------
|
|
||||||
|
|
||||||
class AHereticImp : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHereticImp, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHereticImp::States[] =
|
|
||||||
{
|
|
||||||
#define S_IMP_LOOK 0
|
|
||||||
S_NORMAL (IMPX, 'A', 10, A_Look , &States[S_IMP_LOOK+1]),
|
|
||||||
S_NORMAL (IMPX, 'B', 10, A_Look , &States[S_IMP_LOOK+2]),
|
|
||||||
S_NORMAL (IMPX, 'C', 10, A_Look , &States[S_IMP_LOOK+3]),
|
|
||||||
S_NORMAL (IMPX, 'B', 10, A_Look , &States[S_IMP_LOOK+0]),
|
|
||||||
|
|
||||||
#define S_IMP_FLY (S_IMP_LOOK+4)
|
|
||||||
S_NORMAL (IMPX, 'A', 3, A_Chase , &States[S_IMP_FLY+1]),
|
|
||||||
S_NORMAL (IMPX, 'A', 3, A_Chase , &States[S_IMP_FLY+2]),
|
|
||||||
S_NORMAL (IMPX, 'B', 3, A_Chase , &States[S_IMP_FLY+3]),
|
|
||||||
S_NORMAL (IMPX, 'B', 3, A_Chase , &States[S_IMP_FLY+4]),
|
|
||||||
S_NORMAL (IMPX, 'C', 3, A_Chase , &States[S_IMP_FLY+5]),
|
|
||||||
S_NORMAL (IMPX, 'C', 3, A_Chase , &States[S_IMP_FLY+6]),
|
|
||||||
S_NORMAL (IMPX, 'B', 3, A_Chase , &States[S_IMP_FLY+7]),
|
|
||||||
S_NORMAL (IMPX, 'B', 3, A_Chase , &States[S_IMP_FLY+0]),
|
|
||||||
|
|
||||||
#define S_IMP_MEATK (S_IMP_FLY+8)
|
|
||||||
S_NORMAL (IMPX, 'D', 6, A_FaceTarget , &States[S_IMP_MEATK+1]),
|
|
||||||
S_NORMAL (IMPX, 'E', 6, A_FaceTarget , &States[S_IMP_MEATK+2]),
|
|
||||||
S_NORMAL (IMPX, 'F', 6, A_ImpMeAttack , &States[S_IMP_FLY+0]),
|
|
||||||
|
|
||||||
#define S_IMP_MSATK1 (S_IMP_MEATK+3)
|
|
||||||
S_NORMAL (IMPX, 'A', 10, A_FaceTarget , &States[S_IMP_MSATK1+1]),
|
|
||||||
S_NORMAL (IMPX, 'B', 6, A_ImpMsAttack , &States[S_IMP_MSATK1+2]),
|
|
||||||
S_NORMAL (IMPX, 'C', 6, NULL , &States[S_IMP_MSATK1+3]),
|
|
||||||
S_NORMAL (IMPX, 'B', 6, NULL , &States[S_IMP_MSATK1+4]),
|
|
||||||
S_NORMAL (IMPX, 'A', 6, NULL , &States[S_IMP_MSATK1+5]),
|
|
||||||
S_NORMAL (IMPX, 'B', 6, NULL , &States[S_IMP_MSATK1+2]),
|
|
||||||
|
|
||||||
#define S_IMP_PAIN (S_IMP_MSATK1+6)
|
|
||||||
S_NORMAL (IMPX, 'G', 3, NULL , &States[S_IMP_PAIN+1]),
|
|
||||||
S_NORMAL (IMPX, 'G', 3, A_Pain , &States[S_IMP_FLY+0]),
|
|
||||||
|
|
||||||
#define S_IMP_DIE (S_IMP_PAIN+2)
|
|
||||||
S_NORMAL (IMPX, 'G', 4, A_ImpDeath , &States[S_IMP_DIE+1]),
|
|
||||||
S_NORMAL (IMPX, 'H', 5, NULL , &States[S_IMP_DIE+1]),
|
|
||||||
|
|
||||||
#define S_IMP_XDIE (S_IMP_DIE+2)
|
|
||||||
S_NORMAL (IMPX, 'S', 5, A_ImpXDeath1 , &States[S_IMP_XDIE+1]),
|
|
||||||
S_NORMAL (IMPX, 'T', 5, NULL , &States[S_IMP_XDIE+2]),
|
|
||||||
S_NORMAL (IMPX, 'U', 5, NULL , &States[S_IMP_XDIE+3]),
|
|
||||||
S_NORMAL (IMPX, 'V', 5, A_ImpXDeath2 , &States[S_IMP_XDIE+4]),
|
|
||||||
S_NORMAL (IMPX, 'W', 5, NULL , &States[S_IMP_XDIE+4]),
|
|
||||||
|
|
||||||
#define S_IMP_CRASH (S_IMP_XDIE+5)
|
|
||||||
S_NORMAL (IMPX, 'I', 7, A_ImpExplode , &States[S_IMP_CRASH+1]),
|
|
||||||
S_NORMAL (IMPX, 'J', 7, A_Scream , &States[S_IMP_CRASH+2]),
|
|
||||||
S_NORMAL (IMPX, 'K', 7, NULL , &States[S_IMP_CRASH+3]),
|
|
||||||
S_NORMAL (IMPX, 'L', -1, NULL , NULL),
|
|
||||||
|
|
||||||
#define S_IMP_XCRASH (S_IMP_CRASH+4)
|
|
||||||
S_NORMAL (IMPX, 'X', 7, NULL , &States[S_IMP_XCRASH+1]),
|
|
||||||
S_NORMAL (IMPX, 'Y', 7, NULL , &States[S_IMP_XCRASH+2]),
|
|
||||||
S_NORMAL (IMPX, 'Z', -1, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHereticImp, Heretic, 66, 5)
|
|
||||||
PROP_SpawnHealth (40)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (36)
|
|
||||||
PROP_Mass (50)
|
|
||||||
PROP_SpeedFixed (10)
|
|
||||||
PROP_PainChance (200)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_SPAWNFLOAT|MF2_PASSMOBJ|MF2_PUSHWALL)
|
|
||||||
PROP_Flags3 (MF3_DONTOVERLAP)
|
|
||||||
PROP_Flags4 (MF4_MISSILEMORE)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_IMP_LOOK)
|
|
||||||
PROP_SeeState (S_IMP_FLY)
|
|
||||||
PROP_PainState (S_IMP_PAIN)
|
|
||||||
PROP_MeleeState (S_IMP_MEATK)
|
|
||||||
PROP_MissileState (S_IMP_MSATK1)
|
|
||||||
PROP_CrashState (S_IMP_CRASH)
|
|
||||||
PROP_DeathState (S_IMP_DIE)
|
|
||||||
PROP_XDeathState (S_IMP_XDIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("himp/sight")
|
|
||||||
PROP_AttackSound ("himp/attack")
|
|
||||||
PROP_PainSound ("himp/pain")
|
|
||||||
PROP_DeathSound ("himp/death")
|
|
||||||
PROP_ActiveSound ("himp/active")
|
|
||||||
PROP_Obituary("$OB_HERETICIMP")
|
|
||||||
PROP_HitObituary("$OB_HERETICIMPHIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Heretic imp leader -------------------------------------------------------
|
|
||||||
|
|
||||||
class AHereticImpLeader : public AHereticImp
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHereticImpLeader, AHereticImp)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHereticImpLeader::States[] =
|
|
||||||
{
|
|
||||||
#define S_IMP_MSATK2 0
|
|
||||||
S_NORMAL (IMPX, 'D', 6, A_FaceTarget , &States[S_IMP_MSATK2+1]),
|
|
||||||
S_NORMAL (IMPX, 'E', 6, A_FaceTarget , &States[S_IMP_MSATK2+2]),
|
|
||||||
S_NORMAL (IMPX, 'F', 6, A_ImpMsAttack2 , &AHereticImp::States[S_IMP_FLY]),
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHereticImpLeader, Heretic, 5, 7)
|
|
||||||
PROP_SpawnHealth (80)
|
|
||||||
|
|
||||||
PROP_MeleeState (PROP_CLEAR_STATE)
|
|
||||||
PROP_MissileState (S_IMP_MSATK2)
|
|
||||||
PROP_Flags4Clear(MF4_MISSILEMORE) // The imp leader does have a 'normal' missile range!
|
|
||||||
|
|
||||||
PROP_AttackSound ("himp/leaderattack")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Heretic imp chunk 1 ------------------------------------------------------
|
|
||||||
|
|
||||||
class AHereticImpChunk1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHereticImpChunk1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHereticImpChunk1::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (IMPX, 'M', 5, NULL , &States[1]),
|
|
||||||
S_NORMAL (IMPX, 'N', 700, NULL , &States[2]),
|
|
||||||
S_NORMAL (IMPX, 'O', 700, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHereticImpChunk1, Heretic, -1, 0)
|
|
||||||
PROP_Mass (5)
|
|
||||||
PROP_Radius (4)
|
|
||||||
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Heretic imp chunk 2 ------------------------------------------------------
|
|
||||||
|
|
||||||
class AHereticImpChunk2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHereticImpChunk2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHereticImpChunk2::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (IMPX, 'P', 5, NULL , &States[1]),
|
|
||||||
S_NORMAL (IMPX, 'Q', 700, NULL , &States[2]),
|
|
||||||
S_NORMAL (IMPX, 'R', 700, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHereticImpChunk2, Heretic, -1, 0)
|
|
||||||
PROP_Mass (5)
|
|
||||||
PROP_Radius (4)
|
|
||||||
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Heretic imp ball ---------------------------------------------------------
|
|
||||||
|
|
||||||
class AHereticImpBall : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHereticImpBall, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHereticImpBall::States[] =
|
|
||||||
{
|
|
||||||
#define S_IMPFX 0
|
|
||||||
S_BRIGHT (FX10, 'A', 6, NULL , &States[S_IMPFX+1]),
|
|
||||||
S_BRIGHT (FX10, 'B', 6, NULL , &States[S_IMPFX+2]),
|
|
||||||
S_BRIGHT (FX10, 'C', 6, NULL , &States[S_IMPFX+0]),
|
|
||||||
|
|
||||||
#define S_IMPFXI (S_IMPFX+3)
|
|
||||||
S_BRIGHT (FX10, 'D', 5, NULL , &States[S_IMPFXI+1]),
|
|
||||||
S_BRIGHT (FX10, 'E', 5, NULL , &States[S_IMPFXI+2]),
|
|
||||||
S_BRIGHT (FX10, 'F', 5, NULL , &States[S_IMPFXI+3]),
|
|
||||||
S_BRIGHT (FX10, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHereticImpBall, Heretic, -1, 10)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (8)
|
|
||||||
PROP_SpeedFixed (10)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_IMPFX)
|
|
||||||
PROP_DeathState (S_IMPFXI)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (HereticImpBall, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (AHereticImpBall, 10*FRACUNIT, 20*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -233,100 +21,21 @@ void A_ImpExplode (AActor *self)
|
||||||
|
|
||||||
self->flags &= ~MF_NOGRAVITY;
|
self->flags &= ~MF_NOGRAVITY;
|
||||||
|
|
||||||
chunk = Spawn<AHereticImpChunk1> (self->x, self->y, self->z, ALLOW_REPLACE);
|
chunk = Spawn("HereticImpChunk1", self->x, self->y, self->z, ALLOW_REPLACE);
|
||||||
chunk->momx = pr_imp.Random2 () << 10;
|
chunk->momx = pr_imp.Random2 () << 10;
|
||||||
chunk->momy = pr_imp.Random2 () << 10;
|
chunk->momy = pr_imp.Random2 () << 10;
|
||||||
chunk->momz = 9*FRACUNIT;
|
chunk->momz = 9*FRACUNIT;
|
||||||
|
|
||||||
chunk = Spawn<AHereticImpChunk2> (self->x, self->y, self->z, ALLOW_REPLACE);
|
chunk = Spawn("HereticImpChunk2", self->x, self->y, self->z, ALLOW_REPLACE);
|
||||||
chunk->momx = pr_imp.Random2 () << 10;
|
chunk->momx = pr_imp.Random2 () << 10;
|
||||||
chunk->momy = pr_imp.Random2 () << 10;
|
chunk->momy = pr_imp.Random2 () << 10;
|
||||||
chunk->momz = 9*FRACUNIT;
|
chunk->momz = 9*FRACUNIT;
|
||||||
if (self->special1 == 666)
|
if (self->special1 == 666)
|
||||||
{ // Extreme death crash
|
{ // Extreme death crash
|
||||||
self->SetState (&AHereticImp::States[S_IMP_XCRASH]);
|
self->SetState (self->FindState("XCrash"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_ImpMeAttack
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_ImpMeAttack (AActor *self)
|
|
||||||
{
|
|
||||||
if (!self->target)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
|
||||||
if (self->CheckMeleeRange ())
|
|
||||||
{
|
|
||||||
int damage = 5+(pr_impmeatk()&7);
|
|
||||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
|
||||||
P_TraceBleed (damage, self->target, self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_ImpMsAttack
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_ImpMsAttack (AActor *self)
|
|
||||||
{
|
|
||||||
AActor *dest;
|
|
||||||
angle_t an;
|
|
||||||
int dist;
|
|
||||||
|
|
||||||
if (!self->target || pr_impmsatk() > 64)
|
|
||||||
{
|
|
||||||
self->SetState (self->SeeState);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dest = self->target;
|
|
||||||
self->flags |= MF_SKULLFLY;
|
|
||||||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
|
||||||
A_FaceTarget (self);
|
|
||||||
an = self->angle >> ANGLETOFINESHIFT;
|
|
||||||
self->momx = FixedMul (12*FRACUNIT, finecosine[an]);
|
|
||||||
self->momy = FixedMul (12*FRACUNIT, finesine[an]);
|
|
||||||
dist = P_AproxDistance (dest->x - self->x, dest->y - self->y);
|
|
||||||
dist = dist/(12*FRACUNIT);
|
|
||||||
if (dist < 1)
|
|
||||||
{
|
|
||||||
dist = 1;
|
|
||||||
}
|
|
||||||
self->momz = (dest->z + (dest->height>>1) - self->z)/dist;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_ImpMsAttack2
|
|
||||||
//
|
|
||||||
// Fireball attack of the imp leader.
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_ImpMsAttack2 (AActor *self)
|
|
||||||
{
|
|
||||||
if (!self->target)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
|
||||||
if (self->CheckMeleeRange ())
|
|
||||||
{
|
|
||||||
int damage = 5+(pr_impmsatk2()&7);
|
|
||||||
P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
|
||||||
P_TraceBleed (damage, self->target, self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
P_SpawnMissile (self, self->target, RUNTIME_CLASS(AHereticImpBall));
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_ImpDeath
|
// PROC A_ImpDeath
|
||||||
|
@ -337,10 +46,6 @@ void A_ImpDeath (AActor *self)
|
||||||
{
|
{
|
||||||
self->flags &= ~MF_SOLID;
|
self->flags &= ~MF_SOLID;
|
||||||
self->flags2 |= MF2_FLOORCLIP;
|
self->flags2 |= MF2_FLOORCLIP;
|
||||||
if (self->z <= self->floorz)
|
|
||||||
{
|
|
||||||
//self->SetState (&AHereticImp::States[S_IMP_CRASH]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -357,18 +62,3 @@ void A_ImpXDeath1 (AActor *self)
|
||||||
self->special1 = 666; // Flag the crash routine
|
self->special1 = 666; // Flag the crash routine
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_ImpXDeath2
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_ImpXDeath2 (AActor *self)
|
|
||||||
{
|
|
||||||
self->flags &= ~MF_NOGRAVITY;
|
|
||||||
if (self->z <= self->floorz)
|
|
||||||
{
|
|
||||||
self->SetState (&AHereticImp::States[S_IMP_CRASH]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -18,129 +18,6 @@ static FRandom pr_volcano ("VolcanoSet");
|
||||||
static FRandom pr_blast ("VolcanoBlast");
|
static FRandom pr_blast ("VolcanoBlast");
|
||||||
static FRandom pr_impact ("VolcBallImpact");
|
static FRandom pr_impact ("VolcBallImpact");
|
||||||
|
|
||||||
// --- Pods -----------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_PodPain (AActor *);
|
|
||||||
void A_RemovePod (AActor *);
|
|
||||||
void A_MakePod (AActor *);
|
|
||||||
|
|
||||||
// Pod ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
class APod : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (APod, AActor)
|
|
||||||
HAS_OBJECT_POINTERS
|
|
||||||
public:
|
|
||||||
void BeginPlay ();
|
|
||||||
TObjPtr<AActor> Generator;
|
|
||||||
|
|
||||||
void Serialize (FArchive &arc);
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_POINTY_CLASS (APod)
|
|
||||||
DECLARE_POINTER (Generator)
|
|
||||||
END_POINTERS;
|
|
||||||
|
|
||||||
void APod::Serialize (FArchive &arc)
|
|
||||||
{
|
|
||||||
Super::Serialize (arc);
|
|
||||||
arc << Generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
FState APod::States[] =
|
|
||||||
{
|
|
||||||
#define S_POD_WAIT 0
|
|
||||||
S_NORMAL (PPOD, 'A', 10, NULL , &States[S_POD_WAIT+0]),
|
|
||||||
|
|
||||||
#define S_POD_PAIN (S_POD_WAIT+1)
|
|
||||||
S_NORMAL (PPOD, 'B', 14, A_PodPain , &States[S_POD_WAIT+0]),
|
|
||||||
|
|
||||||
#define S_POD_DIE (S_POD_PAIN+1)
|
|
||||||
S_BRIGHT (PPOD, 'C', 5, A_RemovePod , &States[S_POD_DIE+1]),
|
|
||||||
S_BRIGHT (PPOD, 'D', 5, A_Scream , &States[S_POD_DIE+2]),
|
|
||||||
S_BRIGHT (PPOD, 'E', 5, A_Explode , &States[S_POD_DIE+3]),
|
|
||||||
S_BRIGHT (PPOD, 'F', 10, NULL , &AActor::States[S_FREETARGMOBJ]),
|
|
||||||
|
|
||||||
#define S_POD_GROW (S_POD_DIE+4)
|
|
||||||
S_NORMAL (PPOD, 'I', 3, NULL , &States[S_POD_GROW+1]),
|
|
||||||
S_NORMAL (PPOD, 'J', 3, NULL , &States[S_POD_GROW+2]),
|
|
||||||
S_NORMAL (PPOD, 'K', 3, NULL , &States[S_POD_GROW+3]),
|
|
||||||
S_NORMAL (PPOD, 'L', 3, NULL , &States[S_POD_GROW+4]),
|
|
||||||
S_NORMAL (PPOD, 'M', 3, NULL , &States[S_POD_GROW+5]),
|
|
||||||
S_NORMAL (PPOD, 'N', 3, NULL , &States[S_POD_GROW+6]),
|
|
||||||
S_NORMAL (PPOD, 'O', 3, NULL , &States[S_POD_GROW+7]),
|
|
||||||
S_NORMAL (PPOD, 'P', 3, NULL , &States[S_POD_WAIT+0])
|
|
||||||
};
|
|
||||||
|
|
||||||
BEGIN_DEFAULTS (APod, Heretic, 2035, 125)
|
|
||||||
PROP_SpawnHealth (45)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (54)
|
|
||||||
PROP_PainChance (255)
|
|
||||||
PROP_Flags (MF_SOLID|MF_NOBLOOD|MF_SHOOTABLE|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_WINDTHRUST|MF2_PUSHABLE|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_NOBLOCKMONST|MF3_DONTGIB)
|
|
||||||
PROP_Flags5 (MF5_OLDRADIUSDMG)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_POD_WAIT)
|
|
||||||
PROP_PainState (S_POD_PAIN)
|
|
||||||
PROP_DeathState (S_POD_DIE)
|
|
||||||
|
|
||||||
PROP_DeathSound ("world/podexplode")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void APod::BeginPlay ()
|
|
||||||
{
|
|
||||||
Super::BeginPlay ();
|
|
||||||
Generator = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pod goo (falls from pod when damaged) ------------------------------------
|
|
||||||
|
|
||||||
class APodGoo : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (APodGoo, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState APodGoo::States[] =
|
|
||||||
{
|
|
||||||
#define S_PODGOO 0
|
|
||||||
S_NORMAL (PPOD, 'G', 8, NULL , &States[S_PODGOO+1]),
|
|
||||||
S_NORMAL (PPOD, 'H', 8, NULL , &States[S_PODGOO+0]),
|
|
||||||
|
|
||||||
#define S_PODGOOX (S_PODGOO+2)
|
|
||||||
S_NORMAL (PPOD, 'G', 10, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (APodGoo, Heretic, -1, 0)
|
|
||||||
PROP_RadiusFixed (2)
|
|
||||||
PROP_HeightFixed (4)
|
|
||||||
PROP_Gravity (FRACUNIT/8)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_PODGOO)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Pod generator ------------------------------------------------------------
|
|
||||||
|
|
||||||
class APodGenerator : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (APodGenerator, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState APodGenerator::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (TNT1, 'A', 35, A_MakePod , &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (APodGenerator, Heretic, 43, 126)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// --- Pod action functions -------------------------------------------------
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_PodPain
|
// PROC A_PodPain
|
||||||
|
@ -160,7 +37,7 @@ void A_PodPain (AActor *actor)
|
||||||
}
|
}
|
||||||
for (count = chance > 240 ? 2 : 1; count; count--)
|
for (count = chance > 240 ? 2 : 1; count; count--)
|
||||||
{
|
{
|
||||||
goo = Spawn<APodGoo> (actor->x, actor->y, actor->z + 48*FRACUNIT, ALLOW_REPLACE);
|
goo = Spawn("PodGoo", actor->x, actor->y, actor->z + 48*FRACUNIT, ALLOW_REPLACE);
|
||||||
goo->target = actor;
|
goo->target = actor;
|
||||||
goo->momx = pr_podpain.Random2() << 9;
|
goo->momx = pr_podpain.Random2() << 9;
|
||||||
goo->momy = pr_podpain.Random2() << 9;
|
goo->momy = pr_podpain.Random2() << 9;
|
||||||
|
@ -178,7 +55,7 @@ void A_RemovePod (AActor *actor)
|
||||||
{
|
{
|
||||||
AActor *mo;
|
AActor *mo;
|
||||||
|
|
||||||
if ( (mo = static_cast<APod *>(actor)->Generator) )
|
if ( (mo = actor->master))
|
||||||
{
|
{
|
||||||
if (mo->special1 > 0)
|
if (mo->special1 > 0)
|
||||||
{
|
{
|
||||||
|
@ -197,7 +74,7 @@ void A_RemovePod (AActor *actor)
|
||||||
|
|
||||||
void A_MakePod (AActor *actor)
|
void A_MakePod (AActor *actor)
|
||||||
{
|
{
|
||||||
APod *mo;
|
AActor *mo;
|
||||||
fixed_t x;
|
fixed_t x;
|
||||||
fixed_t y;
|
fixed_t y;
|
||||||
fixed_t z;
|
fixed_t z;
|
||||||
|
@ -209,142 +86,20 @@ void A_MakePod (AActor *actor)
|
||||||
x = actor->x;
|
x = actor->x;
|
||||||
y = actor->y;
|
y = actor->y;
|
||||||
z = actor->z;
|
z = actor->z;
|
||||||
mo = Spawn<APod> (x, y, ONFLOORZ, ALLOW_REPLACE);
|
mo = Spawn("Pod", x, y, ONFLOORZ, ALLOW_REPLACE);
|
||||||
if (!P_CheckPosition (mo, x, y))
|
if (!P_CheckPosition (mo, x, y))
|
||||||
{ // Didn't fit
|
{ // Didn't fit
|
||||||
mo->Destroy ();
|
mo->Destroy ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mo->SetState (&APod::States[S_POD_GROW]);
|
mo->SetState (mo->FindState("Grow"));
|
||||||
P_ThrustMobj (mo, pr_makepod()<<24, (fixed_t)(4.5*FRACUNIT));
|
P_ThrustMobj (mo, pr_makepod()<<24, (fixed_t)(4.5*FRACUNIT));
|
||||||
S_Sound (mo, CHAN_BODY, "world/podgrow", 1, ATTN_IDLE);
|
S_Sound (mo, CHAN_BODY, "world/podgrow", 1, ATTN_IDLE);
|
||||||
actor->special1++; // Increment generated pod count
|
actor->special1++; // Increment generated pod count
|
||||||
mo->Generator = actor; // Link the generator to the pod
|
mo->master = actor; // Link the generator to the pod
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Teleglitter ----------------------------------------------------------
|
|
||||||
|
|
||||||
void A_SpawnTeleGlitter (AActor *);
|
|
||||||
void A_SpawnTeleGlitter2 (AActor *);
|
|
||||||
void A_AccTeleGlitter (AActor *);
|
|
||||||
|
|
||||||
// Teleglitter generator 1 --------------------------------------------------
|
|
||||||
|
|
||||||
class ATeleGlitterGenerator1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ATeleGlitterGenerator1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ATeleGlitterGenerator1::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (TGLT, 'A', 8, A_SpawnTeleGlitter , &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ATeleGlitterGenerator1, Heretic, 74, 166)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Teleglitter generator 2 --------------------------------------------------
|
|
||||||
|
|
||||||
class ATeleGlitterGenerator2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ATeleGlitterGenerator2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ATeleGlitterGenerator2::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (TGLT, 'F', 8, A_SpawnTeleGlitter2 , &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ATeleGlitterGenerator2, Heretic, 52, 167)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Teleglitter 1 ------------------------------------------------------------
|
|
||||||
|
|
||||||
class ATeleGlitter1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ATeleGlitter1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ATeleGlitter1::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (TGLT, 'A', 2, NULL , &States[1]),
|
|
||||||
S_BRIGHT (TGLT, 'B', 2, A_AccTeleGlitter , &States[2]),
|
|
||||||
S_BRIGHT (TGLT, 'C', 2, NULL , &States[3]),
|
|
||||||
S_BRIGHT (TGLT, 'D', 2, A_AccTeleGlitter , &States[4]),
|
|
||||||
S_BRIGHT (TGLT, 'E', 2, NULL , &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ATeleGlitter1, Heretic, -1, 0)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_Damage (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Teleglitter 2 ------------------------------------------------------------
|
|
||||||
|
|
||||||
class ATeleGlitter2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ATeleGlitter2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ATeleGlitter2::States[] =
|
|
||||||
{
|
|
||||||
S_BRIGHT (TGLT, 'F', 2, NULL , &States[1]),
|
|
||||||
S_BRIGHT (TGLT, 'G', 2, A_AccTeleGlitter , &States[2]),
|
|
||||||
S_BRIGHT (TGLT, 'H', 2, NULL , &States[3]),
|
|
||||||
S_BRIGHT (TGLT, 'I', 2, A_AccTeleGlitter , &States[4]),
|
|
||||||
S_BRIGHT (TGLT, 'J', 2, NULL , &States[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ATeleGlitter2, Heretic, -1, 0)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
PROP_Damage (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// --- Teleglitter action functions -----------------------------------------
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_SpawnTeleGlitter
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_SpawnTeleGlitter (AActor *actor)
|
|
||||||
{
|
|
||||||
AActor *mo;
|
|
||||||
fixed_t x = actor->x+((pr_teleg()&31)-16)*FRACUNIT;
|
|
||||||
fixed_t y = actor->y+((pr_teleg()&31)-16)*FRACUNIT;
|
|
||||||
|
|
||||||
mo = Spawn<ATeleGlitter1> (x, y,
|
|
||||||
actor->Sector->floorplane.ZatPoint (actor->x, actor->y), ALLOW_REPLACE);
|
|
||||||
mo->momz = FRACUNIT/4;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_SpawnTeleGlitter2
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_SpawnTeleGlitter2 (AActor *actor)
|
|
||||||
{
|
|
||||||
AActor *mo;
|
|
||||||
fixed_t x = actor->x+((pr_teleg2()&31)-16)*FRACUNIT;
|
|
||||||
fixed_t y = actor->y+((pr_teleg2()&31)-16)*FRACUNIT;
|
|
||||||
|
|
||||||
mo = Spawn<ATeleGlitter2> (x, y,
|
|
||||||
actor->Sector->floorplane.ZatPoint (actor->x, actor->y), ALLOW_REPLACE);
|
|
||||||
mo->momz = FRACUNIT/4;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_AccTeleGlitter
|
// PROC A_AccTeleGlitter
|
||||||
|
@ -359,135 +114,9 @@ void A_AccTeleGlitter (AActor *actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Volcano --------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_VolcanoSet (AActor *);
|
|
||||||
void A_VolcanoBlast (AActor *);
|
|
||||||
void A_VolcBallImpact (AActor *);
|
|
||||||
extern void A_BeastPuff (AActor *);
|
|
||||||
|
|
||||||
// Volcano ------------------------------------------------------------------
|
|
||||||
|
|
||||||
class AVolcano : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AVolcano, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AVolcano::States[] =
|
|
||||||
{
|
|
||||||
S_NORMAL (VLCO, 'A', 350, NULL , &States[1]),
|
|
||||||
S_NORMAL (VLCO, 'A', 35, A_VolcanoSet , &States[2]),
|
|
||||||
S_NORMAL (VLCO, 'B', 3, NULL , &States[3]),
|
|
||||||
S_NORMAL (VLCO, 'C', 3, NULL , &States[4]),
|
|
||||||
S_NORMAL (VLCO, 'D', 3, NULL , &States[5]),
|
|
||||||
S_NORMAL (VLCO, 'B', 3, NULL , &States[6]),
|
|
||||||
S_NORMAL (VLCO, 'C', 3, NULL , &States[7]),
|
|
||||||
S_NORMAL (VLCO, 'D', 3, NULL , &States[8]),
|
|
||||||
S_NORMAL (VLCO, 'E', 10, A_VolcanoBlast , &States[1])
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AVolcano, Heretic, 87, 150)
|
|
||||||
PROP_RadiusFixed (12)
|
|
||||||
PROP_HeightFixed (20)
|
|
||||||
PROP_Flags (MF_SOLID)
|
|
||||||
|
|
||||||
PROP_SpawnState (0)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Volcano blast ------------------------------------------------------------
|
|
||||||
|
|
||||||
class AVolcanoBlast : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AVolcanoBlast, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AVolcanoBlast::States[] =
|
|
||||||
{
|
|
||||||
#define S_VOLCANOBALL 0
|
|
||||||
S_NORMAL (VFBL, 'A', 4, A_BeastPuff , &States[S_VOLCANOBALL+1]),
|
|
||||||
S_NORMAL (VFBL, 'B', 4, A_BeastPuff , &States[S_VOLCANOBALL+0]),
|
|
||||||
|
|
||||||
#define S_VOLCANOBALLX (S_VOLCANOBALL+2)
|
|
||||||
S_NORMAL (XPL1, 'A', 4, A_VolcBallImpact , &States[S_VOLCANOBALLX+1]),
|
|
||||||
S_NORMAL (XPL1, 'B', 4, NULL , &States[S_VOLCANOBALLX+2]),
|
|
||||||
S_NORMAL (XPL1, 'C', 4, NULL , &States[S_VOLCANOBALLX+3]),
|
|
||||||
S_NORMAL (XPL1, 'D', 4, NULL , &States[S_VOLCANOBALLX+4]),
|
|
||||||
S_NORMAL (XPL1, 'E', 4, NULL , &States[S_VOLCANOBALLX+5]),
|
|
||||||
S_NORMAL (XPL1, 'F', 4, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AVolcanoBlast, Heretic, -1, 123)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (8)
|
|
||||||
PROP_SpeedFixed (2)
|
|
||||||
PROP_Damage (2)
|
|
||||||
PROP_DamageType (NAME_Fire)
|
|
||||||
PROP_Gravity (FRACUNIT/8)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_VOLCANOBALL)
|
|
||||||
PROP_DeathState (S_VOLCANOBALLX)
|
|
||||||
|
|
||||||
PROP_DeathSound ("world/volcano/blast")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Volcano T Blast ----------------------------------------------------------
|
|
||||||
|
|
||||||
class AVolcanoTBlast : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AVolcanoTBlast, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AVolcanoTBlast::States[] =
|
|
||||||
{
|
|
||||||
#define S_VOLCANOTBALL 0
|
|
||||||
S_NORMAL (VTFB, 'A', 4, NULL , &States[S_VOLCANOTBALL+1]),
|
|
||||||
S_NORMAL (VTFB, 'B', 4, NULL , &States[S_VOLCANOTBALL+0]),
|
|
||||||
|
|
||||||
#define S_VOLCANOTBALLX (S_VOLCANOTBALL+2)
|
|
||||||
S_NORMAL (SFFI, 'C', 4, NULL , &States[S_VOLCANOTBALLX+1]),
|
|
||||||
S_NORMAL (SFFI, 'B', 4, NULL , &States[S_VOLCANOTBALLX+2]),
|
|
||||||
S_NORMAL (SFFI, 'A', 4, NULL , &States[S_VOLCANOTBALLX+3]),
|
|
||||||
S_NORMAL (SFFI, 'B', 4, NULL , &States[S_VOLCANOTBALLX+4]),
|
|
||||||
S_NORMAL (SFFI, 'C', 4, NULL , &States[S_VOLCANOTBALLX+5]),
|
|
||||||
S_NORMAL (SFFI, 'D', 4, NULL , &States[S_VOLCANOTBALLX+6]),
|
|
||||||
S_NORMAL (SFFI, 'E', 4, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AVolcanoTBlast, Heretic, -1, 124)
|
|
||||||
PROP_RadiusFixed (8)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (2)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_DamageType (NAME_Fire)
|
|
||||||
PROP_Gravity (FRACUNIT/8)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_VOLCANOTBALL)
|
|
||||||
PROP_DeathState (S_VOLCANOTBALLX)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_BeastPuff
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_BeastPuff (AActor *actor)
|
|
||||||
{
|
|
||||||
if (pr_volcano() > 64)
|
|
||||||
{
|
|
||||||
fixed_t x, y, z;
|
|
||||||
|
|
||||||
x = actor->x + (pr_volcano.Random2 () << 10);
|
|
||||||
y = actor->y + (pr_volcano.Random2 () << 10);
|
|
||||||
z = actor->z + (pr_volcano.Random2 () << 10);
|
|
||||||
Spawn ("Puffy", x, y, z, ALLOW_REPLACE);
|
|
||||||
}
|
|
||||||
}//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_VolcanoSet
|
// PROC A_VolcanoSet
|
||||||
//
|
//
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -513,7 +142,7 @@ void A_VolcanoBlast (AActor *volcano)
|
||||||
count = 1 + (pr_blast() % 3);
|
count = 1 + (pr_blast() % 3);
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
blast = Spawn<AVolcanoBlast> (volcano->x, volcano->y,
|
blast = Spawn("VolcanoBlast", volcano->x, volcano->y,
|
||||||
volcano->z + 44*FRACUNIT, ALLOW_REPLACE);
|
volcano->z + 44*FRACUNIT, ALLOW_REPLACE);
|
||||||
blast->target = volcano;
|
blast->target = volcano;
|
||||||
angle = pr_blast () << 24;
|
angle = pr_blast () << 24;
|
||||||
|
@ -549,7 +178,7 @@ void A_VolcBallImpact (AActor *ball)
|
||||||
P_RadiusAttack (ball, ball->target, 25, 25, NAME_Fire, true);
|
P_RadiusAttack (ball, ball->target, 25, 25, NAME_Fire, true);
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
tiny = Spawn<AVolcanoTBlast> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
tiny = Spawn("VolcanoTBlast", ball->x, ball->y, ball->z, ALLOW_REPLACE);
|
||||||
tiny->target = ball;
|
tiny->target = ball;
|
||||||
angle = i*ANG90;
|
angle = i*ANG90;
|
||||||
tiny->angle = angle;
|
tiny->angle = angle;
|
||||||
|
|
|
@ -2229,7 +2229,7 @@ END_DEFAULTS
|
||||||
|
|
||||||
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
|
int AHornRodFX2::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
if (target->IsKindOf (RUNTIME_CLASS (ASorcerer2)) && pr_hrfx2() < 96)
|
if (target->IsKindOf (PClass::FindClass("Sorcerer2")) && pr_hrfx2() < 96)
|
||||||
{ // D'Sparil teleports away
|
{ // D'Sparil teleports away
|
||||||
P_DSparilTeleport (target);
|
P_DSparilTeleport (target);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -2665,7 +2665,7 @@ END_DEFAULTS
|
||||||
|
|
||||||
int APhoenixFX1::DoSpecialDamage (AActor *target, int damage)
|
int APhoenixFX1::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
if (target->IsKindOf (RUNTIME_CLASS (ASorcerer2)) && pr_pfx1() < 96)
|
if (target->IsKindOf (PClass::FindClass("Sorcerer2")) && pr_hrfx2() < 96)
|
||||||
{ // D'Sparil teleports away
|
{ // D'Sparil teleports away
|
||||||
P_DSparilTeleport (target);
|
P_DSparilTeleport (target);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -11,235 +11,14 @@ static FRandom pr_foo ("WhirlwindDamage");
|
||||||
static FRandom pr_atk ("LichAttack");
|
static FRandom pr_atk ("LichAttack");
|
||||||
static FRandom pr_seek ("WhirlwindSeek");
|
static FRandom pr_seek ("WhirlwindSeek");
|
||||||
|
|
||||||
void A_LichAttack (AActor *);
|
|
||||||
void A_LichIceImpact (AActor *);
|
|
||||||
void A_LichFireGrow (AActor *);
|
|
||||||
void A_WhirlwindSeek (AActor *);
|
|
||||||
|
|
||||||
// Ironlich -----------------------------------------------------------------
|
|
||||||
|
|
||||||
class AIronlich : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AIronlich, AActor)
|
|
||||||
public:
|
|
||||||
void NoBlockingSet ();
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AIronlich::States[] =
|
|
||||||
{
|
|
||||||
#define S_HEAD_LOOK 0
|
|
||||||
S_NORMAL (LICH, 'A', 10, A_Look , &States[S_HEAD_LOOK]),
|
|
||||||
|
|
||||||
#define S_HEAD_FLOAT (S_HEAD_LOOK+1)
|
|
||||||
S_NORMAL (LICH, 'A', 4, A_Chase , &States[S_HEAD_FLOAT]),
|
|
||||||
|
|
||||||
#define S_HEAD_ATK (S_HEAD_FLOAT+1)
|
|
||||||
S_NORMAL (LICH, 'A', 5, A_FaceTarget , &States[S_HEAD_ATK+1]),
|
|
||||||
S_NORMAL (LICH, 'B', 20, A_LichAttack , &States[S_HEAD_FLOAT]),
|
|
||||||
|
|
||||||
#define S_HEAD_PAIN (S_HEAD_ATK+2)
|
|
||||||
S_NORMAL (LICH, 'A', 4, NULL , &States[S_HEAD_PAIN+1]),
|
|
||||||
S_NORMAL (LICH, 'A', 4, A_Pain , &States[S_HEAD_FLOAT]),
|
|
||||||
|
|
||||||
#define S_HEAD_DIE (S_HEAD_PAIN+2)
|
|
||||||
S_NORMAL (LICH, 'C', 7, NULL , &States[S_HEAD_DIE+1]),
|
|
||||||
S_NORMAL (LICH, 'D', 7, A_Scream , &States[S_HEAD_DIE+2]),
|
|
||||||
S_NORMAL (LICH, 'E', 7, NULL , &States[S_HEAD_DIE+3]),
|
|
||||||
S_NORMAL (LICH, 'F', 7, NULL , &States[S_HEAD_DIE+4]),
|
|
||||||
S_NORMAL (LICH, 'G', 7, A_NoBlocking , &States[S_HEAD_DIE+5]),
|
|
||||||
S_NORMAL (LICH, 'H', 7, NULL , &States[S_HEAD_DIE+6]),
|
|
||||||
S_NORMAL (LICH, 'I', -1, A_BossDeath , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AIronlich, Heretic, 6, 20)
|
|
||||||
PROP_SpawnHealth (700)
|
|
||||||
PROP_RadiusFixed (40)
|
|
||||||
PROP_HeightFixed (72)
|
|
||||||
PROP_Mass (325)
|
|
||||||
PROP_SpeedFixed (6)
|
|
||||||
PROP_PainChance (32)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL)
|
|
||||||
PROP_Flags3 (MF3_DONTMORPH|MF3_DONTSQUASH)
|
|
||||||
PROP_Flags4 (MF4_BOSSDEATH)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_HEAD_LOOK)
|
|
||||||
PROP_SeeState (S_HEAD_FLOAT)
|
|
||||||
PROP_PainState (S_HEAD_PAIN)
|
|
||||||
PROP_MissileState (S_HEAD_ATK)
|
|
||||||
PROP_DeathState (S_HEAD_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("ironlich/sight")
|
|
||||||
PROP_AttackSound ("ironlich/attack")
|
|
||||||
PROP_PainSound ("ironlich/pain")
|
|
||||||
PROP_DeathSound ("ironlich/death")
|
|
||||||
PROP_ActiveSound ("ironlich/active")
|
|
||||||
PROP_Obituary("$OB_IRONLICH")
|
|
||||||
PROP_HitObituary("$OB_IRONLICHHIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void AIronlich::NoBlockingSet ()
|
|
||||||
{
|
|
||||||
P_DropItem (this, "BlasterAmmo", 10, 84);
|
|
||||||
P_DropItem (this, "ArtiEgg", 0, 51);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head FX 1 ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class AHeadFX1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHeadFX1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHeadFX1::States[] =
|
|
||||||
{
|
|
||||||
#define S_HEADFX1 0
|
|
||||||
S_BRIGHT (FX05, 'A', 6, NULL , &States[S_HEADFX1+1]),
|
|
||||||
S_BRIGHT (FX05, 'B', 6, NULL , &States[S_HEADFX1+2]),
|
|
||||||
S_BRIGHT (FX05, 'C', 6, NULL , &States[S_HEADFX1+0]),
|
|
||||||
|
|
||||||
#define S_HEADFXI1 (S_HEADFX1+3)
|
|
||||||
S_BRIGHT (FX05, 'D', 5, A_LichIceImpact , &States[S_HEADFXI1+1]),
|
|
||||||
S_BRIGHT (FX05, 'E', 5, NULL , &States[S_HEADFXI1+2]),
|
|
||||||
S_BRIGHT (FX05, 'F', 5, NULL , &States[S_HEADFXI1+3]),
|
|
||||||
S_BRIGHT (FX05, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHeadFX1, Heretic, -1, 164)
|
|
||||||
PROP_RadiusFixed (12)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (13)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_THRUGHOST)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_HEADFX1)
|
|
||||||
PROP_DeathState (S_HEADFXI1)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (HeadFX1, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (AHeadFX1, 13*FRACUNIT, 20*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head FX 2 ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class AHeadFX2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHeadFX2, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHeadFX2::States[] =
|
|
||||||
{
|
|
||||||
#define S_HEADFX2 0
|
|
||||||
S_BRIGHT (FX05, 'H', 6, NULL , &States[S_HEADFX2+1]),
|
|
||||||
S_BRIGHT (FX05, 'I', 6, NULL , &States[S_HEADFX2+2]),
|
|
||||||
S_BRIGHT (FX05, 'J', 6, NULL , &States[S_HEADFX2+0]),
|
|
||||||
|
|
||||||
#define S_HEADFXI2 (S_HEADFX2+3)
|
|
||||||
S_BRIGHT (FX05, 'D', 5, NULL , &States[S_HEADFXI2+1]),
|
|
||||||
S_BRIGHT (FX05, 'E', 5, NULL , &States[S_HEADFXI2+2]),
|
|
||||||
S_BRIGHT (FX05, 'F', 5, NULL , &States[S_HEADFXI2+3]),
|
|
||||||
S_BRIGHT (FX05, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHeadFX2, Heretic, -1, 0)
|
|
||||||
PROP_RadiusFixed (12)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (8)
|
|
||||||
PROP_Damage (3)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_HEADFX2)
|
|
||||||
PROP_DeathState (S_HEADFXI2)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Head FX 3 ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class AHeadFX3 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AHeadFX3, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AHeadFX3::States[] =
|
|
||||||
{
|
|
||||||
#define S_HEADFX3 0
|
|
||||||
S_BRIGHT (FX06, 'A', 4, A_LichFireGrow , &States[S_HEADFX3+1]),
|
|
||||||
S_BRIGHT (FX06, 'B', 4, A_LichFireGrow , &States[S_HEADFX3+2]),
|
|
||||||
S_BRIGHT (FX06, 'C', 4, A_LichFireGrow , &States[S_HEADFX3+0]),
|
|
||||||
S_BRIGHT (FX06, 'A', 5, NULL , &States[S_HEADFX3+4]),
|
|
||||||
S_BRIGHT (FX06, 'B', 5, NULL , &States[S_HEADFX3+5]),
|
|
||||||
S_BRIGHT (FX06, 'C', 5, NULL , &States[S_HEADFX3+3]),
|
|
||||||
|
|
||||||
#define S_HEADFXI3 (S_HEADFX3+6)
|
|
||||||
S_BRIGHT (FX06, 'D', 5, NULL , &States[S_HEADFXI3+1]),
|
|
||||||
S_BRIGHT (FX06, 'E', 5, NULL , &States[S_HEADFXI3+2]),
|
|
||||||
S_BRIGHT (FX06, 'F', 5, NULL , &States[S_HEADFXI3+3]),
|
|
||||||
S_BRIGHT (FX06, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AHeadFX3, Heretic, -1, 0)
|
|
||||||
PROP_RadiusFixed (14)
|
|
||||||
PROP_HeightFixed (12)
|
|
||||||
PROP_SpeedFixed (10)
|
|
||||||
PROP_Damage (5)
|
|
||||||
PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_HEADFX3)
|
|
||||||
PROP_DeathState (S_HEADFXI3)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (HeadFX3, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (AHeadFX3, 10*FRACUNIT, 18*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Whirlwind ----------------------------------------------------------------
|
|
||||||
|
|
||||||
class AWhirlwind : public AActor
|
class AWhirlwind : public AActor
|
||||||
{
|
{
|
||||||
DECLARE_ACTOR (AWhirlwind, AActor)
|
DECLARE_CLASS (AWhirlwind, AActor)
|
||||||
public:
|
public:
|
||||||
int DoSpecialDamage (AActor *target, int damage);
|
int DoSpecialDamage (AActor *target, int damage);
|
||||||
};
|
};
|
||||||
|
|
||||||
FState AWhirlwind::States[] =
|
IMPLEMENT_CLASS(AWhirlwind)
|
||||||
{
|
|
||||||
#define S_HEADFX4 0
|
|
||||||
S_NORMAL (FX07, 'D', 3, NULL , &States[S_HEADFX4+1]),
|
|
||||||
S_NORMAL (FX07, 'E', 3, NULL , &States[S_HEADFX4+2]),
|
|
||||||
S_NORMAL (FX07, 'F', 3, NULL , &States[S_HEADFX4+3]),
|
|
||||||
S_NORMAL (FX07, 'G', 3, NULL , &States[S_HEADFX4+4]),
|
|
||||||
S_NORMAL (FX07, 'A', 3, A_WhirlwindSeek , &States[S_HEADFX4+5]),
|
|
||||||
S_NORMAL (FX07, 'B', 3, A_WhirlwindSeek , &States[S_HEADFX4+6]),
|
|
||||||
S_NORMAL (FX07, 'C', 3, A_WhirlwindSeek , &States[S_HEADFX4+4]),
|
|
||||||
|
|
||||||
#define S_HEADFXI4 (S_HEADFX4+7)
|
|
||||||
S_NORMAL (FX07, 'G', 4, NULL , &States[S_HEADFXI4+1]),
|
|
||||||
S_NORMAL (FX07, 'F', 4, NULL , &States[S_HEADFXI4+2]),
|
|
||||||
S_NORMAL (FX07, 'E', 4, NULL , &States[S_HEADFXI4+3]),
|
|
||||||
S_NORMAL (FX07, 'D', 4, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AWhirlwind, Heretic, -1, 165)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (74)
|
|
||||||
PROP_SpeedFixed (10)
|
|
||||||
PROP_Damage (1)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT|MF2_SEEKERMISSILE)
|
|
||||||
PROP_Flags3 (MF3_EXPLOCOUNT)
|
|
||||||
PROP_RenderStyle (STYLE_Translucent)
|
|
||||||
PROP_Alpha (HR_SHADOW)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_HEADFX4)
|
|
||||||
PROP_DeathState (S_HEADFXI4)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
int AWhirlwind::DoSpecialDamage (AActor *target, int damage)
|
int AWhirlwind::DoSpecialDamage (AActor *target, int damage)
|
||||||
{
|
{
|
||||||
|
@ -309,18 +88,18 @@ void A_LichAttack (AActor *actor)
|
||||||
randAttack = pr_atk ();
|
randAttack = pr_atk ();
|
||||||
if (randAttack < atkResolve1[dist])
|
if (randAttack < atkResolve1[dist])
|
||||||
{ // Ice ball
|
{ // Ice ball
|
||||||
P_SpawnMissile (actor, target, RUNTIME_CLASS(AHeadFX1));
|
P_SpawnMissile (actor, target, PClass::FindClass("HeadFX1"));
|
||||||
S_Sound (actor, CHAN_BODY, "ironlich/attack2", 1, ATTN_NORM);
|
S_Sound (actor, CHAN_BODY, "ironlich/attack2", 1, ATTN_NORM);
|
||||||
}
|
}
|
||||||
else if (randAttack < atkResolve2[dist])
|
else if (randAttack < atkResolve2[dist])
|
||||||
{ // Fire column
|
{ // Fire column
|
||||||
baseFire = P_SpawnMissile (actor, target, RUNTIME_CLASS(AHeadFX3));
|
baseFire = P_SpawnMissile (actor, target, PClass::FindClass("HeadFX3"));
|
||||||
if (baseFire != NULL)
|
if (baseFire != NULL)
|
||||||
{
|
{
|
||||||
baseFire->SetState (&AHeadFX3::States[S_HEADFX3+3]); // Don't grow
|
baseFire->SetState (baseFire->FindState("NoGrow"));
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
fire = Spawn<AHeadFX3> (baseFire->x, baseFire->y,
|
fire = Spawn("HeadFX3", baseFire->x, baseFire->y,
|
||||||
baseFire->z, ALLOW_REPLACE);
|
baseFire->z, ALLOW_REPLACE);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
|
@ -394,7 +173,7 @@ void A_LichIceImpact (AActor *ice)
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
shard = Spawn<AHeadFX2> (ice->x, ice->y, ice->z, ALLOW_REPLACE);
|
shard = Spawn("HeadFX2", ice->x, ice->y, ice->z, ALLOW_REPLACE);
|
||||||
angle = i*ANG45;
|
angle = i*ANG45;
|
||||||
shard->target = ice->target;
|
shard->target = ice->target;
|
||||||
shard->angle = angle;
|
shard->angle = angle;
|
||||||
|
@ -419,7 +198,7 @@ void A_LichFireGrow (AActor *fire)
|
||||||
if (fire->health == 0)
|
if (fire->health == 0)
|
||||||
{
|
{
|
||||||
fire->Damage = fire->GetDefault()->Damage;
|
fire->Damage = fire->GetDefault()->Damage;
|
||||||
fire->SetState (&AHeadFX3::States[S_HEADFX3+3]);
|
fire->SetState (fire->FindState("NoGrow"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,170 +11,6 @@
|
||||||
static FRandom pr_dripblood ("DripBlood");
|
static FRandom pr_dripblood ("DripBlood");
|
||||||
static FRandom pr_knightatk ("KnightAttack");
|
static FRandom pr_knightatk ("KnightAttack");
|
||||||
|
|
||||||
void A_KnightAttack (AActor *);
|
|
||||||
void A_DripBlood (AActor *);
|
|
||||||
void A_AxeSound (AActor *);
|
|
||||||
|
|
||||||
// Knight -------------------------------------------------------------------
|
|
||||||
|
|
||||||
class AKnight : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AKnight, AActor)
|
|
||||||
public:
|
|
||||||
void NoBlockingSet ();
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AKnight::States[] =
|
|
||||||
{
|
|
||||||
#define S_KNIGHT_STND 0
|
|
||||||
S_NORMAL (KNIG, 'A', 10, A_Look , &States[S_KNIGHT_STND+1]),
|
|
||||||
S_NORMAL (KNIG, 'B', 10, A_Look , &States[S_KNIGHT_STND+0]),
|
|
||||||
|
|
||||||
#define S_KNIGHT_WALK (S_KNIGHT_STND+2)
|
|
||||||
S_NORMAL (KNIG, 'A', 4, A_Chase , &States[S_KNIGHT_WALK+1]),
|
|
||||||
S_NORMAL (KNIG, 'B', 4, A_Chase , &States[S_KNIGHT_WALK+2]),
|
|
||||||
S_NORMAL (KNIG, 'C', 4, A_Chase , &States[S_KNIGHT_WALK+3]),
|
|
||||||
S_NORMAL (KNIG, 'D', 4, A_Chase , &States[S_KNIGHT_WALK+0]),
|
|
||||||
|
|
||||||
#define S_KNIGHT_ATK (S_KNIGHT_WALK+4)
|
|
||||||
S_NORMAL (KNIG, 'E', 10, A_FaceTarget , &States[S_KNIGHT_ATK+1]),
|
|
||||||
S_NORMAL (KNIG, 'F', 8, A_FaceTarget , &States[S_KNIGHT_ATK+2]),
|
|
||||||
S_NORMAL (KNIG, 'G', 8, A_KnightAttack , &States[S_KNIGHT_ATK+3]),
|
|
||||||
S_NORMAL (KNIG, 'E', 10, A_FaceTarget , &States[S_KNIGHT_ATK+4]),
|
|
||||||
S_NORMAL (KNIG, 'F', 8, A_FaceTarget , &States[S_KNIGHT_ATK+5]),
|
|
||||||
S_NORMAL (KNIG, 'G', 8, A_KnightAttack , &States[S_KNIGHT_WALK+0]),
|
|
||||||
|
|
||||||
#define S_KNIGHT_PAIN (S_KNIGHT_ATK+6)
|
|
||||||
S_NORMAL (KNIG, 'H', 3, NULL , &States[S_KNIGHT_PAIN+1]),
|
|
||||||
S_NORMAL (KNIG, 'H', 3, A_Pain , &States[S_KNIGHT_WALK+0]),
|
|
||||||
|
|
||||||
#define S_KNIGHT_DIE (S_KNIGHT_PAIN+2)
|
|
||||||
S_NORMAL (KNIG, 'I', 6, NULL , &States[S_KNIGHT_DIE+1]),
|
|
||||||
S_NORMAL (KNIG, 'J', 6, A_Scream , &States[S_KNIGHT_DIE+2]),
|
|
||||||
S_NORMAL (KNIG, 'K', 6, NULL , &States[S_KNIGHT_DIE+3]),
|
|
||||||
S_NORMAL (KNIG, 'L', 6, A_NoBlocking , &States[S_KNIGHT_DIE+4]),
|
|
||||||
S_NORMAL (KNIG, 'M', 6, NULL , &States[S_KNIGHT_DIE+5]),
|
|
||||||
S_NORMAL (KNIG, 'N', 6, NULL , &States[S_KNIGHT_DIE+6]),
|
|
||||||
S_NORMAL (KNIG, 'O', -1, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AKnight, Heretic, 64, 6)
|
|
||||||
PROP_SpawnHealth (200)
|
|
||||||
PROP_RadiusFixed (24)
|
|
||||||
PROP_HeightFixed (78)
|
|
||||||
PROP_Mass (150)
|
|
||||||
PROP_SpeedFixed (12)
|
|
||||||
PROP_PainChance (100)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_KNIGHT_STND)
|
|
||||||
PROP_SeeState (S_KNIGHT_WALK)
|
|
||||||
PROP_PainState (S_KNIGHT_PAIN)
|
|
||||||
PROP_MeleeState (S_KNIGHT_ATK)
|
|
||||||
PROP_MissileState (S_KNIGHT_ATK)
|
|
||||||
PROP_DeathState (S_KNIGHT_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("hknight/sight")
|
|
||||||
PROP_AttackSound ("hknight/attack")
|
|
||||||
PROP_PainSound ("hknight/pain")
|
|
||||||
PROP_DeathSound ("hknight/death")
|
|
||||||
PROP_ActiveSound ("hknight/active")
|
|
||||||
PROP_Obituary("$OB_BONEKNIGHT")
|
|
||||||
PROP_HitObituary("$OB_BONEKNIGHTHIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void AKnight::NoBlockingSet ()
|
|
||||||
{
|
|
||||||
P_DropItem (this, "CrossbowAmmo", 5, 84);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Knight ghost -------------------------------------------------------------
|
|
||||||
|
|
||||||
class AKnightGhost : public AKnight
|
|
||||||
{
|
|
||||||
DECLARE_STATELESS_ACTOR (AKnightGhost, AKnight)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (AKnightGhost, Heretic, 65, 129)
|
|
||||||
PROP_FlagsSet (MF_SHADOW)
|
|
||||||
PROP_Flags3 (MF3_GHOST)
|
|
||||||
PROP_RenderStyle (STYLE_Translucent)
|
|
||||||
PROP_Alpha (HR_SHADOW)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
// Knight axe ---------------------------------------------------------------
|
|
||||||
|
|
||||||
class AKnightAxe : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AKnightAxe, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AKnightAxe::States[] =
|
|
||||||
{
|
|
||||||
#define S_SPINAXE 0
|
|
||||||
S_BRIGHT (SPAX, 'A', 3, A_AxeSound , &States[S_SPINAXE+1]),
|
|
||||||
S_BRIGHT (SPAX, 'B', 3, NULL , &States[S_SPINAXE+2]),
|
|
||||||
S_BRIGHT (SPAX, 'C', 3, NULL , &States[S_SPINAXE+0]),
|
|
||||||
|
|
||||||
#define S_SPINAXEX (S_SPINAXE+3)
|
|
||||||
S_BRIGHT (SPAX, 'D', 6, NULL , &States[S_SPINAXEX+1]),
|
|
||||||
S_BRIGHT (SPAX, 'E', 6, NULL , &States[S_SPINAXEX+2]),
|
|
||||||
S_BRIGHT (SPAX, 'F', 6, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AKnightAxe, Heretic, -1, 127)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (8)
|
|
||||||
PROP_SpeedFixed (9)
|
|
||||||
PROP_Damage (2)
|
|
||||||
PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_THRUGHOST)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_SPINAXE)
|
|
||||||
PROP_DeathState (S_SPINAXEX)
|
|
||||||
|
|
||||||
PROP_DeathSound ("hknight/hit")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (KnightAxe, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (AKnightAxe, 9*FRACUNIT, 18*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Red axe ------------------------------------------------------------------
|
|
||||||
|
|
||||||
class ARedAxe : public AKnightAxe
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (ARedAxe, AKnightAxe)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState ARedAxe::States[] =
|
|
||||||
{
|
|
||||||
#define S_REDAXE 0
|
|
||||||
S_BRIGHT (RAXE, 'A', 5, A_DripBlood , &States[S_REDAXE+1]),
|
|
||||||
S_BRIGHT (RAXE, 'B', 5, A_DripBlood , &States[S_REDAXE+0]),
|
|
||||||
|
|
||||||
#define S_REDAXEX (S_REDAXE+2)
|
|
||||||
S_BRIGHT (RAXE, 'C', 6, NULL , &States[S_REDAXEX+1]),
|
|
||||||
S_BRIGHT (RAXE, 'D', 6, NULL , &States[S_REDAXEX+2]),
|
|
||||||
S_BRIGHT (RAXE, 'E', 6, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (ARedAxe, Heretic, -1, 128)
|
|
||||||
PROP_Damage (7)
|
|
||||||
PROP_FlagsSet (MF_NOBLOCKMAP)
|
|
||||||
PROP_Flags2Clear (MF2_WINDTHRUST)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_REDAXE)
|
|
||||||
PROP_DeathState (S_REDAXEX)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (RedAxe, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (ARedAxe, 9*FRACUNIT, 18*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_DripBlood
|
// PROC A_DripBlood
|
||||||
|
@ -218,20 +54,10 @@ void A_KnightAttack (AActor *actor)
|
||||||
S_Sound (actor, CHAN_BODY, actor->AttackSound, 1, ATTN_NORM);
|
S_Sound (actor, CHAN_BODY, actor->AttackSound, 1, ATTN_NORM);
|
||||||
if (actor->flags & MF_SHADOW || pr_knightatk () < 40)
|
if (actor->flags & MF_SHADOW || pr_knightatk () < 40)
|
||||||
{ // Red axe
|
{ // Red axe
|
||||||
P_SpawnMissileZ (actor, actor->z + 36*FRACUNIT, actor->target, RUNTIME_CLASS(ARedAxe));
|
P_SpawnMissileZ (actor, actor->z + 36*FRACUNIT, actor->target, PClass::FindClass("RedAxe"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Green axe
|
// Green axe
|
||||||
P_SpawnMissileZ (actor, actor->z + 36*FRACUNIT, actor->target, RUNTIME_CLASS(AKnightAxe));
|
P_SpawnMissileZ (actor, actor->z + 36*FRACUNIT, actor->target, PClass::FindClass("KnightAxe"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_AxeSound
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void A_AxeSound (AActor *actor)
|
|
||||||
{
|
|
||||||
S_Sound (actor, CHAN_BODY, "hknight/axewhoosh", 1, ATTN_NORM);
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,126 +10,6 @@
|
||||||
|
|
||||||
static FRandom pr_wizatk3 ("WizAtk3");
|
static FRandom pr_wizatk3 ("WizAtk3");
|
||||||
|
|
||||||
void A_WizAtk1 (AActor *);
|
|
||||||
void A_WizAtk2 (AActor *);
|
|
||||||
void A_WizAtk3 (AActor *);
|
|
||||||
void A_GhostOff (AActor *);
|
|
||||||
|
|
||||||
// Class definitions --------------------------------------------------------
|
|
||||||
|
|
||||||
FState AWizard::States[] =
|
|
||||||
{
|
|
||||||
#define S_WIZARD_LOOK 0
|
|
||||||
S_NORMAL (WZRD, 'A', 10, A_Look , &States[S_WIZARD_LOOK+1]),
|
|
||||||
S_NORMAL (WZRD, 'B', 10, A_Look , &States[S_WIZARD_LOOK+0]),
|
|
||||||
|
|
||||||
#define S_WIZARD_WALK (S_WIZARD_LOOK+2)
|
|
||||||
S_NORMAL (WZRD, 'A', 3, A_Chase , &States[S_WIZARD_WALK+1]),
|
|
||||||
S_NORMAL (WZRD, 'A', 4, A_Chase , &States[S_WIZARD_WALK+2]),
|
|
||||||
S_NORMAL (WZRD, 'A', 3, A_Chase , &States[S_WIZARD_WALK+3]),
|
|
||||||
S_NORMAL (WZRD, 'A', 4, A_Chase , &States[S_WIZARD_WALK+4]),
|
|
||||||
S_NORMAL (WZRD, 'B', 3, A_Chase , &States[S_WIZARD_WALK+5]),
|
|
||||||
S_NORMAL (WZRD, 'B', 4, A_Chase , &States[S_WIZARD_WALK+6]),
|
|
||||||
S_NORMAL (WZRD, 'B', 3, A_Chase , &States[S_WIZARD_WALK+7]),
|
|
||||||
S_NORMAL (WZRD, 'B', 4, A_Chase , &States[S_WIZARD_WALK+0]),
|
|
||||||
|
|
||||||
#define S_WIZARD_ATK (S_WIZARD_WALK+8)
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk1 , &States[S_WIZARD_ATK+1]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk2 , &States[S_WIZARD_ATK+2]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk1 , &States[S_WIZARD_ATK+3]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk2 , &States[S_WIZARD_ATK+4]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk1 , &States[S_WIZARD_ATK+5]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk2 , &States[S_WIZARD_ATK+6]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk1 , &States[S_WIZARD_ATK+7]),
|
|
||||||
S_NORMAL (WZRD, 'C', 4, A_WizAtk2 , &States[S_WIZARD_ATK+8]),
|
|
||||||
S_NORMAL (WZRD, 'D', 12, A_WizAtk3 , &States[S_WIZARD_WALK+0]),
|
|
||||||
|
|
||||||
#define S_WIZARD_PAIN (S_WIZARD_ATK+9)
|
|
||||||
S_NORMAL (WZRD, 'E', 3, A_GhostOff , &States[S_WIZARD_PAIN+1]),
|
|
||||||
S_NORMAL (WZRD, 'E', 3, A_Pain , &States[S_WIZARD_WALK+0]),
|
|
||||||
|
|
||||||
#define S_WIZARD_DIE (S_WIZARD_PAIN+2)
|
|
||||||
S_NORMAL (WZRD, 'F', 6, A_GhostOff , &States[S_WIZARD_DIE+1]),
|
|
||||||
S_NORMAL (WZRD, 'G', 6, A_Scream , &States[S_WIZARD_DIE+2]),
|
|
||||||
S_NORMAL (WZRD, 'H', 6, NULL , &States[S_WIZARD_DIE+3]),
|
|
||||||
S_NORMAL (WZRD, 'I', 6, NULL , &States[S_WIZARD_DIE+4]),
|
|
||||||
S_NORMAL (WZRD, 'J', 6, A_NoBlocking , &States[S_WIZARD_DIE+5]),
|
|
||||||
S_NORMAL (WZRD, 'K', 6, NULL , &States[S_WIZARD_DIE+6]),
|
|
||||||
S_NORMAL (WZRD, 'L', 6, NULL , &States[S_WIZARD_DIE+7]),
|
|
||||||
S_NORMAL (WZRD, 'M', -1, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AWizard, Heretic, 15, 19)
|
|
||||||
PROP_SpawnHealth (180)
|
|
||||||
PROP_RadiusFixed (16)
|
|
||||||
PROP_HeightFixed (68)
|
|
||||||
PROP_Mass (100)
|
|
||||||
PROP_SpeedFixed (12)
|
|
||||||
PROP_PainChance (64)
|
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL)
|
|
||||||
PROP_Flags3 (MF3_DONTOVERLAP)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_WIZARD_LOOK)
|
|
||||||
PROP_SeeState (S_WIZARD_WALK)
|
|
||||||
PROP_PainState (S_WIZARD_PAIN)
|
|
||||||
PROP_MissileState (S_WIZARD_ATK)
|
|
||||||
PROP_DeathState (S_WIZARD_DIE)
|
|
||||||
|
|
||||||
PROP_SeeSound ("wizard/sight")
|
|
||||||
PROP_AttackSound ("wizard/attack")
|
|
||||||
PROP_PainSound ("wizard/pain")
|
|
||||||
PROP_DeathSound ("wizard/death")
|
|
||||||
PROP_ActiveSound ("wizard/active")
|
|
||||||
PROP_Obituary("$OB_WIZARD")
|
|
||||||
PROP_HitObituary("$OB_WIZARDHIT")
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
void AWizard::NoBlockingSet ()
|
|
||||||
{
|
|
||||||
P_DropItem (this, "BlasterAmmo", 10, 84);
|
|
||||||
P_DropItem (this, "ArtiTomeOfPower", 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
class AWizardFX1 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_ACTOR (AWizardFX1, AActor)
|
|
||||||
};
|
|
||||||
|
|
||||||
FState AWizardFX1::States[] =
|
|
||||||
{
|
|
||||||
#define S_WIZFX1 0
|
|
||||||
S_BRIGHT (FX11, 'A', 6, NULL , &States[S_WIZFX1+1]),
|
|
||||||
S_BRIGHT (FX11, 'B', 6, NULL , &States[S_WIZFX1+0]),
|
|
||||||
|
|
||||||
#define S_WIZFXI1 (S_WIZFX1+2)
|
|
||||||
S_BRIGHT (FX11, 'C', 5, NULL , &States[S_WIZFXI1+1]),
|
|
||||||
S_BRIGHT (FX11, 'D', 5, NULL , &States[S_WIZFXI1+2]),
|
|
||||||
S_BRIGHT (FX11, 'E', 5, NULL , &States[S_WIZFXI1+3]),
|
|
||||||
S_BRIGHT (FX11, 'F', 5, NULL , &States[S_WIZFXI1+4]),
|
|
||||||
S_BRIGHT (FX11, 'G', 5, NULL , NULL)
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ACTOR (AWizardFX1, Heretic, -1, 140)
|
|
||||||
PROP_RadiusFixed (10)
|
|
||||||
PROP_HeightFixed (6)
|
|
||||||
PROP_SpeedFixed (18)
|
|
||||||
PROP_Damage (3)
|
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
|
|
||||||
PROP_Flags2 (MF2_NOTELEPORT)
|
|
||||||
PROP_RenderStyle (STYLE_Add)
|
|
||||||
|
|
||||||
PROP_SpawnState (S_WIZFX1)
|
|
||||||
PROP_DeathState (S_WIZFXI1)
|
|
||||||
END_DEFAULTS
|
|
||||||
|
|
||||||
AT_SPEED_SET (WizardFX1, speed)
|
|
||||||
{
|
|
||||||
SimpleSpeedSetter (AWizardFX1, 18*FRACUNIT, 24*FRACUNIT, speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Action functions -----------------------------------------------------
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_GhostOff
|
// PROC A_GhostOff
|
||||||
|
@ -191,10 +71,11 @@ void A_WizAtk3 (AActor *actor)
|
||||||
P_TraceBleed (damage, actor->target, actor);
|
P_TraceBleed (damage, actor->target, actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(AWizardFX1));
|
const PClass *fx = PClass::FindClass("WizardFX1");
|
||||||
|
mo = P_SpawnMissile (actor, actor->target, fx);
|
||||||
if (mo != NULL)
|
if (mo != NULL)
|
||||||
{
|
{
|
||||||
P_SpawnMissileAngle(actor, RUNTIME_CLASS(AWizardFX1), mo->angle-(ANG45/8), mo->momz);
|
P_SpawnMissileAngle(actor, fx, mo->angle-(ANG45/8), mo->momz);
|
||||||
P_SpawnMissileAngle(actor, RUNTIME_CLASS(AWizardFX1), mo->angle+(ANG45/8), mo->momz);
|
P_SpawnMissileAngle(actor, fx, mo->angle+(ANG45/8), mo->momz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,12 +151,15 @@ bool P_MorphPlayer (player_t *activator, player_t *p, const PClass *spawntype, i
|
||||||
// taking events, set up the face, if any;
|
// taking events, set up the face, if any;
|
||||||
// this is only needed for old-skool skins
|
// this is only needed for old-skool skins
|
||||||
// and for the original DOOM status bar.
|
// and for the original DOOM status bar.
|
||||||
if ((p == &players[consoleplayer]) &&
|
if (p == &players[consoleplayer])
|
||||||
(strcmp(spawntype->Meta.GetMetaString (APMETA_Face), "None") != 0))
|
|
||||||
{
|
{
|
||||||
StatusBar->SetFace(&skins[p->MorphedPlayerClass]);
|
const char *face = spawntype->Meta.GetMetaString (APMETA_Face);
|
||||||
}
|
|
||||||
|
|
||||||
|
if (face != NULL && strcmp(face, "None") != 0)
|
||||||
|
{
|
||||||
|
StatusBar->SetFace(&skins[p->MorphedPlayerClass]);
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -287,6 +287,10 @@ static void ParseActionDef (FScanner &sc, PClass *cls)
|
||||||
static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *bag)
|
static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *bag)
|
||||||
{
|
{
|
||||||
FName typeName;
|
FName typeName;
|
||||||
|
const PClass *replacee = NULL;
|
||||||
|
int DoomEdNum = -1;
|
||||||
|
PClass *ti = NULL;
|
||||||
|
FActorInfo *info = NULL;
|
||||||
|
|
||||||
// Get actor name
|
// Get actor name
|
||||||
sc.MustGetString();
|
sc.MustGetString();
|
||||||
|
@ -339,10 +343,14 @@ static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *b
|
||||||
{
|
{
|
||||||
sc.ScriptError ("Parent type '%s' not found", colon);
|
sc.ScriptError ("Parent type '%s' not found", colon);
|
||||||
}
|
}
|
||||||
else if (parent->ActorInfo == NULL)
|
else if (!parent->IsDescendantOf(RUNTIME_CLASS(AActor)))
|
||||||
{
|
{
|
||||||
sc.ScriptError ("Parent type '%s' is not an actor", colon);
|
sc.ScriptError ("Parent type '%s' is not an actor", colon);
|
||||||
}
|
}
|
||||||
|
else if (parent->ActorInfo == NULL)
|
||||||
|
{
|
||||||
|
sc.ScriptError ("uninitialized parent type '%s'", colon);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*parentc = parent->ActorInfo;
|
*parentc = parent->ActorInfo;
|
||||||
|
@ -351,8 +359,57 @@ static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *b
|
||||||
else sc.UnGet();
|
else sc.UnGet();
|
||||||
}
|
}
|
||||||
|
|
||||||
PClass *ti = parent->CreateDerivedClass (typeName, parent->Size);
|
// Check for "replaces"
|
||||||
FActorInfo *info = ti->ActorInfo;
|
if (sc.CheckString ("replaces"))
|
||||||
|
{
|
||||||
|
|
||||||
|
// Get actor name
|
||||||
|
sc.MustGetString ();
|
||||||
|
replacee = PClass::FindClass (sc.String);
|
||||||
|
|
||||||
|
if (replacee == NULL)
|
||||||
|
{
|
||||||
|
sc.ScriptError ("Replaced type '%s' not found", sc.String);
|
||||||
|
}
|
||||||
|
else if (replacee->ActorInfo == NULL)
|
||||||
|
{
|
||||||
|
sc.ScriptError ("Replaced type '%s' is not an actor", sc.String);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now, after the actor names have been parsed, it is time to switch to C-mode
|
||||||
|
// for the rest of the actor definition.
|
||||||
|
sc.SetCMode (true);
|
||||||
|
if (sc.CheckNumber())
|
||||||
|
{
|
||||||
|
if (sc.Number>=-1 && sc.Number<32768) DoomEdNum = sc.Number;
|
||||||
|
else sc.ScriptError ("DoomEdNum must be in the range [-1,32767]");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sc.CheckString("native"))
|
||||||
|
{
|
||||||
|
ti = (PClass*)PClass::FindClass(typeName);
|
||||||
|
if (ti == NULL)
|
||||||
|
{
|
||||||
|
sc.ScriptError("Unknown native class '%s'", typeName.GetChars());
|
||||||
|
}
|
||||||
|
else if (ti->ParentClass != parent)
|
||||||
|
{
|
||||||
|
sc.ScriptError("Native class '%s' does not inherit from '%s'",
|
||||||
|
typeName.GetChars(),parent->TypeName.GetChars());
|
||||||
|
}
|
||||||
|
else if (ti->ActorInfo != NULL)
|
||||||
|
{
|
||||||
|
sc.ScriptMessage("Redefinition of internal class '%s'", typeName.GetChars());
|
||||||
|
}
|
||||||
|
ti->InitializeActorInfo();
|
||||||
|
info = ti->ActorInfo;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ti = parent->CreateDerivedClass (typeName, parent->Size);
|
||||||
|
info = ti->ActorInfo;
|
||||||
|
}
|
||||||
|
|
||||||
MakeStateDefines(parent->ActorInfo->StateList);
|
MakeStateDefines(parent->ActorInfo->StateList);
|
||||||
|
|
||||||
|
@ -373,40 +430,14 @@ static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *b
|
||||||
*info->PainChances = *parent->ActorInfo->PainChances;
|
*info->PainChances = *parent->ActorInfo->PainChances;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for "replaces"
|
if (replacee != NULL)
|
||||||
sc.MustGetString ();
|
|
||||||
if (sc.Compare ("replaces"))
|
|
||||||
{
|
{
|
||||||
const PClass *replacee;
|
|
||||||
|
|
||||||
// Get actor name
|
|
||||||
sc.MustGetString ();
|
|
||||||
replacee = PClass::FindClass (sc.String);
|
|
||||||
|
|
||||||
if (replacee == NULL)
|
|
||||||
{
|
|
||||||
sc.ScriptError ("Replaced type '%s' not found", sc.String);
|
|
||||||
}
|
|
||||||
else if (replacee->ActorInfo == NULL)
|
|
||||||
{
|
|
||||||
sc.ScriptError ("Replaced type '%s' is not an actor", sc.String);
|
|
||||||
}
|
|
||||||
replacee->ActorInfo->Replacement = ti->ActorInfo;
|
replacee->ActorInfo->Replacement = ti->ActorInfo;
|
||||||
ti->ActorInfo->Replacee = replacee->ActorInfo;
|
ti->ActorInfo->Replacee = replacee->ActorInfo;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
sc.UnGet();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now, after the actor names have been parsed, it is time to switch to C-mode
|
info->DoomEdNum = DoomEdNum;
|
||||||
// for the rest of the actor definition.
|
|
||||||
sc.SetCMode (true);
|
|
||||||
if (sc.CheckNumber())
|
|
||||||
{
|
|
||||||
if (sc.Number>=-1 && sc.Number<32768) info->DoomEdNum = sc.Number;
|
|
||||||
else sc.ScriptError ("DoomEdNum must be in the range [-1,32767]");
|
|
||||||
}
|
|
||||||
if (parent == RUNTIME_CLASS(AWeapon))
|
if (parent == RUNTIME_CLASS(AWeapon))
|
||||||
{
|
{
|
||||||
// preinitialize kickback to the default for the game
|
// preinitialize kickback to the default for the game
|
||||||
|
|
|
@ -172,6 +172,7 @@ static flagdef ActorFlags[]=
|
||||||
DEFINE_FLAG(MF3, DONTOVERLAP, AActor, flags3),
|
DEFINE_FLAG(MF3, DONTOVERLAP, AActor, flags3),
|
||||||
DEFINE_FLAG(MF3, DONTMORPH, AActor, flags3),
|
DEFINE_FLAG(MF3, DONTMORPH, AActor, flags3),
|
||||||
DEFINE_FLAG(MF3, DONTSQUASH, AActor, flags3),
|
DEFINE_FLAG(MF3, DONTSQUASH, AActor, flags3),
|
||||||
|
DEFINE_FLAG(MF3, EXPLOCOUNT, AActor, flags3),
|
||||||
DEFINE_FLAG(MF3, FULLVOLACTIVE, AActor, flags3),
|
DEFINE_FLAG(MF3, FULLVOLACTIVE, AActor, flags3),
|
||||||
DEFINE_FLAG(MF3, ISMONSTER, AActor, flags3),
|
DEFINE_FLAG(MF3, ISMONSTER, AActor, flags3),
|
||||||
DEFINE_FLAG(MF3, SKYEXPLODE, AActor, flags3),
|
DEFINE_FLAG(MF3, SKYEXPLODE, AActor, flags3),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8,00"
|
||||||
Name="updaterevision"
|
Name="updaterevision"
|
||||||
ProjectGUID="{6077B7D6-349F-4077-B552-3BC302EF5859}"
|
ProjectGUID="{6077B7D6-349F-4077-B552-3BC302EF5859}"
|
||||||
RootNamespace="updaterevision"
|
RootNamespace="updaterevision"
|
||||||
|
@ -95,82 +95,6 @@
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|Win32"
|
Name="Release|Win32"
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
@ -248,6 +172,82 @@
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|x64"
|
||||||
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="17"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|x64"
|
Name="Release|x64"
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||||
|
@ -348,7 +348,7 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Debug|x64"
|
Name="Release|Win32"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
@ -356,7 +356,7 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
Name="Release|Win32"
|
Name="Debug|x64"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
|
|
|
@ -49,10 +49,17 @@
|
||||||
#include "actors/heretic/hereticartifacts.txt"
|
#include "actors/heretic/hereticartifacts.txt"
|
||||||
#include "actors/heretic/heretickeys.txt"
|
#include "actors/heretic/heretickeys.txt"
|
||||||
#include "actors/heretic/hereticdecorations.txt"
|
#include "actors/heretic/hereticdecorations.txt"
|
||||||
|
#include "actors/heretic/hereticmisc.txt"
|
||||||
#include "actors/heretic/mummy.txt"
|
#include "actors/heretic/mummy.txt"
|
||||||
#include "actors/heretic/clink.txt"
|
#include "actors/heretic/clink.txt"
|
||||||
#include "actors/heretic/beast.txt"
|
#include "actors/heretic/beast.txt"
|
||||||
#include "actors/heretic/snake.txt"
|
#include "actors/heretic/snake.txt"
|
||||||
|
#include "actors/heretic/hereticimp.txt"
|
||||||
|
#include "actors/heretic/knight.txt"
|
||||||
|
#include "actors/heretic/wizard.txt"
|
||||||
|
#include "actors/heretic/ironlich.txt"
|
||||||
|
#include "actors/heretic/dsparil.txt"
|
||||||
|
#include "actors/heretic/chicken.txt"
|
||||||
|
|
||||||
#include "actors/hexen/fighterplayer.txt"
|
#include "actors/hexen/fighterplayer.txt"
|
||||||
#include "actors/hexen/clericplayer.txt"
|
#include "actors/hexen/clericplayer.txt"
|
||||||
|
|
181
wadsrc/decorate/heretic/chicken.txt
Normal file
181
wadsrc/decorate/heretic/chicken.txt
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
|
||||||
|
// Beak puff ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR BeakPuff : StaffPuff
|
||||||
|
{
|
||||||
|
Mass 5
|
||||||
|
Renderstyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
AttackSound "chicken/attack"
|
||||||
|
VSpeed 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Beak ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Beak : Weapon
|
||||||
|
{
|
||||||
|
Weapon.SelectionOrder 10000
|
||||||
|
+WEAPON.DONTBOB
|
||||||
|
+WEAPON.MELEEWEAPON
|
||||||
|
Weapon.YAdjust 15
|
||||||
|
Weapon.SisterWeapon "BeakPowered"
|
||||||
|
|
||||||
|
action native A_BeakRaise ();
|
||||||
|
action native A_BeakAttackPL1();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Ready:
|
||||||
|
BEAK A 1 A_WeaponReady
|
||||||
|
Loop
|
||||||
|
Deselect:
|
||||||
|
BEAK A 1 A_Lower
|
||||||
|
Loop
|
||||||
|
Select:
|
||||||
|
BEAK A 1 A_BeakRaise
|
||||||
|
Loop
|
||||||
|
Fire:
|
||||||
|
BEAK A 18 A_BeakAttackPL1
|
||||||
|
Goto Ready
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ACTOR BeakPowered : Beak
|
||||||
|
{
|
||||||
|
+WEAPON.POWERED_UP
|
||||||
|
Weapon.SisterWeapon "Beak"
|
||||||
|
|
||||||
|
action native A_BeakAttackPL2();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Fire:
|
||||||
|
BEAK A 12 A_BeakAttackPL2
|
||||||
|
Goto Ready
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chicken player -----------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR ChickenPlayer : PlayerPawn native
|
||||||
|
{
|
||||||
|
Health 30
|
||||||
|
ReactionTime 0
|
||||||
|
PainChance 255
|
||||||
|
Radius 16
|
||||||
|
Height 30
|
||||||
|
Speed 1
|
||||||
|
Gravity 0.125
|
||||||
|
+NOSKIN
|
||||||
|
PainSound "chicken/pain"
|
||||||
|
DeathSound "chicken/death"
|
||||||
|
Player.JumpZ 1
|
||||||
|
Player.Viewheight 21
|
||||||
|
Player.ForwardMove 1.22, 1.22
|
||||||
|
Player.SideMove 1.22, 1.22
|
||||||
|
Player.SpawnClass "Chicken"
|
||||||
|
Player.SoundClass "Chicken"
|
||||||
|
Player.DisplayName "Chicken"
|
||||||
|
Player.MorphWeapon "Beak"
|
||||||
|
-PICKUP
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
CHKN A -1
|
||||||
|
Stop
|
||||||
|
See:
|
||||||
|
CHKN ABAB 3
|
||||||
|
Loop
|
||||||
|
Melee:
|
||||||
|
Missile:
|
||||||
|
CHKN C 12
|
||||||
|
Goto Spawn
|
||||||
|
Pain:
|
||||||
|
CHKN D 4 A_Feathers
|
||||||
|
CHKN C 4 A_Pain
|
||||||
|
Goto Spawn
|
||||||
|
Death:
|
||||||
|
CHKN E 6 A_Scream
|
||||||
|
CHKN F 6 A_Feathers
|
||||||
|
CHKN G 6
|
||||||
|
CHKN H 6 A_NoBlocking
|
||||||
|
CHKN IJK 6
|
||||||
|
CHKN L -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Chicken (non-player) -----------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Chicken : MorphedMonster
|
||||||
|
{
|
||||||
|
Health 10
|
||||||
|
Radius 9
|
||||||
|
Height 22
|
||||||
|
Mass 40
|
||||||
|
Speed 4
|
||||||
|
Painchance 200
|
||||||
|
Monster
|
||||||
|
-COUNTKILL
|
||||||
|
+WINDTHRUST
|
||||||
|
+DONTMORPH
|
||||||
|
+FLOORCLIP
|
||||||
|
SeeSound "chicken/pain"
|
||||||
|
AttackSound "chicken/attack"
|
||||||
|
PainSound "chicken/pain"
|
||||||
|
DeathSound "chicken/death"
|
||||||
|
ActiveSound "chicken/active"
|
||||||
|
Obituary "$OB_CHICKEN"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
CHKN AB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
CHKN AB 3 A_Chase
|
||||||
|
Loop
|
||||||
|
Pain:
|
||||||
|
CHKN D 5 A_Feathers
|
||||||
|
CHKN C 5 A_Pain
|
||||||
|
Melee:
|
||||||
|
CHKN A 8 A_FaceTarget
|
||||||
|
CHKN C 10 A_CustomMeleeAttack(random[ChicAttack](1,2))
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
CHKN E 6 A_Scream
|
||||||
|
CHKN F 6 A_Feathers
|
||||||
|
CHKN G 6
|
||||||
|
CHKN H 6 A_NoBlocking
|
||||||
|
CHKN IJK 6
|
||||||
|
CHKN L -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Feather ------------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Feather
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 121
|
||||||
|
Radius 2
|
||||||
|
Height 4
|
||||||
|
+MISSILE +DROPOFF
|
||||||
|
+NOTELEPORT +CANNOTPUSH
|
||||||
|
+WINDTHRUST +DONTSPLASH
|
||||||
|
Gravity 0.125
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
CHKN MNOPQPON 3
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
CHKN N 6
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
274
wadsrc/decorate/heretic/dsparil.txt
Normal file
274
wadsrc/decorate/heretic/dsparil.txt
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
|
||||||
|
// Boss spot ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR BossSpot : SpecialSpot 56
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 141
|
||||||
|
+INVISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sorcerer (D'Sparil on his serpent) ---------------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer1 7
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 142
|
||||||
|
Health 2000
|
||||||
|
Radius 28
|
||||||
|
Height 100
|
||||||
|
Mass 800
|
||||||
|
Speed 16
|
||||||
|
PainChance 56
|
||||||
|
Monster
|
||||||
|
+BOSS
|
||||||
|
+DONTMORPH
|
||||||
|
+NORADIUSDMG
|
||||||
|
+NOTARGET
|
||||||
|
+NOICEDEATH
|
||||||
|
+FLOORCLIP
|
||||||
|
SeeSound "dsparilserpent/sight"
|
||||||
|
AttackSound "dsparilserpent/attack"
|
||||||
|
PainSound "dsparilserpent/pain"
|
||||||
|
DeathSound "dsparilserpent/death"
|
||||||
|
ActiveSound "dsparilserpent/active"
|
||||||
|
Obituary "$OB_DSPARIL1"
|
||||||
|
HitObituary "$OB_DSPARIL1HIT"
|
||||||
|
|
||||||
|
action native A_Sor1Pain ();
|
||||||
|
action native A_Sor1Chase ();
|
||||||
|
action native A_Srcr1Attack ();
|
||||||
|
action native A_SorcererRise ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
SRCR AB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
SRCR ABCD 5 A_Sor1Chase
|
||||||
|
Loop
|
||||||
|
Pain:
|
||||||
|
SRCR Q 6 A_Sor1Pain
|
||||||
|
Goto See
|
||||||
|
Missile:
|
||||||
|
SRCR Q 7 A_FaceTarget
|
||||||
|
SRCR R 6 A_FaceTarget
|
||||||
|
SRCR S 10 A_Srcr1Attack
|
||||||
|
Goto See
|
||||||
|
Missile2:
|
||||||
|
SRCR S 10 A_FaceTarget
|
||||||
|
SRCR Q 7 A_FaceTarget
|
||||||
|
SRCR R 6 A_FaceTarget
|
||||||
|
SRCR S 10 A_Srcr1Attack
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
SRCR E 7
|
||||||
|
SRCR F 7 A_Scream
|
||||||
|
SRCR G 7
|
||||||
|
SRCR HIJK 6
|
||||||
|
SRCR L 25 A_PlaySoundEx("dsparil/zap", "body")
|
||||||
|
SRCR MN 5
|
||||||
|
SRCR O 4
|
||||||
|
SRCR L 25 A_PlaySoundEx("dsparil/zap", "body")
|
||||||
|
SRCR MN 5
|
||||||
|
SRCR O 4
|
||||||
|
SRCR L 12
|
||||||
|
SRCR P -1 A_SorcererRise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Sorcerer FX 1 ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR SorcererFX1
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 144
|
||||||
|
Radius 10
|
||||||
|
Height 10
|
||||||
|
Speed 20
|
||||||
|
FastSpeed 28
|
||||||
|
Damage 10
|
||||||
|
DamageType Fire
|
||||||
|
Projectile
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX14 ABC 6 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX14 DEFGH 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Sorcerer 2 (D'Sparil without his serpent) --------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer2
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 143
|
||||||
|
Health 3500
|
||||||
|
Radius 16
|
||||||
|
Height 70
|
||||||
|
Mass 300
|
||||||
|
Speed 14
|
||||||
|
Painchance 32
|
||||||
|
Monster
|
||||||
|
+DROPOFF
|
||||||
|
+BOSS
|
||||||
|
+DONTMORPH
|
||||||
|
+FULLVOLACTIVE
|
||||||
|
+NORADIUSDMG
|
||||||
|
+NOTARGET
|
||||||
|
+NOICEDEATH
|
||||||
|
+FLOORCLIP
|
||||||
|
SeeSound "dsparil/sight"
|
||||||
|
AttackSound "dsparil/attack"
|
||||||
|
PainSound "dsparil/pain"
|
||||||
|
ActiveSound "dsparil/active"
|
||||||
|
Obituary "$OB_DSPARIL2"
|
||||||
|
HitObituary "$OB_DSPARIL2HIT"
|
||||||
|
|
||||||
|
action native A_Srcr2Decide ();
|
||||||
|
action native A_Srcr2Attack ();
|
||||||
|
action native A_Sor2DthInit ();
|
||||||
|
action native A_Sor2DthLoop ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
SOR2 MN 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
SOR2 MNOP 4 A_Chase
|
||||||
|
Loop
|
||||||
|
Rise:
|
||||||
|
SOR2 AB 4
|
||||||
|
SOR2 C 4 A_PlaySoundEx("dsparil/rise", "Body")
|
||||||
|
SOR2 DEF 4
|
||||||
|
SOR2 G 12 A_PlaySoundEx("dsparil/sight", "Body")
|
||||||
|
Goto See
|
||||||
|
Pain:
|
||||||
|
SOR2 Q 3
|
||||||
|
SOR2 Q 6 A_Pain
|
||||||
|
Goto See
|
||||||
|
Missile:
|
||||||
|
SOR2 R 9 A_Srcr2Decide
|
||||||
|
SOR2 S 9 A_FaceTarget
|
||||||
|
SOR2 T 20 A_Srcr2Attack
|
||||||
|
Goto See
|
||||||
|
Teleport:
|
||||||
|
SOR2 LKJIHG 6
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
SDTH A 8 A_Sor2DthInit
|
||||||
|
SDTH B 8
|
||||||
|
SDTH C 8 A_PlaySoundEx("dsparil/scream", "Body")
|
||||||
|
DeathLoop:
|
||||||
|
SDTH DE 7
|
||||||
|
SDTH F 7 A_Sor2DthLoop
|
||||||
|
SDTH G 6 A_PlaySoundEx("dsparil/explode", "Body")
|
||||||
|
SDTH H 6
|
||||||
|
SDTH I 18
|
||||||
|
SDTH J 6 A_NoBlocking
|
||||||
|
SDTH K 6 A_PlaySoundEx("dsparil/bones", "Body")
|
||||||
|
SDTH LMN 6
|
||||||
|
SDTH O -1 A_BossDeath
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sorcerer 2 FX 1 ----------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer2FX1
|
||||||
|
{
|
||||||
|
Radius 10
|
||||||
|
Height 6
|
||||||
|
Speed 20
|
||||||
|
FastSpeed 28
|
||||||
|
Damage 1
|
||||||
|
Projectile
|
||||||
|
RenderStyle Add
|
||||||
|
|
||||||
|
action native A_BlueSpark ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX16 ABC 3 BRIGHT A_BlueSpark
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX16 G 5 BRIGHT A_Explode(random[S2FX1](80,111))
|
||||||
|
FX16 HIJKL 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sorcerer 2 FX Spark ------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer2FXSpark
|
||||||
|
{
|
||||||
|
Radius 20
|
||||||
|
Height 16
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOGRAVITY
|
||||||
|
+NOTELEPORT
|
||||||
|
+CANNOTPUSH
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX16 DEF 12 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sorcerer 2 FX 2 ----------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer2FX2
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 146
|
||||||
|
Radius 10
|
||||||
|
Height 6
|
||||||
|
Speed 6
|
||||||
|
Damage 10
|
||||||
|
Projectile
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
-ACTIVATEPCROSS
|
||||||
|
RenderStyle Add
|
||||||
|
|
||||||
|
action native A_GenWizard ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX11 A 35 BRIGHT
|
||||||
|
FX11 A 5 BRIGHT A_GenWizard
|
||||||
|
FX11 B 5 BRIGHT
|
||||||
|
Goto Spawn+1
|
||||||
|
Death:
|
||||||
|
FX11 CDEFG 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Sorcerer 2 Telefade ------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Sorcerer2Telefade
|
||||||
|
{
|
||||||
|
+NOBLOCKMAP
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
SOR2 GHIJKL 6
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -42,3 +42,67 @@ ACTOR ArtiInvisibility : PowerupGiver 75
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Tome of power ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR ArtiTomeOfPower : PowerupGiver 86 native
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 134
|
||||||
|
+COUNTITEM
|
||||||
|
+FLOATBOB
|
||||||
|
+INVENTORY.PICKUPFLASH
|
||||||
|
Inventory.Icon "ARTIPWBK"
|
||||||
|
Powerup.Type Weaponlevel2
|
||||||
|
Inventory.PickupMessage "$TXT_ARTITOMEOFPOWER"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
PWBK A 350
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Time bomb ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR ActivatedTimeBomb
|
||||||
|
{
|
||||||
|
+NOGRAVITY
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
DeathSound "misc/timebomb"
|
||||||
|
|
||||||
|
action native A_Timebomb();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FBMB ABCD 10
|
||||||
|
FBMB E 6 A_Scream
|
||||||
|
XPL1 A 4 BRIGHT A_Timebomb
|
||||||
|
XPL1 BCDEF 4 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ACTOR ArtiTimeBomb : Inventory 34 native
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 72
|
||||||
|
+COUNTITEM
|
||||||
|
+FLOATBOB
|
||||||
|
+INVENTORY.PICKUPFLASH
|
||||||
|
+INVENTORY.INVBAR
|
||||||
|
+INVENTORY.FANCYPICKUPSOUND
|
||||||
|
Inventory.Icon "ARTIFBMB"
|
||||||
|
Inventory.PickupSound "misc/p_pkup"
|
||||||
|
Inventory.PickupMessage "$TXT_ARTIFIREBOMB"
|
||||||
|
Inventory.DefMaxAmount
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FBMB E 350
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
153
wadsrc/decorate/heretic/hereticimp.txt
Normal file
153
wadsrc/decorate/heretic/hereticimp.txt
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
|
||||||
|
// Heretic imp (as opposed to the Doom variety) -----------------------------
|
||||||
|
|
||||||
|
ACTOR HereticImp 66
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 5
|
||||||
|
Health 40
|
||||||
|
Radius 16
|
||||||
|
Height 36
|
||||||
|
Mass 50
|
||||||
|
Speed 10
|
||||||
|
Painchance 200
|
||||||
|
Monster
|
||||||
|
+FLOAT
|
||||||
|
+NOGRAVITY
|
||||||
|
+SPAWNFLOAT
|
||||||
|
+DONTOVERLAP
|
||||||
|
+MISSILEMORE
|
||||||
|
SeeSound "himp/sight"
|
||||||
|
AttackSound "himp/attack"
|
||||||
|
PainSound "himp/pain"
|
||||||
|
DeathSound "himp/death"
|
||||||
|
ActiveSound "himp/active"
|
||||||
|
Obituary "$OB_HERETICIMP"
|
||||||
|
HitObituary "$OB_HERETICIMPHIT"
|
||||||
|
|
||||||
|
action native A_ImpDeath();
|
||||||
|
action native A_ImpXDeath1();
|
||||||
|
action native A_ImpExplode();
|
||||||
|
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
IMPX ABCB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
IMPX AABBCCBB 3 A_Chase
|
||||||
|
Loop
|
||||||
|
Melee:
|
||||||
|
IMPX DE 6 A_FaceTarget
|
||||||
|
IMPX F 6 A_CustomMeleeAttack(random[ImpMeAttack](5,12), "himp/attack", "himp/attack")
|
||||||
|
Goto See
|
||||||
|
Missile:
|
||||||
|
IMPX A 10 A_FaceTarget
|
||||||
|
IMPX B 6 A_SkullAttack(12)
|
||||||
|
IMPX CBAB 6
|
||||||
|
Goto Missile+2
|
||||||
|
Pain:
|
||||||
|
IMPX G 3
|
||||||
|
IMPX G 3 A_Pain
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
IMPX G 4 A_ImpDeath
|
||||||
|
IMPX H 5
|
||||||
|
Wait
|
||||||
|
XDeath:
|
||||||
|
IMPX S 5 A_ImpXDeath1
|
||||||
|
IMPX TU 5
|
||||||
|
IMPX V 5 A_Gravity
|
||||||
|
IMPX W 5
|
||||||
|
Wait
|
||||||
|
Crash:
|
||||||
|
IMPX I 7 A_ImpExplode
|
||||||
|
IMPX J 7 A_Scream
|
||||||
|
IMPX K 7
|
||||||
|
IMPX L -1
|
||||||
|
Stop
|
||||||
|
XCrash:
|
||||||
|
IMPX X 7
|
||||||
|
IMPX Y 7
|
||||||
|
IMPX Z -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Heretic imp leader -------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HereticImpLeader : HereticImp 5
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 7
|
||||||
|
-MISSILEMORE
|
||||||
|
AttackSound "himp/leaderattack"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Melee:
|
||||||
|
Stop
|
||||||
|
Missile:
|
||||||
|
IMPX DE 6 A_FaceTarget
|
||||||
|
IMPX F 6 A_CustomComboAttack("HereticImpBall", 32, random[ImpMsAttack2](5,12), "himp/leaderattack")
|
||||||
|
Goto See
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Heretic imp chunk 1 ------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HereticImpChunk1
|
||||||
|
{
|
||||||
|
Mass 5
|
||||||
|
Radius 4
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
IMPX M 5
|
||||||
|
IMPX NO 700
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Heretic imp chunk 2 ------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HereticImpChunk2
|
||||||
|
{
|
||||||
|
Mass 5
|
||||||
|
Radius 4
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
IMPX P 5
|
||||||
|
IMPX QR 700
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Heretic imp ball ---------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HereticImpBall
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 10
|
||||||
|
Radius 8
|
||||||
|
Height 8
|
||||||
|
Speed 10
|
||||||
|
FastSpeed 20
|
||||||
|
Damage 1
|
||||||
|
Projectile
|
||||||
|
-ACTIVATEPCROSS
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX10 ABC 6 Bright
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX10 DEFG 5 Bright
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
238
wadsrc/decorate/heretic/hereticmisc.txt
Normal file
238
wadsrc/decorate/heretic/hereticmisc.txt
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
|
||||||
|
// Pod ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Pod 2035
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 125
|
||||||
|
Health 45
|
||||||
|
Radius 16
|
||||||
|
Height 54
|
||||||
|
Painchance 255
|
||||||
|
+SOLID +NOBLOOD +SHOOTABLE +DROPOFF
|
||||||
|
+WINDTHRUST +PUSHABLE +SLIDESONWALLS
|
||||||
|
+CANPASS +TELESTOMP +DONTMORPH
|
||||||
|
+NOBLOCKMONST +DONTGIB +OLDRADIUSDMG
|
||||||
|
DeathSound "world/podexplode"
|
||||||
|
|
||||||
|
action native A_PodPain ();
|
||||||
|
action native A_RemovePod ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
PPOD A 10
|
||||||
|
Loop
|
||||||
|
Pain:
|
||||||
|
PPOD B 14 A_PodPain
|
||||||
|
Goto Spawn
|
||||||
|
Death:
|
||||||
|
PPOD C 5 BRIGHT A_RemovePod
|
||||||
|
PPOD D 5 BRIGHT A_Scream
|
||||||
|
PPOD E 5 BRIGHT A_Explode
|
||||||
|
PPOD F 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
Grow:
|
||||||
|
PPOD IJKLMNOP 3
|
||||||
|
Goto Spawn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Pod goo (falls from pod when damaged) ------------------------------------
|
||||||
|
|
||||||
|
ACTOR PodGoo
|
||||||
|
{
|
||||||
|
Radius 2
|
||||||
|
Height 4
|
||||||
|
Gravity 0.125
|
||||||
|
+NOBLOCKMAP +MISSILE +DROPOFF
|
||||||
|
+NOTELEPORT +CANNOTPUSH
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
PPOD GH 8
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
PPOD G 10
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pod generator ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR PodGenerator 43
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 126
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOSECTOR
|
||||||
|
|
||||||
|
action native A_MakePod ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TNT1 A 35 A_MakePod
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Teleglitter generator 1 --------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR TeleGlitterGenerator1 74
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 166
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOSECTOR
|
||||||
|
+NOGRAVITY
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TNT1 A 8 A_SpawnItemEx("TeleGlitter1", random[TeleGlitter](0,31)-16, random[TeleGlitter](0,31)-16, 0, 0,0,0.25)
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Teleglitter generator 2 --------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR TeleGlitterGenerator2 52
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 167
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOSECTOR
|
||||||
|
+NOGRAVITY
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TNT1 A 8 A_SpawnItemEx("TeleGlitter2", random[TeleGlitter2](0,31)-16, random[TeleGlitter2](0,31)-16, 0, 0,0,0.25)
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Teleglitter 1 ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR TeleGlitter1
|
||||||
|
{
|
||||||
|
+NOBLOCKMAP +NOGRAVITY +MISSILE
|
||||||
|
RenderStyle Add
|
||||||
|
Damage 0
|
||||||
|
|
||||||
|
action native A_AccTeleGlitter ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TGLT A 2 BRIGHT
|
||||||
|
TGLT B 2 BRIGHT A_AccTeleGlitter
|
||||||
|
TGLT C 2 BRIGHT
|
||||||
|
TGLT D 2 BRIGHT A_AccTeleGlitter
|
||||||
|
TGLT E 2 BRIGHT
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Teleglitter 2 ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR TeleGlitter2 : TeleGlitter1
|
||||||
|
{
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TGLT F 2 BRIGHT
|
||||||
|
TGLT G 2 BRIGHT A_AccTeleGlitter
|
||||||
|
TGLT H 2 BRIGHT
|
||||||
|
TGLT I 2 BRIGHT A_AccTeleGlitter
|
||||||
|
TGLT J 2 BRIGHT
|
||||||
|
Loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --- Volcano --------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Volcano 87
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 87
|
||||||
|
Radius 12
|
||||||
|
Height 20
|
||||||
|
+SOLID
|
||||||
|
|
||||||
|
action native A_VolcanoSet ();
|
||||||
|
action native A_VolcanoBlast ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
VLCO A 350
|
||||||
|
VLCO A 35 A_VolcanoSet
|
||||||
|
VLCO BCDBCD 3
|
||||||
|
VLCO E 10 A_VolcanoBlast
|
||||||
|
Goto Spawn+1
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volcano blast ------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR VolcanoBlast
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 123
|
||||||
|
Radius 8
|
||||||
|
Height 8
|
||||||
|
Speed 2
|
||||||
|
Damage 2
|
||||||
|
DamageType Fire
|
||||||
|
Gravity 0.125
|
||||||
|
+NOBLOCKMAP +MISSILE +DROPOFF
|
||||||
|
+NOTELEPORT
|
||||||
|
DeathSound "world/volcano/blast"
|
||||||
|
|
||||||
|
action native A_VolcBallImpact ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
VFBL A 4 BRIGHT A_SpawnItemEx("Puffy", random2[BeastPuff]()*0.015625, random2[BeastPuff]()*0.015625, random2[BeastPuff]()*0.015625,
|
||||||
|
0,0,0,0,SXF_ABSOLUTEPOSITION, 64)
|
||||||
|
Loop
|
||||||
|
|
||||||
|
Death:
|
||||||
|
XPL1 A 4 BRIGHT A_VolcBallImpact
|
||||||
|
XPL1 BCDEF 4 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volcano T Blast ----------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR VolcanoTBlast
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 124
|
||||||
|
Radius 8
|
||||||
|
Height 6
|
||||||
|
Speed 2
|
||||||
|
Damage 1
|
||||||
|
DamageType Fire
|
||||||
|
Gravity 0.125
|
||||||
|
+NOBLOCKMAP +MISSILE +DROPOFF
|
||||||
|
+NOTELEPORT
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
VTFB AB 4 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
SFFI CBABCDE 4 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
172
wadsrc/decorate/heretic/ironlich.txt
Normal file
172
wadsrc/decorate/heretic/ironlich.txt
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
|
||||||
|
// Ironlich -----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Ironlich 6
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 20
|
||||||
|
Health 700
|
||||||
|
Radius 40
|
||||||
|
Height 72
|
||||||
|
Mass 325
|
||||||
|
Speed 6
|
||||||
|
Painchance 32
|
||||||
|
Monster
|
||||||
|
+NOBLOOD
|
||||||
|
+DONTMORPH
|
||||||
|
+DONTSQUASH
|
||||||
|
+BOSSDEATH
|
||||||
|
SeeSound "ironlich/sight"
|
||||||
|
AttackSound "ironlich/attack"
|
||||||
|
PainSound "ironlich/pain"
|
||||||
|
DeathSound "ironlich/death"
|
||||||
|
ActiveSound "ironlich/active"
|
||||||
|
Obituary "$OB_IRONLICH"
|
||||||
|
HitObituary "$OB_IRONLICHHIT"
|
||||||
|
DropItem "BlasterAmmo", 84, 10
|
||||||
|
DropItem "ArtiEgg", 51, 0
|
||||||
|
|
||||||
|
action native A_LichAttack ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
LICH A 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
LICH A 4 A_Chase
|
||||||
|
Loop
|
||||||
|
Missile:
|
||||||
|
LICH A 5 A_FaceTarget
|
||||||
|
LICH B 20 A_LichAttack
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
LICH C 7
|
||||||
|
LICH D 7 A_Scream
|
||||||
|
LICH EF 7
|
||||||
|
LICH G 7 A_NoBlocking
|
||||||
|
LICH H 7
|
||||||
|
LICH I -1 A_BossDeath
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Head FX 1 ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HeadFX1
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 164
|
||||||
|
Radius 12
|
||||||
|
Height 6
|
||||||
|
Speed 13
|
||||||
|
FastSpeed 20
|
||||||
|
Damage 1
|
||||||
|
Projectile
|
||||||
|
+THRUGHOST
|
||||||
|
RenderStyle Add
|
||||||
|
|
||||||
|
action native A_LichIceImpact();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX05 ABC 6 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX05 D 5 BRIGHT A_LichIceImpact
|
||||||
|
FX05 EFG 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Head FX 2 ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HeadFX2
|
||||||
|
{
|
||||||
|
Radius 12
|
||||||
|
Height 6
|
||||||
|
Speed 8
|
||||||
|
Damage 3
|
||||||
|
Projectile
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
-ACTIVATEPCROSS
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX05 HIJ 6 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX05 DEFG 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Head FX 3 ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR HeadFX3
|
||||||
|
{
|
||||||
|
Radius 14
|
||||||
|
Height 12
|
||||||
|
Speed 10
|
||||||
|
FastSpeed 18
|
||||||
|
Damage 5
|
||||||
|
Projectile
|
||||||
|
+WINDTHRUST
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
-ACTIVATEPCROSS
|
||||||
|
-NOBLOCKMAP
|
||||||
|
RenderStyle Add
|
||||||
|
|
||||||
|
action native A_LichFireGrow ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX06 ABC 4 BRIGHT A_LichFireGrow
|
||||||
|
Loop
|
||||||
|
NoGrow:
|
||||||
|
FX06 ABC 4 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX06 DEFG 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Whirlwind ----------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Whirlwind native
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 165
|
||||||
|
Radius 16
|
||||||
|
Height 75
|
||||||
|
Speed 10
|
||||||
|
Damage 1
|
||||||
|
Projectile
|
||||||
|
-ACTIVATEIMPACT
|
||||||
|
-ACTIVATEMCROSS
|
||||||
|
+SEEKERMISSILE
|
||||||
|
+EXPLOCOUNT
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
|
||||||
|
action native A_WhirlwindSeek();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX07 DEFG 3
|
||||||
|
FX07 ABC 3 A_WhirlwindSeek
|
||||||
|
Goto Spawn+4
|
||||||
|
Death:
|
||||||
|
FX07 GFED 4
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
123
wadsrc/decorate/heretic/knight.txt
Normal file
123
wadsrc/decorate/heretic/knight.txt
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
|
||||||
|
// Knight -------------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Knight 64
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 6
|
||||||
|
Health 200
|
||||||
|
Radius 24
|
||||||
|
Height 78
|
||||||
|
Mass 150
|
||||||
|
Speed 12
|
||||||
|
Painchance 100
|
||||||
|
Monster
|
||||||
|
+FLOORCLIP
|
||||||
|
SeeSound "hknight/sight"
|
||||||
|
AttackSound "hknight/attack"
|
||||||
|
PainSound "hknight/pain"
|
||||||
|
DeathSound "hknight/death"
|
||||||
|
ActiveSound "hknight/active"
|
||||||
|
Obituary "$OB_BONEKNIGHT"
|
||||||
|
HitObituary "$OB_BONEKNIGHTHIT"
|
||||||
|
DropItem "CrossbowAmmo", 84, 5
|
||||||
|
|
||||||
|
action native A_KnightAttack ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
KNIG AB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
KNIG ABCD 4 A_Chase
|
||||||
|
Loop
|
||||||
|
Melee:
|
||||||
|
Missile:
|
||||||
|
KNIG E 10 A_FaceTarget
|
||||||
|
KNIG F 8 A_FaceTarget
|
||||||
|
KNIG G 8 A_KnightAttack
|
||||||
|
KNIG E 10 A_FaceTarget
|
||||||
|
KNIG F 8 A_FaceTarget
|
||||||
|
KNIG G 8 A_KnightAttack
|
||||||
|
Goto See
|
||||||
|
Pain:
|
||||||
|
KNIG H 3
|
||||||
|
KNIG H 3 A_Pain
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
KNIG I 6
|
||||||
|
KNIG J 6 A_Scream
|
||||||
|
KNIG K 6
|
||||||
|
KNIG L 6 A_NoBlocking
|
||||||
|
KNIG MN 6
|
||||||
|
KNIG O -1
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Knight ghost -------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR KnightGhost : Knight 65
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 129
|
||||||
|
+SHADOW
|
||||||
|
+GHOST
|
||||||
|
RenderStyle Translucent
|
||||||
|
Alpha 0.4
|
||||||
|
}
|
||||||
|
|
||||||
|
// Knight axe ---------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR KnightAxe
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 127
|
||||||
|
Radius 10
|
||||||
|
Height 8
|
||||||
|
Speed 9
|
||||||
|
FastSpeed 18
|
||||||
|
Damage 2
|
||||||
|
Projectile
|
||||||
|
-NOBLOCKMAP
|
||||||
|
+WINDTHRUST
|
||||||
|
DeathSound "hknight/hit"
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
SPAX A 3 BRIGHT A_PlaySound("hknight/axewhoosh")
|
||||||
|
SPAX BC 3 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
SPAX DEF 6 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Red axe ------------------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR RedAxe : KnightAxe
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 128
|
||||||
|
+NOBLOCKMAP
|
||||||
|
-WINDTHRUST
|
||||||
|
Damage 7
|
||||||
|
|
||||||
|
action native A_DripBlood ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
RAXE AB 5 BRIGHT A_DripBlood
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
RAXE CDE 6 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
98
wadsrc/decorate/heretic/wizard.txt
Normal file
98
wadsrc/decorate/heretic/wizard.txt
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
// Wizard --------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR Wizard 15
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 19
|
||||||
|
Health 180
|
||||||
|
Radius 16
|
||||||
|
Height 68
|
||||||
|
Mass 100
|
||||||
|
Speed 12
|
||||||
|
Painchance 64
|
||||||
|
Monster
|
||||||
|
+FLOAT
|
||||||
|
+NOGRAVITY
|
||||||
|
+DONTOVERLAP
|
||||||
|
SeeSound "wizard/sight"
|
||||||
|
AttackSound "wizard/attack"
|
||||||
|
PainSound "wizard/pain"
|
||||||
|
DeathSound "wizard/death"
|
||||||
|
ActiveSound "wizard/active"
|
||||||
|
Obituary "$OB_WIZARD"
|
||||||
|
HitObituary "$OB_WIZARDHIT"
|
||||||
|
DropItem "BlasterAmmo", 84, 10
|
||||||
|
DropItem "ArtiTomeOfPower", 4, 0
|
||||||
|
|
||||||
|
action native A_GhostOff ();
|
||||||
|
action native A_WizAtk1 ();
|
||||||
|
action native A_WizAtk2 ();
|
||||||
|
action native A_WizAtk3 ();
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
WZRD AB 10 A_Look
|
||||||
|
Loop
|
||||||
|
See:
|
||||||
|
WZRD A 3 A_Chase
|
||||||
|
WZRD A 4 A_Chase
|
||||||
|
WZRD A 3 A_Chase
|
||||||
|
WZRD A 4 A_Chase
|
||||||
|
WZRD B 3 A_Chase
|
||||||
|
WZRD B 4 A_Chase
|
||||||
|
WZRD B 3 A_Chase
|
||||||
|
WZRD B 4 A_Chase
|
||||||
|
Loop
|
||||||
|
Missile:
|
||||||
|
WZRD C 4 A_WizAtk1
|
||||||
|
WZRD C 4 A_WizAtk2
|
||||||
|
WZRD C 4 A_WizAtk1
|
||||||
|
WZRD C 4 A_WizAtk2
|
||||||
|
WZRD C 4 A_WizAtk1
|
||||||
|
WZRD C 4 A_WizAtk2
|
||||||
|
WZRD C 4 A_WizAtk1
|
||||||
|
WZRD C 4 A_WizAtk2
|
||||||
|
WZRD D 12 A_WizAtk3
|
||||||
|
Goto See
|
||||||
|
Pain:
|
||||||
|
WZRD E 3 A_GhostOff
|
||||||
|
WZRD E 3 A_Pain
|
||||||
|
Goto See
|
||||||
|
Death:
|
||||||
|
WZRD F 6 A_GhostOff
|
||||||
|
WZRD G 6 A_Scream
|
||||||
|
WZRD HI 6
|
||||||
|
WZRD J 6 A_NoBlocking
|
||||||
|
WZRD KL 6
|
||||||
|
WZRD M -1 A_SetFloorClip
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Projectile --------------------------------------------------------
|
||||||
|
|
||||||
|
ACTOR WizardFX1
|
||||||
|
{
|
||||||
|
Game Heretic
|
||||||
|
SpawnID 140
|
||||||
|
Radius 10
|
||||||
|
Height 6
|
||||||
|
Speed 18
|
||||||
|
FastSpeed 24
|
||||||
|
Damage 3
|
||||||
|
Projectile
|
||||||
|
RenderStyle Add
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX11 AB 6 BRIGHT
|
||||||
|
Loop
|
||||||
|
Death:
|
||||||
|
FX11 CDEFG 5 BRIGHT
|
||||||
|
Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,6 +178,7 @@ class Actor extends Thinker
|
||||||
action native A_DamageChildren(eval int amount, optional name damagetype);
|
action native A_DamageChildren(eval int amount, optional name damagetype);
|
||||||
action native A_SelectWeapon(class<Weapon> whichweapon);
|
action native A_SelectWeapon(class<Weapon> whichweapon);
|
||||||
action native A_Punch();
|
action native A_Punch();
|
||||||
|
action native A_Feathers();
|
||||||
}
|
}
|
||||||
|
|
||||||
class Inventory extends Actor
|
class Inventory extends Actor
|
||||||
|
|
|
@ -315,10 +315,17 @@ actors/heretic/hereticarmor.txt decorate/heretic/hereticarmor.txt
|
||||||
actors/heretic/hereticartifacts.txt decorate/heretic/hereticartifacts.txt
|
actors/heretic/hereticartifacts.txt decorate/heretic/hereticartifacts.txt
|
||||||
actors/heretic/heretickeys.txt decorate/heretic/heretickeys.txt
|
actors/heretic/heretickeys.txt decorate/heretic/heretickeys.txt
|
||||||
actors/heretic/hereticdecorations.txt decorate/heretic/hereticdecorations.txt
|
actors/heretic/hereticdecorations.txt decorate/heretic/hereticdecorations.txt
|
||||||
|
actors/heretic/hereticmisc.txt decorate/heretic/hereticmisc.txt
|
||||||
actors/heretic/mummy.txt decorate/heretic/mummy.txt
|
actors/heretic/mummy.txt decorate/heretic/mummy.txt
|
||||||
actors/heretic/clink.txt decorate/heretic/clink.txt
|
actors/heretic/clink.txt decorate/heretic/clink.txt
|
||||||
actors/heretic/beast.txt decorate/heretic/beast.txt
|
actors/heretic/beast.txt decorate/heretic/beast.txt
|
||||||
actors/heretic/snake.txt decorate/heretic/snake.txt
|
actors/heretic/snake.txt decorate/heretic/snake.txt
|
||||||
|
actors/heretic/hereticimp.txt decorate/heretic/hereticimp.txt
|
||||||
|
actors/heretic/knight.txt decorate/heretic/knight.txt
|
||||||
|
actors/heretic/wizard.txt decorate/heretic/wizard.txt
|
||||||
|
actors/heretic/ironlich.txt decorate/heretic/ironlich.txt
|
||||||
|
actors/heretic/dsparil.txt decorate/heretic/dsparil.txt
|
||||||
|
actors/heretic/chicken.txt decorate/heretic/chicken.txt
|
||||||
|
|
||||||
actors/hexen/fighterplayer.txt decorate/hexen/fighterplayer.txt
|
actors/hexen/fighterplayer.txt decorate/hexen/fighterplayer.txt
|
||||||
actors/hexen/clericplayer.txt decorate/hexen/clericplayer.txt
|
actors/hexen/clericplayer.txt decorate/hexen/clericplayer.txt
|
||||||
|
|
Loading…
Reference in a new issue