- Updated thingdef_specials.h for the new thingdef_specials.gperf file.

- Created a new MorphedMonster class that Chicken and Pig now derive from.
  This class automatically takes care of unmorphing the monster when its
  time is up.
- Made PlayerClass and MonsterClass properties of EggFX. You can override
  these in a subclass to create new kinds of morpher projectiles. Along with
  that, MorphWeapon is a new property of PlayerPawn that controls what type
  of weapon you have available while morphed ("None" means you have no
  weapons).
- Changed morphed monsters to record the time when they want to unmorph, not
  the time left until they unmorph. This simplifies calling
  P_UpdateMorhpedMonster() because you don't need to pass it a tic count.
- Added an optional second parameter to A_SpawnDebris and an optional
  fifth parameter to A_SpawnItem that both do the same thing: If you set it
  to 1, then the spawned actor will be assigned the same translation table
  as the actor that called the function.
- Moved the blood colorization in P_SpawnBlood() ahead of the SetDamage()
  call so that the blood color will available to the states of the blood
  actor.
- Extended the puke command so that giving it a negative script number will
  act like ACS_ExecuteAlways and always execute the script. (Ugh. Why did I
  use's Raven's cheat code to name this command?)


SVN r296 (trunk)
This commit is contained in:
Randy Heit 2006-08-17 00:19:26 +00:00
parent c16cff7f47
commit a6d656b108
17 changed files with 630 additions and 658 deletions

View file

@ -1,4 +1,26 @@
August 16, 2006
- Updated thingdef_specials.h for the new thingdef_specials.gperf file.
- Created a new MorphedMonster class that Chicken and Pig now derive from.
This class automatically takes care of unmorphing the monster when its
time is up.
- Made PlayerClass and MonsterClass properties of EggFX. You can override
these in a subclass to create new kinds of morpher projectiles. Along with
that, MorphWeapon is a new property of PlayerPawn that controls what type
of weapon you have available while morphed ("None" means you have no
weapons).
- Changed morphed monsters to record the time when they want to unmorph, not
the time left until they unmorph. This simplifies calling
P_UpdateMorhpedMonster() because you don't need to pass it a tic count.
- Added an optional second parameter to A_SpawnDebris and an optional
fifth parameter to A_SpawnItem that both do the same thing: If you set it
to 1, then the spawned actor will be assigned the same translation table
as the actor that called the function.
- Moved the blood colorization in P_SpawnBlood() ahead of the SetDamage()
call so that the blood color will available to the states of the blood
actor.
- Extended the puke command so that giving it a negative script number will
act like ACS_ExecuteAlways and always execute the script. (Ugh. Why did I
use's Raven's cheat code to name this command?)
- Added action special support to the thingdef expression evaluator. Now you
can use them like normal functions, which is probably most useful for
ACS_ExecuteWithResult.

View file

@ -428,6 +428,11 @@ CCMD (puke)
else
{
int script = atoi (argv[1]);
if (script == 0)
{ // Script 0 is reserved for Strife support. It is not pukable.
return;
}
int arg[3] = { 0, 0, 0 };
int argn = MIN (argc - 2, 3), i;
@ -436,8 +441,16 @@ CCMD (puke)
arg[i] = atoi (argv[2+i]);
}
Net_WriteByte (DEM_RUNSCRIPT);
Net_WriteWord (script);
if (script > 0)
{
Net_WriteByte (DEM_RUNSCRIPT);
Net_WriteWord (script);
}
else
{
Net_WriteByte (DEM_RUNSCRIPT2);
Net_WriteWord (-script);
}
Net_WriteByte (argn);
for (i = 0; i < argn; ++i)
{

View file

@ -2242,6 +2242,7 @@ void Net_DoCommand (int type, byte **stream, int player)
break;
case DEM_RUNSCRIPT:
case DEM_RUNSCRIPT2:
{
int snum = ReadWord (stream);
int argn = ReadByte (stream);
@ -2252,7 +2253,7 @@ void Net_DoCommand (int type, byte **stream, int player)
arg[i] = ReadLong (stream);
}
P_StartScript (players[player].mo, NULL, snum, level.mapname, false,
arg[0], arg[1], arg[2], false, false, true);
arg[0], arg[1], arg[2], type == DEM_RUNSCRIPT2, false, true);
}
break;
@ -2345,6 +2346,7 @@ void Net_SkipCommand (int type, byte **stream)
break;
case DEM_RUNSCRIPT:
case DEM_RUNSCRIPT2:
skip = 3 + *(*stream + 2) * 4;
break;

View file

@ -110,6 +110,7 @@ public:
fixed_t SideMove1, SideMove2;
int ScoreIcon;
int SpawnMask;
int MorphWeapon; // actually a name
int GetMaxHealth() const;
};

View file

@ -138,6 +138,7 @@ enum EDemoCommand
DEM_SUMMONFRIEND, // 37 String: Thing to fabricate
DEM_SPRAY, // 38 String: The decal to spray
DEM_CROUCH, // 39
DEM_RUNSCRIPT2 // 40 Same as DEM_RUNSCRIPT, but always executes
};
// The following are implemented by cht_DoCheat in m_cheat.cpp

View file

@ -24,9 +24,6 @@ void A_BeakAttackPL1 (AActor *);
void A_BeakAttackPL2 (AActor *);
void A_Feathers (AActor *);
void A_ChicLook (AActor *);
void A_ChicChase (AActor *);
void A_ChicPain (AActor *);
void A_ChicAttack (AActor *);
void P_UpdateBeak (AActor *);
@ -109,7 +106,6 @@ class AChickenPlayer : public APlayerPawn
DECLARE_ACTOR (AChickenPlayer, APlayerPawn)
public:
void MorphPlayerThink ();
void ActivateMorphWeapon ();
};
FState AChickenPlayer::States[] =
@ -166,6 +162,7 @@ IMPLEMENT_ACTOR (AChickenPlayer, Heretic, -1, 0)
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")
@ -199,49 +196,26 @@ void AChickenPlayer::MorphPlayerThink ()
}
}
void AChickenPlayer::ActivateMorphWeapon ()
{
player->PendingWeapon = WP_NOCHANGE;
player->psprites[ps_weapon].sy = WEAPONTOP;
player->ReadyWeapon = player->mo->FindInventory<ABeak> ();
if (player->ReadyWeapon == NULL)
{
player->ReadyWeapon = static_cast<AWeapon *>(player->mo->GiveInventoryType (RUNTIME_CLASS(ABeak)));
}
if (player->ReadyWeapon != NULL)
{
P_SetPsprite (player, ps_weapon, player->ReadyWeapon->GetReadyState());
}
else
{
P_SetPsprite (player, ps_weapon, NULL);
}
P_SetPsprite (player, ps_flash, NULL);
}
// Chicken (non-player) -----------------------------------------------------
class AChicken : public AActor
class AChicken : public AMorphedMonster
{
DECLARE_ACTOR (AChicken, AActor)
public:
void Destroy ();
void Die (AActor *source, AActor *inflictor);
DECLARE_ACTOR (AChicken, AMorphedMonster)
};
FState AChicken::States[] =
{
#define S_CHICKEN_LOOK 0
S_NORMAL (CHKN, 'A', 10, A_ChicLook , &States[S_CHICKEN_LOOK+1]),
S_NORMAL (CHKN, 'B', 10, A_ChicLook , &States[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_ChicChase , &States[S_CHICKEN_WALK+1]),
S_NORMAL (CHKN, 'B', 3, A_ChicChase , &States[S_CHICKEN_WALK+0]),
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_ChicPain , &States[S_CHICKEN_WALK+0]),
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]),
@ -283,24 +257,6 @@ IMPLEMENT_ACTOR (AChicken, Heretic, -1, 122)
PROP_Obituary("$OB_CHICKEN")
END_DEFAULTS
void AChicken::Destroy ()
{
if (tracer != NULL)
{
tracer->Destroy ();
}
Super::Destroy ();
}
void AChicken::Die (AActor *source, AActor *inflictor)
{
Super::Die (source, inflictor);
if (tracer != NULL && (tracer->flags & MF_UNMORPHED))
{
tracer->Die (source, inflictor);
}
}
// Feather ------------------------------------------------------------------
class AFeather : public AActor
@ -343,10 +299,6 @@ END_DEFAULTS
void A_ChicAttack (AActor *actor)
{
if (P_UpdateMorphedMonster(actor, 18))
{
return;
}
if (!actor->target)
{
return;
@ -359,51 +311,6 @@ void A_ChicAttack (AActor *actor)
}
}
//----------------------------------------------------------------------------
//
// PROC A_ChicLook
//
//----------------------------------------------------------------------------
void A_ChicLook (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 10))
{
return;
}
A_Look (actor);
}
//----------------------------------------------------------------------------
//
// PROC A_ChicChase
//
//----------------------------------------------------------------------------
void A_ChicChase (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 3))
{
return;
}
A_Chase (actor);
}
//----------------------------------------------------------------------------
//
// PROC A_ChicPain
//
//----------------------------------------------------------------------------
void A_ChicPain (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 10))
{
return;
}
S_SoundID (actor, CHAN_BODY, actor->PainSound, 1, ATTN_NORM);
}
//----------------------------------------------------------------------------
//
// PROC A_Feathers

View file

@ -22,8 +22,6 @@ extern void AdjustPlayerAngle (AActor *);
void A_SnoutAttack (AActor *actor);
void A_PigPain (AActor *);
void A_PigLook (AActor *);
void A_PigChase (AActor *);
void A_PigAttack (AActor *);
// Snout puff ---------------------------------------------------------------
@ -91,7 +89,6 @@ class APigPlayer : public APlayerPawn
DECLARE_ACTOR (APigPlayer, APlayerPawn)
public:
void MorphPlayerThink ();
void ActivateMorphWeapon ();
};
FState APigPlayer::States[] =
@ -154,6 +151,7 @@ IMPLEMENT_ACTOR (APigPlayer, Hexen, -1, 0)
PROP_PlayerPawn_ForwardMove2 (FRACUNIT * 0x31 / 0x32)
PROP_PlayerPawn_SideMove1 (FRACUNIT * 0x17 / 0x18)
PROP_PlayerPawn_SideMove2 (FRACUNIT * 0x27 / 0x28)
PROP_PlayerPawn_MorphWeapon ("Snout")
PROP_PainSound ("PigPain")
PROP_DeathSound ("PigDeath")
@ -177,46 +175,23 @@ void APigPlayer::MorphPlayerThink ()
}
}
void APigPlayer::ActivateMorphWeapon ()
{
player->PendingWeapon = WP_NOCHANGE;
player->psprites[ps_weapon].sy = WEAPONTOP;
player->ReadyWeapon = player->mo->FindInventory<ASnout> ();
if (player->ReadyWeapon == NULL)
{
player->ReadyWeapon = static_cast<AWeapon *>(player->mo->GiveInventoryType (RUNTIME_CLASS(ASnout)));
}
if (player->ReadyWeapon != NULL)
{
P_SetPsprite (player, ps_weapon, player->ReadyWeapon->GetReadyState());
}
else
{
P_SetPsprite (player, ps_weapon, NULL);
}
P_SetPsprite (player, ps_flash, NULL);
}
// Pig (non-player) ---------------------------------------------------------
class APig : public AActor
class APig : public AMorphedMonster
{
DECLARE_ACTOR (APig, AActor)
public:
void Destroy ();
void Die (AActor *source, AActor *inflictor);
DECLARE_ACTOR (APig, AMorphedMonster)
};
FState APig::States[] =
{
#define S_PIG_LOOK1 0
S_NORMAL (PIGY, 'B', 10, A_PigLook , &States[S_PIG_LOOK1]),
S_NORMAL (PIGY, 'B', 10, A_Look , &States[S_PIG_LOOK1]),
#define S_PIG_WALK1 (S_PIG_LOOK1+1)
S_NORMAL (PIGY, 'A', 3, A_PigChase , &States[S_PIG_WALK1+1]),
S_NORMAL (PIGY, 'B', 3, A_PigChase , &States[S_PIG_WALK1+2]),
S_NORMAL (PIGY, 'C', 3, A_PigChase , &States[S_PIG_WALK1+3]),
S_NORMAL (PIGY, 'D', 3, A_PigChase , &States[S_PIG_WALK1]),
S_NORMAL (PIGY, 'A', 3, A_Chase , &States[S_PIG_WALK1+1]),
S_NORMAL (PIGY, 'B', 3, A_Chase , &States[S_PIG_WALK1+2]),
S_NORMAL (PIGY, 'C', 3, A_Chase , &States[S_PIG_WALK1+3]),
S_NORMAL (PIGY, 'D', 3, A_Chase , &States[S_PIG_WALK1]),
#define S_PIG_PAIN (S_PIG_WALK1+4)
S_NORMAL (PIGY, 'D', 4, A_PigPain , &States[S_PIG_WALK1]),
@ -265,24 +240,6 @@ IMPLEMENT_ACTOR (APig, Hexen, -1, 0)
PROP_ActiveSound ("PigActive1")
END_DEFAULTS
void APig::Destroy ()
{
if (tracer != NULL)
{
tracer->Destroy ();
}
Super::Destroy ();
}
void APig::Die (AActor *source, AActor *inflictor)
{
Super::Die (source, inflictor);
if (tracer != NULL && (tracer->flags & MF_UNMORPHED))
{
tracer->Die (source, inflictor);
}
}
//============================================================================
//
// A_SnoutAttack
@ -317,36 +274,6 @@ void A_SnoutAttack (AActor *actor)
}
}
//----------------------------------------------------------------------------
//
// PROC A_PigLook
//
//----------------------------------------------------------------------------
void A_PigLook (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 10))
{
return;
}
A_Look (actor);
}
//----------------------------------------------------------------------------
//
// PROC A_PigChase
//
//----------------------------------------------------------------------------
void A_PigChase (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 3))
{
return;
}
A_Chase(actor);
}
//============================================================================
//
// A_PigAttack
@ -355,10 +282,6 @@ void A_PigChase (AActor *actor)
void A_PigAttack (AActor *actor)
{
if (P_UpdateMorphedMonster (actor, 18))
{
return;
}
if (!actor->target)
{
return;

View file

@ -8,6 +8,7 @@
#include "s_sound.h"
#include "m_random.h"
#include "a_sharedglobal.h"
#include "ravenshared.h"
#define MORPHTICS (40*TICRATE)
@ -196,25 +197,26 @@ bool P_UndoPlayerMorph (player_t *player, bool force)
bool P_MorphMonster (AActor *actor, const PClass *spawntype)
{
AActor *morphed;
AMorphedMonster *morphed;
if (actor->player ||
if (actor->player || spawntype == NULL ||
actor->flags3 & MF3_DONTMORPH ||
!(actor->flags3 & MF3_ISMONSTER))
!(actor->flags3 & MF3_ISMONSTER) ||
!spawntype->IsDescendantOf (RUNTIME_CLASS(AMorphedMonster)))
{
return false;
}
morphed = Spawn (spawntype, actor->x, actor->y, actor->z, NO_REPLACE);
morphed = static_cast<AMorphedMonster *>(Spawn (spawntype, actor->x, actor->y, actor->z, NO_REPLACE));
DObject::PointerSubstitution (actor, morphed);
morphed->tid = actor->tid;
morphed->angle = actor->angle;
morphed->tracer = actor;
morphed->UnmorphedMe = actor;
morphed->alpha = actor->alpha;
morphed->RenderStyle = actor->RenderStyle;
morphed->special1 = MORPHTICS + pr_morphmonst();
morphed->special2 = actor->flags & ~MF_JUSTHIT;
morphed->UnmorphTime = level.time + MORPHTICS + pr_morphmonst();
morphed->FlagsSave = actor->flags & ~MF_JUSTHIT;
//morphed->special = actor->special;
//memcpy (morphed->args, actor->args, sizeof(actor->args));
morphed->CopyFriendliness (actor, true);
@ -222,7 +224,7 @@ bool P_MorphMonster (AActor *actor, const PClass *spawntype)
morphed->flags3 |= actor->flags3 & MF3_GHOST;
if (actor->renderflags & RF_INVISIBLE)
{
morphed->special2 |= MF_JUSTHIT;
morphed->FlagsSave |= MF_JUSTHIT;
}
morphed->AddToHash ();
actor->RemoveFromHash ();
@ -242,18 +244,18 @@ bool P_MorphMonster (AActor *actor, const PClass *spawntype)
//
//----------------------------------------------------------------------------
bool P_UpdateMorphedMonster (AActor *beast, int tics)
bool P_UpdateMorphedMonster (AMorphedMonster *beast)
{
AActor *actor;
beast->special1 -= tics;
if (beast->special1 > 0 ||
beast->tracer == NULL ||
if (beast->UnmorphTime == 0 ||
beast->UnmorphTime > level.time ||
beast->UnmorphedMe == NULL ||
beast->flags3 & MF3_STAYMORPHED)
{
return false;
}
actor = beast->tracer;
actor = beast->UnmorphedMe;
actor->SetOrigin (beast->x, beast->y, beast->z);
actor->flags |= MF_SOLID;
beast->flags &= ~MF_SOLID;
@ -261,18 +263,18 @@ bool P_UpdateMorphedMonster (AActor *beast, int tics)
{ // Didn't fit
actor->flags &= ~MF_SOLID;
beast->flags |= MF_SOLID;
beast->special1 = 5*TICRATE; // Next try in 5 seconds
beast->UnmorphTime = level.time + 5*TICRATE; // Next try in 5 seconds
return false;
}
actor->angle = beast->angle;
actor->target = beast->target;
actor->FriendPlayer = beast->FriendPlayer;
actor->flags = beast->special2 & ~MF_JUSTHIT;
actor->flags = beast->FlagsSave & ~MF_JUSTHIT;
actor->flags = (actor->flags & ~(MF_FRIENDLY|MF_SHADOW)) | (beast->flags & (MF_FRIENDLY|MF_SHADOW));
actor->flags3 = (actor->flags3 & ~(MF3_NOSIGHTCHECK|MF3_HUNTPLAYERS|MF3_GHOST))
| (beast->flags3 & (MF3_NOSIGHTCHECK|MF3_HUNTPLAYERS|MF3_GHOST));
actor->flags4 = (actor->flags4 & ~MF4_NOHATEPLAYERS) | (beast->flags4 & MF4_NOHATEPLAYERS);
if (!(beast->special2 & MF_JUSTHIT))
if (!(beast->FlagsSave & MF_JUSTHIT))
actor->renderflags &= ~RF_INVISIBLE;
actor->health = actor->GetDefault()->health;
actor->momx = beast->momx;
@ -282,7 +284,7 @@ bool P_UpdateMorphedMonster (AActor *beast, int tics)
actor->special = beast->special;
memcpy (actor->args, beast->args, sizeof(actor->args));
actor->AddToHash ();
beast->tracer = NULL;
beast->UnmorphedMe = NULL;
DObject::PointerSubstitution (beast, actor);
beast->Destroy ();
Spawn<ATeleportFog> (beast->x, beast->y, beast->z + TELEFOGHEIGHT, ALLOW_REPLACE);
@ -291,13 +293,6 @@ bool P_UpdateMorphedMonster (AActor *beast, int tics)
// Egg ----------------------------------------------------------------------
class AEggFX : public AActor
{
DECLARE_ACTOR (AEggFX, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState AEggFX::States[] =
{
#define S_EGGFX 0
@ -324,21 +319,30 @@ IMPLEMENT_ACTOR (AEggFX, Heretic, -1, 40)
PROP_SpawnState (S_EGGFX)
PROP_DeathState (S_EGGFXI1)
PROP_EggFX_PlayerClass ("ChickenPlayer")
PROP_EggFX_MonsterClass ("Chicken")
END_DEFAULTS
int AEggFX::DoSpecialDamage (AActor *target, int damage)
{
if (target->player)
{
P_MorphPlayer (target->player, PClass::FindClass (NAME_ChickenPlayer));
P_MorphPlayer (target->player, PClass::FindClass (ENamedName(PlayerClass)));
}
else
{
P_MorphMonster (target, PClass::FindClass (NAME_Chicken));
P_MorphMonster (target, PClass::FindClass (ENamedName(MonsterClass)));
}
return -1;
}
void AEggFX::Serialize (FArchive &arc)
{
Super::Serialize (arc);
arc << PlayerClass << MonsterClass;
}
// Morph Ovum ----------------------------------------------------------------
class AArtiEgg : public AInventory
@ -379,11 +383,9 @@ bool AArtiEgg::Use (bool pickup)
// Pork missile --------------------------------------------------------------
class APorkFX : public AActor
class APorkFX : public AEggFX
{
DECLARE_ACTOR (APorkFX, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
DECLARE_ACTOR (APorkFX, AEggFX)
};
FState APorkFX::States[] =
@ -412,20 +414,10 @@ IMPLEMENT_ACTOR (APorkFX, Hexen, -1, 40)
PROP_SpawnState (S_EGGFX)
PROP_DeathState (S_EGGFXI2)
END_DEFAULTS
int APorkFX::DoSpecialDamage (AActor *target, int damage)
{
if (target->player)
{
P_MorphPlayer (target->player, PClass::FindClass (NAME_PigPlayer));
}
else
{
P_MorphMonster (target, PClass::FindClass (NAME_Pig));
}
return -1;
}
PROP_EggFX_PlayerClass ("PigPlayer")
PROP_EggFX_MonsterClass ("Pig")
END_DEFAULTS
// Porkalator ---------------------------------------------------------------
@ -469,3 +461,49 @@ bool AArtiPork::Use (bool pickup)
return true;
}
// Morphed Monster (you must subclass this to do something useful) ---------
IMPLEMENT_POINTY_CLASS (AMorphedMonster)
DECLARE_POINTER (UnmorphedMe)
END_POINTERS
BEGIN_STATELESS_DEFAULTS (AMorphedMonster, Any, -1, 0)
PROP_Flags (MF_SOLID|MF_SHOOTABLE)
PROP_Flags2 (MF2_MCROSS|MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
PROP_Flags3 (MF3_DONTMORPH|MF3_ISMONSTER)
END_DEFAULTS
void AMorphedMonster::Serialize (FArchive &arc)
{
Super::Serialize (arc);
arc << UnmorphedMe << UnmorphTime << FlagsSave;
}
void AMorphedMonster::Destroy ()
{
if (UnmorphedMe != NULL)
{
UnmorphedMe->Destroy ();
}
Super::Destroy ();
}
void AMorphedMonster::Die (AActor *source, AActor *inflictor)
{
// Dead things don't unmorph
source->flags3 |= MF3_STAYMORPHED;
Super::Die (source, inflictor);
if (UnmorphedMe != NULL && (UnmorphedMe->flags & MF_UNMORPHED))
{
UnmorphedMe->health = health;
UnmorphedMe->Die (source, inflictor);
}
}
void AMorphedMonster::Tick ()
{
if (!P_UpdateMorphedMonster (this))
{
Super::Tick ();
}
}

View file

@ -8,7 +8,7 @@ bool P_MorphPlayer (player_s *player);
bool P_UndoPlayerMorph (player_s *player, bool force);
bool P_MorphMonster (AActor *actor, const PClass *morphClass);
bool P_UpdateMorphedMonster (AActor *actor, int tics);
bool P_UpdateMorphedMonster (AActor *actor);
class AMinotaur : public AActor
{
@ -36,4 +36,29 @@ public:
void Serialize (FArchive &arc);
};
class AEggFX : public AActor
{
DECLARE_ACTOR (AEggFX, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
void Serialize (FArchive &arc);
int PlayerClass, MonsterClass; // actually names
};
class AMorphedMonster : public AActor
{
DECLARE_ACTOR (AMorphedMonster, AActor)
HAS_OBJECT_POINTERS
public:
void Tick ();
void Serialize (FArchive &arc);
void Die (AActor *source, AActor *inflictor);
void Destroy ();
AActor *UnmorphedMe;
int UnmorphTime;
DWORD FlagsSave;
};
#endif //__RAVENSHARED_H__

View file

@ -245,7 +245,10 @@ enum
ADEF_PlayerPawn_DisplayName,
ADEF_PlayerPawn_SoundClass,
ADEF_PlayerPawn_ScoreIcon,
ADEF_LastString = ADEF_PlayerPawn_ScoreIcon,
ADEF_PlayerPawn_MorphWeapon,
ADEF_EggFX_PlayerClass,
ADEF_EggFX_MonsterClass,
ADEF_LastString = ADEF_EggFX_MonsterClass,
// The rest of the properties use their type field (upper 2 bits)
ADEF_XScale,

View file

@ -46,6 +46,7 @@
#include "w_wad.h"
#include "a_strifeglobal.h"
#include "thingdef.h"
#include "ravenshared.h"
void FActorInfo::BuildDefaults ()
{
@ -129,6 +130,7 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint)
ASigil *const sigil = (ASigil *)sgDefaults;
AAmmo *const ammo = (AAmmo *)sgDefaults;
APlayerPawn *const player = (APlayerPawn *)sgDefaults;
AEggFX *const eggfx = (AEggFX *)sgDefaults;
switch (defnum)
{
@ -325,6 +327,7 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint)
case ADEF_PlayerPawn_ColorRange: sgClass->Meta.SetMetaInt (APMETA_ColorRange, dataint); break;
case ADEF_PlayerPawn_CrouchSprite: player->crouchsprite = GetSpriteIndex(datastr); break;
case ADEF_PlayerPawn_SpawnMask: player->SpawnMask = dataint; break;
case ADEF_PlayerPawn_MorphWeapon: player->MorphWeapon = FName(datastr); break;
case ADEF_PlayerPawn_DisplayName:
sgClass->Meta.SetMetaString (APMETA_DisplayName, datastr);
@ -340,6 +343,9 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint)
}
break;
case ADEF_EggFX_PlayerClass: eggfx->PlayerClass = FName(datastr); break;
case ADEF_EggFX_MonsterClass: eggfx->MonsterClass = FName(datastr); break;
}
}

View file

@ -215,6 +215,9 @@ public:
#define PROP_PlayerPawn_DisplayName(x) ADD_STRING_PROP(ADEF_PlayerPawn_DisplayName,"\25",x)
#define PROP_PlayerPawn_SoundClass(x) ADD_STRING_PROP(ADEF_PlayerPawn_SoundClass,"\26",x)
#define PROP_PlayerPawn_ScoreIcon(x) ADD_STRING_PROP(ADEF_PlayerPawn_ScoreIcon,"\27",x)
#define PROP_PlayerPawn_MorphWeapon(x) ADD_STRING_PROP(ADEF_PlayerPawn_MorphWeapon,"\30",x)
#define PROP_EggFX_PlayerClass(x) ADD_STRING_PROP(ADEF_EggFX_PlayerClass,"\31",x)
#define PROP_EggFX_MonsterClass(x) ADD_STRING_PROP(ADEF_EggFX_MonsterClass,"\32",x)
#define PROP_XScale(x) ADD_BYTE_PROP(ADEF_XScale,x)
#define PROP_YScale(x) ADD_BYTE_PROP(ADEF_YScale,x)

View file

@ -3942,10 +3942,12 @@ void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AAc
if (th->tics < 1)
th->tics = 1;
}
th->SetDamage (damage);
// colorize the blood!
if (bloodcolor!=0) th->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a);
if (bloodcolor != 0)
{
th->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a);
}
th->SetDamage (damage);
}
if (cl_bloodtype >= 1)

View file

@ -382,6 +382,7 @@ BEGIN_STATELESS_DEFAULTS (APlayerPawn, Any, -1, 0)
PROP_PlayerPawn_SideMove2 (FRACUNIT)
PROP_PlayerPawn_ColorRange (0, 0)
PROP_PlayerPawn_SoundClass ("player")
PROP_PlayerPawn_MorphWeapon ("None")
END_DEFAULTS
IMPLEMENT_ABSTRACT_ACTOR (APlayerChunk)
@ -399,7 +400,8 @@ void APlayerPawn::Serialize (FArchive &arc)
<< SideMove2
<< ScoreIcon
<< InvFirst
<< InvSel;
<< InvSel
<< MorphWeapon;
}
//===========================================================================
@ -911,6 +913,32 @@ void APlayerPawn::MorphPlayerThink ()
void APlayerPawn::ActivateMorphWeapon ()
{
const PClass *morphweapon = PClass::FindClass (ENamedName(MorphWeapon));
player->PendingWeapon = WP_NOCHANGE;
player->psprites[ps_weapon].sy = WEAPONTOP;
if (morphweapon == NULL || !morphweapon->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
{ // No weapon at all while morphed!
player->ReadyWeapon = NULL;
P_SetPsprite (player, ps_weapon, NULL);
}
else
{
player->ReadyWeapon = static_cast<AWeapon *>(player->mo->FindInventory (morphweapon));
if (player->ReadyWeapon == NULL)
{
player->ReadyWeapon = static_cast<AWeapon *>(player->mo->GiveInventoryType (morphweapon));
}
if (player->ReadyWeapon != NULL)
{
P_SetPsprite (player, ps_weapon, player->ReadyWeapon->GetReadyState());
}
else
{
P_SetPsprite (player, ps_weapon, NULL);
}
}
P_SetPsprite (player, ps_flash, NULL);
}
//===========================================================================

View file

@ -67,6 +67,7 @@
#include "p_conversation.h"
#include "v_text.h"
#include "thingdef.h"
#include "ravenshared.h"
const PClass *QuestItemClasses[31];
@ -508,6 +509,19 @@ ACTOR(RadiusThrust)
#include "d_dehackedactions.h"
/* What do the parameter letters mean?
*
* If the letter is uppercase, it is required. Lowercase letters are optional.
* i = integer
* f = fixed point
* s = sound name
* m = actor name
* t = string
* l = jump label
* c = color
* x = expression
* y = expression
*/
#define FUNC(name, parm) { #name, name, parm },
// Declare the code pointer table
AFuncDesc AFTable[]=
@ -664,14 +678,14 @@ AFuncDesc AFTable[]=
FUNC(A_JumpIfInventory, "MXL" )
FUNC(A_GiveInventory, "Mx" )
FUNC(A_TakeInventory, "Mx" )
FUNC(A_SpawnItem, "Mxxy" )
FUNC(A_SpawnItem, "Mxxyx" )
FUNC(A_ThrowGrenade, "Mxxxy" )
FUNC(A_SelectWeapon, "M")
FUNC(A_Print, "T")
FUNC(A_SetTranslucent, "Xx")
FUNC(A_FadeIn, "x")
FUNC(A_FadeOut, "x")
FUNC(A_SpawnDebris, "M")
FUNC(A_SpawnDebris, "Mx")
FUNC(A_CheckSight, "L")
FUNC(A_ExtChase, "XXyx")
FUNC(A_DropInventory, "M")
@ -1710,7 +1724,7 @@ do_stop:
break;
case 'C':
case 'c':
case 'c': // Color
SC_MustGetString ();
if (SC_Compare("none"))
{
@ -3620,6 +3634,15 @@ static void PlayerMaxHealth (APlayerPawn *defaults, Baggage &bag)
defaults->MaxHealth = sc_Number;
}
//==========================================================================
//
//==========================================================================
static void PlayerMorphWeapon (APlayerPawn *defaults, Baggage &bag)
{
SC_MustGetString ();
defaults->MorphWeapon = FName(sc_String);
}
//==========================================================================
//
//==========================================================================
@ -3675,6 +3698,24 @@ static void PlayerStartItem (APlayerPawn *defaults, Baggage &bag)
bag.DropItemList = di;
}
//==========================================================================
//
//==========================================================================
static void EggFXMonsterClass (AEggFX *defaults, Baggage &bag)
{
SC_MustGetString ();
defaults->MonsterClass = FName(sc_String);
}
//==========================================================================
//
//==========================================================================
static void EggFXPlayerClass (AEggFX *defaults, Baggage &bag)
{
SC_MustGetString ();
defaults->PlayerClass = FName(sc_String);
}
//==========================================================================
//
//==========================================================================
@ -3739,6 +3780,8 @@ static const ActorProps props[] =
{ "disintegrate", ActorDisintegrateState, RUNTIME_CLASS(AActor) },
{ "donthurtshooter", ActorDontHurtShooter, RUNTIME_CLASS(AActor) },
{ "dropitem", ActorDropItem, RUNTIME_CLASS(AActor) },
{ "eggfx.playerclass", (apf)EggFXPlayerClass, RUNTIME_CLASS(AEggFX) },
{ "eggfx.monsterclass", (apf)EggFXMonsterClass, RUNTIME_CLASS(AEggFX) },
{ "explosiondamage", ActorExplosionDamage, RUNTIME_CLASS(AActor) },
{ "explosionradius", ActorExplosionRadius, RUNTIME_CLASS(AActor) },
{ "fastspeed", ActorFastSpeed, RUNTIME_CLASS(AActor) },
@ -3782,6 +3825,7 @@ static const ActorProps props[] =
{ "player.forwardmove", (apf)PlayerForwardMove, RUNTIME_CLASS(APlayerPawn) },
{ "player.jumpz", (apf)PlayerJumpZ, RUNTIME_CLASS(APlayerPawn) },
{ "player.maxhealth", (apf)PlayerMaxHealth, RUNTIME_CLASS(APlayerPawn) },
{ "player.morphweapon", (apf)PlayerMorphWeapon, RUNTIME_CLASS(APlayerPawn) },
{ "player.scoreicon", (apf)PlayerScoreIcon, RUNTIME_CLASS(APlayerPawn) },
{ "player.sidemove", (apf)PlayerSideMove, RUNTIME_CLASS(APlayerPawn) },
{ "player.soundclass", (apf)PlayerSoundClass, RUNTIME_CLASS(APlayerPawn) },

View file

@ -1118,13 +1118,14 @@ void A_TakeFromTarget(AActor * self)
void A_SpawnItem(AActor * self)
{
FState * CallingState;
int index=CheckIndex(4, &CallingState);
int index=CheckIndex(5, &CallingState);
if (index<0) return;
const PClass * missile= PClass::FindClass((ENamedName)StateParameters[index]);
fixed_t distance = fixed_t(EvalExpressionF (StateParameters[index+1], self) * FRACUNIT);
fixed_t zheight = fixed_t(EvalExpressionF (StateParameters[index+2], self) * FRACUNIT);
bool useammo = EvalExpressionN (StateParameters[index+3], self);
BOOL transfer_translation = EvalExpressionI (StateParameters[index+4], self);
if (!missile)
{
@ -1156,6 +1157,11 @@ void A_SpawnItem(AActor * self)
{
AActor * originator = self;
if (transfer_translation)
{
mo->Translation = self->Translation;
}
mo->angle=self->angle;
while (originator && isMissile(originator)) originator = originator->target;
@ -1407,9 +1413,11 @@ void A_SpawnDebris(AActor * self)
AActor * mo;
const PClass * debris;
int index=CheckIndex(1, NULL);
int index=CheckIndex(2, NULL);
if (index<0) return;
BOOL transfer_translation = EvalExpressionI (StateParameters[index+1], self);
debris = PClass::FindClass((ENamedName)StateParameters[index]);
if (debris == NULL) return;
@ -1418,6 +1426,10 @@ void A_SpawnDebris(AActor * self)
mo = Spawn(debris, self->x+((pr_spawndebris()-128)<<12),
self->y+((pr_spawndebris()-128)<<12),
self->z+(pr_spawndebris()*self->height/256), ALLOW_REPLACE);
if (mo && transfer_translation)
{
mo->Translation = self->Translation;
}
if (mo && i < mo->GetClass()->ActorInfo->NumOwnedStates)
{
mo->SetState (mo->GetClass()->ActorInfo->OwnedStates + i);

View file

@ -1,5 +1,5 @@
/* ANSI-C code produced by gperf version 3.0.1 */
/* Command-line: gperf -tE -LANSI-C -Hspecialhash -Nis_special -C --null-strings thingdef_specials.gperf */
/* Command-line: gperf -m10000 -tE -LANSI-C -Hspecialhash -Nis_special -C --null-strings thingdef_specials.gperf */
/* Computed positions: -k'1,7,9,14,17' */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@ -31,7 +31,7 @@
#line 10 "thingdef_specials.gperf"
struct ACSspecials { const char *name; unsigned char Special; unsigned char MinArgs; unsigned char MaxArgs; };
/* maximum key range = 567, duplicates = 0 */
/* maximum key range = 326, duplicates = 0 */
#ifdef __GNUC__
__inline
@ -45,32 +45,32 @@ specialhash (register const char *str, register unsigned int len)
{
static const unsigned short asso_values[] =
{
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 60, 580, 0, 105, 20,
200, 10, 140, 0, 30, 155, 75, 0, 5, 165,
85, 70, 65, 580, 0, 5, 5, 65, 30, 10,
5, 30, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
580, 580, 580, 580, 580, 580
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 53, 356, 20, 85, 15,
107, 13, 88, 10, 68, 95, 10, 10, 13, 136,
72, 84, 44, 356, 10, 11, 12, 28, 53, 69,
10, 75, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
356, 356, 356, 356, 356, 356
};
register int hval = len;
@ -115,11 +115,11 @@ is_special (register const char *str, register unsigned int len)
{
enum
{
TOTAL_KEYWORDS = 166,
TOTAL_KEYWORDS = 169,
MIN_WORD_LENGTH = 8,
MAX_WORD_LENGTH = 29,
MIN_HASH_VALUE = 13,
MAX_HASH_VALUE = 579
MIN_HASH_VALUE = 30,
MAX_HASH_VALUE = 355
};
static const struct ACSspecials wordlist[] =
@ -127,487 +127,429 @@ is_special (register const char *str, register unsigned int len)
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 76 "thingdef_specials.gperf"
{"teleport",70,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 93 "thingdef_specials.gperf"
{"teleportgroup",77,5},
{(char*)0}, {(char*)0},
#line 88 "thingdef_specials.gperf"
{"thing_spawn",135,3,4},
#line 49 "thingdef_specials.gperf"
{"light_strobe",116,5},
{(char*)0}, {(char*)0}, {(char*)0},
#line 13 "thingdef_specials.gperf"
{"acs_suspend",81,2},
{(char*)0},
#line 145 "thingdef_specials.gperf"
{"thing_setgoal",229,3},
{(char*)0}, {(char*)0},
#line 160 "thingdef_specials.gperf"
{"exit_secret",244,1},
#line 107 "thingdef_specials.gperf"
{"line_alignceiling",183,2},
{(char*)0},
#line 82 "thingdef_specials.gperf"
{"thing_activate",130,1},
{(char*)0}, {(char*)0},
#line 126 "thingdef_specials.gperf"
{"generic_lift",203,5},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 93 "thingdef_specials.gperf"
{"teleportgroup",77,5},
#line 49 "thingdef_specials.gperf"
{"light_strobe",116,5},
#line 160 "thingdef_specials.gperf"
{"exit_secret",244,1},
#line 145 "thingdef_specials.gperf"
{"thing_setgoal",229,3},
{(char*)0},
#line 126 "thingdef_specials.gperf"
{"generic_lift",203,5},
{(char*)0}, {(char*)0}, {(char*)0},
#line 88 "thingdef_specials.gperf"
{"thing_spawn",135,3,4},
#line 13 "thingdef_specials.gperf"
{"acs_suspend",81,2},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 127 "thingdef_specials.gperf"
{"generic_stairs",204,5},
#line 105 "thingdef_specials.gperf"
{"thing_settranslation",180,2},
{(char*)0},
#line 99 "thingdef_specials.gperf"
{"thing_spawnfacing",139,2,4},
{(char*)0}, {(char*)0},
#line 102 "thingdef_specials.gperf"
{"thing_hate",177,2,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 91 "thingdef_specials.gperf"
{"ceiling_waggle",38,5},
#line 170 "thingdef_specials.gperf"
{"ceiling_lowertofloor",254,2},
{(char*)0},
#line 168 "thingdef_specials.gperf"
{"ceiling_raisetonearest",252,2},
{(char*)0}, {(char*)0}, {(char*)0},
#line 16 "thingdef_specials.gperf"
{"ceiling_crushandraise",42,3},
#line 119 "thingdef_specials.gperf"
{"ceiling_crushandraisea",196,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 128 "thingdef_specials.gperf"
{"generic_crusher",205,5},
#line 18 "thingdef_specials.gperf"
{"ceiling_lowerandcrush",43,3},
{(char*)0}, {(char*)0},
#line 82 "thingdef_specials.gperf"
{"thing_activate",130,1},
#line 12 "thingdef_specials.gperf"
{"acs_execute",80,1,5},
{(char*)0}, {(char*)0}, {(char*)0},
#line 107 "thingdef_specials.gperf"
{"line_alignceiling",183,2},
{(char*)0},
#line 120 "thingdef_specials.gperf"
{"ceiling_crushandraisesilenta",197,4},
#line 105 "thingdef_specials.gperf"
{"thing_settranslation",180,2},
{(char*)0}, {(char*)0}, {(char*)0},
#line 168 "thingdef_specials.gperf"
{"ceiling_raisetonearest",252,2},
#line 170 "thingdef_specials.gperf"
{"ceiling_lowertofloor",254,2},
{(char*)0},
#line 99 "thingdef_specials.gperf"
{"thing_spawnfacing",139,2,4},
#line 21 "thingdef_specials.gperf"
{"ceiling_crushraiseandstay",45,3},
#line 118 "thingdef_specials.gperf"
{"ceiling_crushraiseandstaya",195,4},
{(char*)0}, {(char*)0},
#line 171 "thingdef_specials.gperf"
{"ceiling_crushraiseandstaysila",255,4},
{(char*)0}, {(char*)0},
#line 15 "thingdef_specials.gperf"
{"acs_lockedexecute",83,5},
#line 135 "thingdef_specials.gperf"
{"teleport_line",215,2},
#line 77 "thingdef_specials.gperf"
{"teleport_nofog",71,1,2},
#line 78 "thingdef_specials.gperf"
{"teleport_newmap",74,2},
#line 79 "thingdef_specials.gperf"
{"teleport_endgame",75,0},
#line 141 "thingdef_specials.gperf"
{"scroll_floor",223,4},
#line 171 "thingdef_specials.gperf"
{"ceiling_crushraiseandstaysila",255,4},
#line 16 "thingdef_specials.gperf"
{"ceiling_crushandraise",42,3},
#line 119 "thingdef_specials.gperf"
{"ceiling_crushandraisea",196,4},
#line 15 "thingdef_specials.gperf"
{"acs_lockedexecute",83,5},
#line 18 "thingdef_specials.gperf"
{"ceiling_lowerandcrush",43,3},
{(char*)0}, {(char*)0},
#line 47 "thingdef_specials.gperf"
{"light_glow",114,4},
#line 12 "thingdef_specials.gperf"
{"acs_execute",80,1,5},
#line 180 "thingdef_specials.gperf"
{"acs_lockedexecutedoor",85,5},
#line 120 "thingdef_specials.gperf"
{"ceiling_crushandraisesilenta",197,4},
#line 77 "thingdef_specials.gperf"
{"teleport_nofog",71,1,2},
{(char*)0},
#line 92 "thingdef_specials.gperf"
{"teleportother",76,3},
#line 142 "thingdef_specials.gperf"
{"scroll_ceiling",224,4},
#line 50 "thingdef_specials.gperf"
{"light_stop",117,1},
#line 134 "thingdef_specials.gperf"
{"sector_setdamage",214,3},
#line 114 "thingdef_specials.gperf"
{"setplayerproperty",191,3},
{(char*)0}, {(char*)0},
#line 108 "thingdef_specials.gperf"
{"line_alignfloor",184,2},
#line 148 "thingdef_specials.gperf"
{"light_strobedoom",232,3},
#line 139 "thingdef_specials.gperf"
{"sector_setcurrent",220,4},
{(char*)0},
#line 102 "thingdef_specials.gperf"
{"thing_hate",177,2,3},
#line 70 "thingdef_specials.gperf"
{"radius_quake",120,5},
#line 133 "thingdef_specials.gperf"
{"sector_setfade",213,4},
#line 177 "thingdef_specials.gperf"
{"noisealert",173,2},
#line 63 "thingdef_specials.gperf"
{"polyobj_rotateright",3,3},
#line 175 "thingdef_specials.gperf"
{"acs_executewithresult",84,1,4},
{(char*)0},
#line 59 "thingdef_specials.gperf"
{"plat_stop",61,1},
#line 78 "thingdef_specials.gperf"
{"teleport_newmap",74,2},
#line 79 "thingdef_specials.gperf"
{"teleport_endgame",75,0},
#line 17 "thingdef_specials.gperf"
{"ceiling_crushstop",44,1},
#line 134 "thingdef_specials.gperf"
{"sector_setdamage",214,3},
{(char*)0}, {(char*)0},
#line 139 "thingdef_specials.gperf"
{"sector_setcurrent",220,4},
#line 47 "thingdef_specials.gperf"
{"light_glow",114,4},
#line 50 "thingdef_specials.gperf"
{"light_stop",117,1},
#line 92 "thingdef_specials.gperf"
{"teleportother",76,3},
{(char*)0},
#line 91 "thingdef_specials.gperf"
{"ceiling_waggle",38,5},
#line 112 "thingdef_specials.gperf"
{"sector_setceilingscale",188,5},
{(char*)0},
#line 110 "thingdef_specials.gperf"
{"sector_setceilingpanning",186,5},
{(char*)0}, {(char*)0},
#line 143 "thingdef_specials.gperf"
{"acs_executealways",226,1,5},
{(char*)0}, {(char*)0}, {(char*)0},
#line 175 "thingdef_specials.gperf"
{"acs_executewithresult",84,1,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0},
#line 45 "thingdef_specials.gperf"
{"light_changetovalue",112,2},
{(char*)0},
#line 169 "thingdef_specials.gperf"
{"ceiling_lowertolowest",253,2},
{(char*)0}, {(char*)0}, {(char*)0},
#line 144 "thingdef_specials.gperf"
{"plat_raiseandstaytx0",228,2},
{(char*)0},
#line 17 "thingdef_specials.gperf"
{"ceiling_crushstop",44,1},
{(char*)0}, {(char*)0},
#line 173 "thingdef_specials.gperf"
{"clearforcefield",34,1},
{(char*)0}, {(char*)0},
#line 44 "thingdef_specials.gperf"
{"light_lowerbyvalue",111,2},
{(char*)0}, {(char*)0}, {(char*)0},
#line 70 "thingdef_specials.gperf"
{"radius_quake",120,5},
{(char*)0}, {(char*)0},
#line 124 "thingdef_specials.gperf"
{"generic_ceiling",201,5},
{(char*)0}, {(char*)0}, {(char*)0},
#line 59 "thingdef_specials.gperf"
{"plat_stop",61,1},
#line 20 "thingdef_specials.gperf"
{"ceiling_raisebyvalue",41,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 19 "thingdef_specials.gperf"
{"ceiling_lowerbyvalue",40,3},
#line 121 "thingdef_specials.gperf"
{"ceiling_raisebyvaluetimes8",198,3},
#line 136 "thingdef_specials.gperf"
{"sector_setgravity",216,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 122 "thingdef_specials.gperf"
{"ceiling_lowerbyvaluetimes8",199,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 132 "thingdef_specials.gperf"
{"sector_setcolor",212,4,5},
{(char*)0},
#line 90 "thingdef_specials.gperf"
{"floor_waggle",138,5},
#line 109 "thingdef_specials.gperf"
{"sector_setrotation",185,3},
#line 56 "thingdef_specials.gperf"
{"plat_upwaitdownstay",64,3},
{(char*)0},
#line 89 "thingdef_specials.gperf"
{"thing_spawnnofog",137,3,4},
#line 111 "thingdef_specials.gperf"
{"sector_setfloorpanning",187,5},
#line 14 "thingdef_specials.gperf"
{"acs_terminate",82,2},
#line 63 "thingdef_specials.gperf"
{"polyobj_rotateright",3,3},
#line 162 "thingdef_specials.gperf"
{"elevator_movetofloor",246,2},
#line 106 "thingdef_specials.gperf"
{"line_mirror",182,0},
{(char*)0},
#line 123 "thingdef_specials.gperf"
{"generic_floor",200,5},
#line 140 "thingdef_specials.gperf"
{"scroll_texture_both",221,5},
{(char*)0},
#line 124 "thingdef_specials.gperf"
{"generic_ceiling",201,5},
#line 178 "thingdef_specials.gperf"
{"thing_raise",17,1},
#line 106 "thingdef_specials.gperf"
{"line_mirror",182,0},
#line 80 "thingdef_specials.gperf"
{"thrustthing",72,2,4},
#line 98 "thingdef_specials.gperf"
{"thrustthingz",128,4},
{(char*)0}, {(char*)0},
#line 131 "thingdef_specials.gperf"
{"translucentline",208,2,3},
#line 94 "thingdef_specials.gperf"
{"teleportinsector",78,4,5},
#line 87 "thingdef_specials.gperf"
{"thing_remove",132,1},
{(char*)0},
#line 57 "thingdef_specials.gperf"
{"plat_upbyvalue",65,4},
#line 113 "thingdef_specials.gperf"
{"sector_setfloorscale",189,5},
#line 97 "thingdef_specials.gperf"
{"thing_setspecial",127,5},
{(char*)0}, {(char*)0},
#line 31 "thingdef_specials.gperf"
{"floor_lowertolowest",21,2},
#line 146 "thingdef_specials.gperf"
{"plat_upbyvaluestaytx",230,3},
#line 104 "thingdef_specials.gperf"
{"changeskill",179,1},
{(char*)0},
#line 157 "thingdef_specials.gperf"
{"floor_lowertolowesttxty",241,2},
#line 164 "thingdef_specials.gperf"
{"healthing",248,1,2},
#line 101 "thingdef_specials.gperf"
{"thing_changetid",176,2},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 117 "thingdef_specials.gperf"
{"ceiling_raiseinstant",194,3},
#line 53 "thingdef_specials.gperf"
{"pillar_open",30,4},
#line 148 "thingdef_specials.gperf"
{"light_strobedoom",232,3},
#line 108 "thingdef_specials.gperf"
{"line_alignfloor",184,2},
{(char*)0},
#line 51 "thingdef_specials.gperf"
{"pillar_build",29,3},
#line 71 "thingdef_specials.gperf"
{"sector_changesound",140,2},
#line 14 "thingdef_specials.gperf"
{"acs_terminate",82,2},
{(char*)0},
#line 131 "thingdef_specials.gperf"
{"translucentline",208,2,3},
#line 23 "thingdef_specials.gperf"
{"door_close",10,2},
#line 173 "thingdef_specials.gperf"
{"clearforcefield",34,1},
#line 84 "thingdef_specials.gperf"
{"thing_destroy",133,1,2},
#line 125 "thingdef_specials.gperf"
{"generic_door",202,5},
#line 94 "thingdef_specials.gperf"
{"teleportinsector",78,4,5},
#line 97 "thingdef_specials.gperf"
{"thing_setspecial",127,5},
#line 89 "thingdef_specials.gperf"
{"thing_spawnnofog",137,3,4},
#line 25 "thingdef_specials.gperf"
{"door_raise",12,3},
{(char*)0},
#line 116 "thingdef_specials.gperf"
{"ceiling_lowerinstant",193,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 73 "thingdef_specials.gperf"
{"stairs_buildup",27,5},
#line 96 "thingdef_specials.gperf"
{"thing_move",125,2},
{(char*)0},
#line 53 "thingdef_specials.gperf"
{"pillar_open",30,4},
{(char*)0}, {(char*)0},
#line 169 "thingdef_specials.gperf"
{"ceiling_lowertolowest",253,2},
{(char*)0},
#line 101 "thingdef_specials.gperf"
{"thing_changetid",176,2},
#line 143 "thingdef_specials.gperf"
{"acs_executealways",226,1,5},
{(char*)0},
#line 20 "thingdef_specials.gperf"
{"ceiling_raisebyvalue",41,3},
{(char*)0},
#line 117 "thingdef_specials.gperf"
{"ceiling_raiseinstant",194,3},
#line 19 "thingdef_specials.gperf"
{"ceiling_lowerbyvalue",40,3},
#line 45 "thingdef_specials.gperf"
{"light_changetovalue",112,2},
#line 116 "thingdef_specials.gperf"
{"ceiling_lowerinstant",193,3},
#line 121 "thingdef_specials.gperf"
{"ceiling_raisebyvaluetimes8",198,3},
{(char*)0}, {(char*)0},
#line 122 "thingdef_specials.gperf"
{"ceiling_lowerbyvaluetimes8",199,3},
#line 87 "thingdef_specials.gperf"
{"thing_remove",132,1},
{(char*)0},
#line 115 "thingdef_specials.gperf"
{"ceiling_lowertohighestfloor",192,2},
{(char*)0}, {(char*)0},
#line 25 "thingdef_specials.gperf"
{"door_raise",12,3},
#line 72 "thingdef_specials.gperf"
{"stairs_builddown",26,5},
#line 153 "thingdef_specials.gperf"
{"changecamera",237,3},
{(char*)0}, {(char*)0},
#line 23 "thingdef_specials.gperf"
{"door_close",10,2},
#line 83 "thingdef_specials.gperf"
{"thing_deactivate",131,1},
#line 150 "thingdef_specials.gperf"
{"light_maxneighbor",234,1},
#line 84 "thingdef_specials.gperf"
{"thing_destroy",133,1,2},
{(char*)0},
#line 74 "thingdef_specials.gperf"
{"stairs_builddownsync",31,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 125 "thingdef_specials.gperf"
{"generic_door",202,5},
{(char*)0}, {(char*)0},
#line 158 "thingdef_specials.gperf"
{"floor_lowertohighest",242,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 55 "thingdef_specials.gperf"
{"plat_downbyvalue",63,4},
{(char*)0},
#line 165 "thingdef_specials.gperf"
{"door_closewaitopen",249,3},
{(char*)0}, {(char*)0},
#line 83 "thingdef_specials.gperf"
{"thing_deactivate",131,1},
#line 132 "thingdef_specials.gperf"
{"sector_setcolor",212,4,5},
{(char*)0},
#line 153 "thingdef_specials.gperf"
{"changecamera",237,3},
#line 90 "thingdef_specials.gperf"
{"floor_waggle",138,5},
{(char*)0},
#line 144 "thingdef_specials.gperf"
{"plat_raiseandstaytx0",228,2},
#line 164 "thingdef_specials.gperf"
{"healthing",248,1,2},
#line 62 "thingdef_specials.gperf"
{"polyobj_rotateleft",2,3},
#line 68 "thingdef_specials.gperf"
{"polyobj_or_rotateleft",90,3},
#line 69 "thingdef_specials.gperf"
{"polyobj_or_rotateright",91,3},
#line 163 "thingdef_specials.gperf"
{"elevator_lowertonearest",247,2},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 57 "thingdef_specials.gperf"
{"plat_upbyvalue",65,4},
{(char*)0},
#line 72 "thingdef_specials.gperf"
{"stairs_builddown",26,5},
#line 140 "thingdef_specials.gperf"
{"scroll_texture_both",221,5},
#line 44 "thingdef_specials.gperf"
{"light_lowerbyvalue",111,2},
#line 162 "thingdef_specials.gperf"
{"elevator_movetofloor",246,2},
#line 113 "thingdef_specials.gperf"
{"sector_setfloorscale",189,5},
{(char*)0},
#line 138 "thingdef_specials.gperf"
{"sector_setwind",218,4},
#line 109 "thingdef_specials.gperf"
{"sector_setrotation",185,3},
{(char*)0},
#line 114 "thingdef_specials.gperf"
{"setplayerproperty",191,3},
#line 61 "thingdef_specials.gperf"
{"polyobj_move",4,4},
#line 111 "thingdef_specials.gperf"
{"sector_setfloorpanning",187,5},
#line 65 "thingdef_specials.gperf"
{"polyobj_doorslide",8,5},
{(char*)0},
#line 67 "thingdef_specials.gperf"
{"polyobj_or_move",92,4},
#line 74 "thingdef_specials.gperf"
{"stairs_builddownsync",31,4},
#line 56 "thingdef_specials.gperf"
{"plat_upwaitdownstay",64,3},
#line 48 "thingdef_specials.gperf"
{"light_flicker",115,3},
{(char*)0},
#line 96 "thingdef_specials.gperf"
{"thing_move",125,2},
{(char*)0},
#line 42 "thingdef_specials.gperf"
{"light_forcelightning",109,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 67 "thingdef_specials.gperf"
{"polyobj_or_move",92,4},
#line 159 "thingdef_specials.gperf"
{"exit_normal",243,1},
{(char*)0},
#line 161 "thingdef_specials.gperf"
{"elevator_raisetonearest",245,2},
{(char*)0},
#line 32 "thingdef_specials.gperf"
{"floor_lowertonearest",22,2},
{(char*)0}, {(char*)0},
#line 29 "thingdef_specials.gperf"
{"floor_lowerinstant",66,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 27 "thingdef_specials.gperf"
{"floor_lowerbyvalue",20,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 174 "thingdef_specials.gperf"
{"teleport_zombiechanger",39,2},
#line 31 "thingdef_specials.gperf"
{"floor_lowertolowest",21,2},
#line 146 "thingdef_specials.gperf"
{"plat_upbyvaluestaytx",230,3},
#line 43 "thingdef_specials.gperf"
{"light_raisebyvalue",110,2},
#line 28 "thingdef_specials.gperf"
{"floor_lowerbyvaluetimes8",36,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 137 "thingdef_specials.gperf"
{"stairs_buildupdoom",217,5},
{(char*)0},
#line 22 "thingdef_specials.gperf"
{"ceiling_movetovaluetimes8",69,4},
{(char*)0}, {(char*)0}, {(char*)0},
#line 138 "thingdef_specials.gperf"
{"sector_setwind",218,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 52 "thingdef_specials.gperf"
{"pillar_buildandcrush",94,4},
{(char*)0}, {(char*)0},
#line 75 "thingdef_specials.gperf"
{"stairs_buildupsync",32,4},
{(char*)0}, {(char*)0}, {(char*)0},
#line 149 "thingdef_specials.gperf"
{"light_minneighbor",233,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 62 "thingdef_specials.gperf"
{"polyobj_rotateleft",2,3},
#line 54 "thingdef_specials.gperf"
{"plat_downwaitupstay",62,3},
#line 41 "thingdef_specials.gperf"
{"floor_crushstop",46,1},
#line 85 "thingdef_specials.gperf"
{"thing_projectile",134,5},
#line 129 "thingdef_specials.gperf"
{"plat_downwaitupstaylip",206,4},
#line 48 "thingdef_specials.gperf"
{"light_flicker",115,3},
{(char*)0}, {(char*)0},
#line 103 "thingdef_specials.gperf"
{"thing_projectileaimed",178,4,5},
#line 61 "thingdef_specials.gperf"
{"polyobj_move",4,4},
#line 86 "thingdef_specials.gperf"
{"thing_projectilegravity",136,5},
#line 58 "thingdef_specials.gperf"
{"plat_perpetualraise",60,3},
{(char*)0},
#line 151 "thingdef_specials.gperf"
{"floor_transfertrigger",235,1},
#line 130 "thingdef_specials.gperf"
{"plat_perpetualraiselip",207,4},
{(char*)0}, {(char*)0},
#line 156 "thingdef_specials.gperf"
{"floor_raisebytexture",240,2},
#line 176 "thingdef_specials.gperf"
{"plat_upnearestwaitdownstay",172,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 152 "thingdef_specials.gperf"
{"floor_transfernumeric",236,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 154 "thingdef_specials.gperf"
{"floor_raisetolowestceiling",238,2},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 46 "thingdef_specials.gperf"
{"light_fade",113,3},
#line 157 "thingdef_specials.gperf"
{"floor_lowertolowesttxty",241,2},
{(char*)0}, {(char*)0},
#line 40 "thingdef_specials.gperf"
{"floorandceiling_raisebyvalue",96,3},
#line 24 "thingdef_specials.gperf"
{"door_open",11,2},
{(char*)0},
#line 167 "thingdef_specials.gperf"
{"floorandceiling_lowerraise",251,3},
{(char*)0},
#line 39 "thingdef_specials.gperf"
{"floorandceiling_lowerbyvalue",95,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 64 "thingdef_specials.gperf"
{"polyobj_doorswing",7,4},
#line 30 "thingdef_specials.gperf"
{"floor_movetovaluetimes8",68,4},
#line 136 "thingdef_specials.gperf"
{"sector_setgravity",216,3},
{(char*)0}, {(char*)0},
#line 81 "thingdef_specials.gperf"
{"damagething",73,1},
#line 65 "thingdef_specials.gperf"
{"polyobj_doorslide",8,5},
#line 75 "thingdef_specials.gperf"
{"stairs_buildupsync",32,4},
#line 52 "thingdef_specials.gperf"
{"pillar_buildandcrush",94,4},
#line 58 "thingdef_specials.gperf"
{"plat_perpetualraise",60,3},
#line 55 "thingdef_specials.gperf"
{"plat_downbyvalue",63,4},
#line 41 "thingdef_specials.gperf"
{"floor_crushstop",46,1},
#line 130 "thingdef_specials.gperf"
{"plat_perpetualraiselip",207,4},
#line 24 "thingdef_specials.gperf"
{"door_open",11,2},
#line 71 "thingdef_specials.gperf"
{"sector_changesound",140,2},
#line 176 "thingdef_specials.gperf"
{"plat_upnearestwaitdownstay",172,3},
{(char*)0}, {(char*)0},
#line 37 "thingdef_specials.gperf"
{"floor_raisetohighest",24,2},
#line 156 "thingdef_specials.gperf"
{"floor_raisebytexture",240,2},
#line 137 "thingdef_specials.gperf"
{"stairs_buildupdoom",217,5},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 159 "thingdef_specials.gperf"
{"exit_normal",243,1},
#line 154 "thingdef_specials.gperf"
{"floor_raisetolowestceiling",238,2},
#line 151 "thingdef_specials.gperf"
{"floor_transfertrigger",235,1},
{(char*)0}, {(char*)0},
#line 179 "thingdef_specials.gperf"
{"startconversation",18,1,2},
{(char*)0},
#line 85 "thingdef_specials.gperf"
{"thing_projectile",134,5},
{(char*)0}, {(char*)0},
#line 150 "thingdef_specials.gperf"
{"light_maxneighbor",234,1},
#line 163 "thingdef_specials.gperf"
{"elevator_lowertonearest",247,2},
{(char*)0},
#line 64 "thingdef_specials.gperf"
{"polyobj_doorswing",7,4},
#line 161 "thingdef_specials.gperf"
{"elevator_raisetonearest",245,2},
#line 54 "thingdef_specials.gperf"
{"plat_downwaitupstay",62,3},
#line 174 "thingdef_specials.gperf"
{"teleport_zombiechanger",39,2},
{(char*)0},
#line 129 "thingdef_specials.gperf"
{"plat_downwaitupstaylip",206,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 95 "thingdef_specials.gperf"
{"thing_damage",119,2,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 86 "thingdef_specials.gperf"
{"thing_projectilegravity",136,5},
#line 27 "thingdef_specials.gperf"
{"floor_lowerbyvalue",20,3},
{(char*)0},
#line 29 "thingdef_specials.gperf"
{"floor_lowerinstant",66,3},
#line 32 "thingdef_specials.gperf"
{"floor_lowertonearest",22,2},
{(char*)0}, {(char*)0},
#line 147 "thingdef_specials.gperf"
{"plat_toggleceiling",231,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 38 "thingdef_specials.gperf"
{"floor_raisetonearest",25,2},
{(char*)0}, {(char*)0},
#line 36 "thingdef_specials.gperf"
{"floor_raiseinstant",67,3},
#line 28 "thingdef_specials.gperf"
{"floor_lowerbyvaluetimes8",36,3},
#line 103 "thingdef_specials.gperf"
{"thing_projectileaimed",178,4,5},
{(char*)0},
#line 166 "thingdef_specials.gperf"
{"floor_donut",250,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 22 "thingdef_specials.gperf"
{"ceiling_movetovaluetimes8",69,4},
{(char*)0},
#line 40 "thingdef_specials.gperf"
{"floorandceiling_raisebyvalue",96,3},
#line 167 "thingdef_specials.gperf"
{"floorandceiling_lowerraise",251,3},
#line 152 "thingdef_specials.gperf"
{"floor_transfernumeric",236,1},
#line 39 "thingdef_specials.gperf"
{"floorandceiling_lowerbyvalue",95,3},
{(char*)0}, {(char*)0}, {(char*)0},
#line 34 "thingdef_specials.gperf"
{"floor_raisebyvalue",23,3},
{(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 36 "thingdef_specials.gperf"
{"floor_raiseinstant",67,3},
#line 38 "thingdef_specials.gperf"
{"floor_raisetonearest",25,2},
#line 155 "thingdef_specials.gperf"
{"floor_raisebyvaluetxty",239,3},
{(char*)0},
#line 35 "thingdef_specials.gperf"
{"floor_raisebyvaluetimes8",35,3},
{(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 66 "thingdef_specials.gperf"
{"polyobj_or_movetimes8",93,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0},
#line 166 "thingdef_specials.gperf"
{"floor_donut",250,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 26 "thingdef_specials.gperf"
{"door_lockedraise",13,4},
{(char*)0},
#line 60 "thingdef_specials.gperf"
{"polyobj_movetimes8",6,4},
{(char*)0},
#line 149 "thingdef_specials.gperf"
{"light_minneighbor",233,1},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0},
#line 147 "thingdef_specials.gperf"
{"plat_toggleceiling",231,1},
{(char*)0}, {(char*)0},
#line 158 "thingdef_specials.gperf"
{"floor_lowertohighest",242,3},
{(char*)0},
#line 172 "thingdef_specials.gperf"
{"door_animated",14,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
#line 30 "thingdef_specials.gperf"
{"floor_movetovaluetimes8",68,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 172 "thingdef_specials.gperf"
{"door_animated",4,3},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0},
#line 100 "thingdef_specials.gperf"
{"thing_projectileintercept",175,5},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0},
#line 60 "thingdef_specials.gperf"
{"polyobj_movetimes8",6,4},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0}, {(char*)0}, {(char*)0},
#line 33 "thingdef_specials.gperf"
{"floor_raiseandcrush",28,3}
{"floor_raiseandcrush",28,3},
{(char*)0},
#line 37 "thingdef_specials.gperf"
{"floor_raisetohighest",24,2},
{(char*)0}, {(char*)0}, {(char*)0}, {(char*)0},
{(char*)0},
#line 100 "thingdef_specials.gperf"
{"thing_projectileintercept",175,5}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)