SVN r81 (trunk)

This commit is contained in:
Randy Heit 2006-05-06 03:25:12 +00:00
parent fd0c5a6db6
commit 3c9b55d1db
15 changed files with 400 additions and 349 deletions

View file

@ -1,6 +1,14 @@
May 5, 2006
- Added "DropItem None" as a way for inherited actors to avoid dropping items if
their superclass normally does. This is only needed if somebody dehacks
DeadZombieMan or DeadShotgunGuy.
- Moved Doom's dead body actors into DECORATE so that I can finish and verify the
implementation of "States { StateLabel: goto SomeOtherLabel }" constructs. The
alternate method of overriding inherited states is now deprecated, since it's
incompatible with the coming custom state labels.
- Changed TAG_MORE to pass a va_list pointer instead of a va_list because it's a
non-POD type when targeting several non-ix86 targets with GCC. Hopefully this works.
(Guess it didn't. Boohoo.)
May 4, 2006
- Rewrote FName to use only POD types for its static data so that it can be used

View file

@ -149,35 +149,3 @@ void A_HeadAttack (AActor *self)
// launch a missile
P_SpawnMissile (self, self->target, RUNTIME_CLASS(ACacodemonBall));
}
// Dead cacodemon ----------------------------------------------------------
class ADeadCacodemon : public ACacodemon
{
DECLARE_STATELESS_ACTOR (ADeadCacodemon, ACacodemon)
};
IMPLEMENT_STATELESS_ACTOR (ADeadCacodemon, Doom, 22, 0)
PROP_SpawnState (S_HEAD_DIE+5)
// Undo all the changes to default Actor properties that ACacodemon made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_RaiseState (255)
PROP_SeeSound ("")
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS

View file

@ -130,35 +130,3 @@ void A_SargAttack (AActor *self)
P_TraceBleed (damage, self->target, self);
}
}
// Dead demon --------------------------------------------------------------
class ADeadDemon : public ADemon
{
DECLARE_STATELESS_ACTOR (ADeadDemon, ADemon)
};
IMPLEMENT_STATELESS_ACTOR (ADeadDemon, Doom, 21, 0)
PROP_SpawnState (S_SARG_DIE+5)
// Undo all the changes to default Actor properties that ADemon made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_RaiseState (255)
PROP_SeeSound ("")
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS

View file

@ -168,36 +168,3 @@ void A_TroopAttack (AActor *self)
// launch a missile
P_SpawnMissile (self, self->target, RUNTIME_CLASS(ADoomImpBall));
}
// Dead imp ----------------------------------------------------------------
class ADeadDoomImp : public ADoomImp
{
DECLARE_STATELESS_ACTOR (ADeadDoomImp, ADoomImp)
};
IMPLEMENT_STATELESS_ACTOR (ADeadDoomImp, Doom, 20, 0)
PROP_SpawnState (S_TROO_DIE+4)
// Undo all the changes to default Actor properties that ADoomImp made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_XDeathState (255)
PROP_RaiseState (255)
PROP_SeeSound ("")
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS

View file

@ -207,45 +207,3 @@ void A_DoomSkinCheck2 (AActor *actor)
actor->SetState (&ADoomPlayer::States[S_HTIC_XDIE]);
}
}
// Dead marine -------------------------------------------------------------
class ADeadMarine : public AActor
{
DECLARE_ACTOR (ADeadMarine, AActor)
};
FState ADeadMarine::States[] =
{
S_NORMAL (PLAY, 'N', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (ADeadMarine, Doom, 15, 0)
PROP_SpawnState (0)
END_DEFAULTS
// Gibbed marine -----------------------------------------------------------
class AGibbedMarine : public AActor
{
DECLARE_ACTOR (AGibbedMarine, AActor)
};
FState AGibbedMarine::States[] =
{
S_NORMAL (PLAY, 'W', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (AGibbedMarine, Doom, 10, 145)
PROP_SpawnState (0)
END_DEFAULTS
// Gibbed marine (extra copy) ----------------------------------------------
class AGibbedMarineExtra : public AGibbedMarine
{
DECLARE_STATELESS_ACTOR (AGibbedMarineExtra, AGibbedMarine)
};
IMPLEMENT_STATELESS_ACTOR (AGibbedMarineExtra, Doom, 12, 0)
END_DEFAULTS

View file

@ -104,46 +104,6 @@ void A_SkullAttack (AActor *self)
self->momz = (dest->z+(dest->height>>1) - self->z) / dist;
}
// Dead lost soul ----------------------------------------------------------
/* [RH] Considering that the lost soul removes itself when it dies, there
* really wasn't much point in id including this thing, but they did anyway.
* (There was probably a time when it stayed around after death, and this is
* a holdover from that.)
*/
class ADeadLostSoul : public ALostSoul
{
DECLARE_STATELESS_ACTOR (ADeadLostSoul, ALostSoul)
};
IMPLEMENT_STATELESS_ACTOR (ADeadLostSoul, Doom, 23, 0)
PROP_SpawnState (S_SKULL_DIE+5)
// Undo all the changes to default Actor properties that ALostSoul made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_Damage (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_Flags4 (0)
PROP_RenderStyle (STYLE_Normal)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_RaiseState (255)
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS
//==========================================================================
//
// CVAR transsouls

View file

@ -143,41 +143,6 @@ void A_PosAttack (AActor *self)
P_LineAttack (self, angle, MISSILERANGE, slope, damage, MOD_UNKNOWN, RUNTIME_CLASS(ABulletPuff));
}
// Dead zombie man ---------------------------------------------------------
class ADeadZombieMan : public AZombieMan
{
DECLARE_STATELESS_ACTOR (ADeadZombieMan, AZombieMan)
public:
void NoBlockingSet () {}
};
IMPLEMENT_STATELESS_ACTOR (ADeadZombieMan, Doom, 18, 0)
PROP_SpawnState (S_POSS_DIE+4)
// Undo all the changes to default Actor properties that AZombieMan made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_XDeathState (255)
PROP_RaiseState (255)
PROP_SeeSound ("")
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS
// Shotgun guy -------------------------------------------------------------
class AShotgunGuy : public AActor
@ -321,41 +286,6 @@ void A_SPosAttack (AActor *self)
A_SPosAttack2 (self);
}
// Dead shotgun guy --------------------------------------------------------
class ADeadShotgunGuy : public AShotgunGuy
{
DECLARE_STATELESS_ACTOR (ADeadShotgunGuy, AShotgunGuy)
public:
void NoBlockingSet () {}
};
IMPLEMENT_STATELESS_ACTOR (ADeadShotgunGuy, Doom, 19, 0)
PROP_SpawnState (S_SPOS_DIE+4)
// Undo all the changes to default Actor properties that AShotgunGuy made
PROP_SpawnHealth (1000)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Mass (100)
PROP_SpeedFixed (0)
PROP_PainChance (0)
PROP_Flags (0)
PROP_Flags2 (0)
PROP_Flags3 (0)
PROP_SeeState (255)
PROP_PainState (255)
PROP_MissileState (255)
PROP_DeathState (255)
PROP_XDeathState (255)
PROP_RaiseState (255)
PROP_SeeSound ("")
PROP_PainSound ("")
PROP_DeathSound ("")
PROP_ActiveSound ("")
PROP_AttackSound ("")
END_DEFAULTS
// Chaingun guy ------------------------------------------------------------
class AChaingunGuy : public AActor

View file

@ -66,6 +66,8 @@ extern void LoadDecorations (void (*process)(FState *, int));
FArchive &operator<< (FArchive &arc, FState *&state)
{
const TypeInfo *info;
if (arc.IsStoring ())
{
if (state == NULL)
@ -75,41 +77,17 @@ FArchive &operator<< (FArchive &arc, FState *&state)
return arc;
}
FActorInfo *info = RUNTIME_CLASS(AActor)->ActorInfo;
info = FState::StaticFindStateOwner (state);
if (state >= info->OwnedStates &&
state < info->OwnedStates + info->NumOwnedStates)
if (info != NULL)
{
arc.UserWriteClass (RUNTIME_CLASS(AActor));
arc.WriteCount ((DWORD)(state - info->OwnedStates));
return arc;
arc.UserWriteClass (info);
arc.WriteCount ((DWORD)(state - info->ActorInfo->OwnedStates));
}
TAutoSegIterator<FActorInfo *, &ARegHead, &ARegTail> reg;
while (++reg != NULL)
else
{
if (state >= reg->OwnedStates &&
state < reg->OwnedStates + reg->NumOwnedStates)
{
arc.UserWriteClass (reg->Class);
arc.WriteCount ((DWORD)(state - reg->OwnedStates));
return arc;
}
I_Error ("Cannot find owner for state %p\n", state);
}
for (unsigned int i = 0; i < TypeInfo::m_RuntimeActors.Size(); ++i)
{
FActorInfo *info = TypeInfo::m_RuntimeActors[i]->ActorInfo;
if (state >= info->OwnedStates &&
state < info->OwnedStates + info->NumOwnedStates)
{
arc.UserWriteClass (info->Class);
arc.WriteCount ((DWORD)(state - info->OwnedStates));
return arc;
}
}
I_Error ("Cannot find owner for state %p\n", state);
}
else
{
@ -134,6 +112,56 @@ FArchive &operator<< (FArchive &arc, FState *&state)
return arc;
}
// Find the actor that a state belongs to.
const TypeInfo *FState::StaticFindStateOwner (const FState *state)
{
const FActorInfo *info = RUNTIME_CLASS(AActor)->ActorInfo;
if (state >= info->OwnedStates &&
state < info->OwnedStates + info->NumOwnedStates)
{
return RUNTIME_CLASS(AActor);
}
TAutoSegIterator<FActorInfo *, &ARegHead, &ARegTail> reg;
while (++reg != NULL)
{
if (state >= reg->OwnedStates &&
state < reg->OwnedStates + reg->NumOwnedStates)
{
return reg->Class;
}
}
for (unsigned int i = 0; i < TypeInfo::m_RuntimeActors.Size(); ++i)
{
info = TypeInfo::m_RuntimeActors[i]->ActorInfo;
if (state >= info->OwnedStates &&
state < info->OwnedStates + info->NumOwnedStates)
{
return info->Class;
}
}
return NULL;
}
// Find the actor that a state belongs to, but restrict the search to
// the specified type and its ancestors.
const TypeInfo *FState::StaticFindStateOwner (const FState *state, const FActorInfo *info)
{
while (info != NULL)
{
if (state >= info->OwnedStates &&
state < info->OwnedStates + info->NumOwnedStates)
{
return info->Class;
}
info = info->Class->ParentType->ActorInfo;
}
return NULL;
}
// Change sprite names to indices
static void ProcessStates (FState *states, int numstates)
{

View file

@ -161,6 +161,9 @@ struct FState
{
Frame = (Frame & (SF_FULLBRIGHT|SF_BIGTIC)) | (frame-'A');
}
static const TypeInfo *StaticFindStateOwner (const FState *state);
static const TypeInfo *StaticFindStateOwner (const FState *state, const FActorInfo *info);
};
// A truly awful hack to get to the state that called an action function

View file

@ -78,7 +78,7 @@ fixed_t rw_frontcz1, rw_frontcz2;
fixed_t rw_frontfz1, rw_frontfz2;
unsigned int MaxDrawSegs;
size_t MaxDrawSegs;
drawseg_t *drawsegs;
drawseg_t* firstdrawseg;
drawseg_t* ds_p;

View file

@ -65,6 +65,7 @@
#include "a_hexenglobal.h"
#include "a_weaponpiece.h"
#include "p_conversation.h"
#include "v_text.h"
#include "thingdef.h"
@ -74,7 +75,7 @@ extern TArray<FActorInfo *> Decorations;
// allow decal specifications in DECORATE. Decals are loaded after DECORATE so the names must be stored here.
TArray<char*> DecalNames;
// all state parameters
TArray<int> StateParameters;
TArray<intptr_t> StateParameters;
//==========================================================================
//
@ -989,8 +990,11 @@ void A_NoBlocking (AActor *actor)
while (di != NULL)
{
const TypeInfo *ti = TypeInfo::FindType(di->Name);
if (ti) P_DropItem (actor, ti, di->amount, di->probability);
if (stricmp (di->Name, "None") != 0)
{
const TypeInfo *ti = TypeInfo::FindType(di->Name);
if (ti) P_DropItem (actor, ti, di->amount, di->probability);
}
di = di->Next;
}
}
@ -1422,7 +1426,7 @@ static int ProcessStates(FActorInfo * actor, AActor * defaults, Baggage &bag)
FState * laststate = NULL;
intptr_t lastlabel = -1;
FState ** stp;
int minrequiredstate = 0;
int minrequiredstate = -1;
statestring[255] = 0;
@ -1433,8 +1437,14 @@ static int ProcessStates(FActorInfo * actor, AActor * defaults, Baggage &bag)
SC_MustGetString();
if (SC_Compare("GOTO"))
{
SC_MustGetString();
do_goto: SC_MustGetString();
strncpy (statestring, sc_String, 255);
if (SC_CheckString ("."))
{
SC_MustGetString ();
strcat (statestring, ".");
strcat (statestring, sc_String);
}
if (SC_CheckString ("+"))
{
SC_MustGetNumber ();
@ -1493,6 +1503,7 @@ static int ProcessStates(FActorInfo * actor, AActor * defaults, Baggage &bag)
if (SC_Compare (":"))
{
laststate = NULL;
do
{
lastlabel = count;
@ -1501,10 +1512,13 @@ static int ProcessStates(FActorInfo * actor, AActor * defaults, Baggage &bag)
else
SC_ScriptError("Unknown state label %s", statestring);
SC_MustGetString ();
if (SC_Compare ("Goto"))
{
goto do_goto;
}
strncpy(statestring, sc_String, 255);
SC_MustGetString ();
} while (SC_Compare (":"));
laststate = NULL;
// continue;
}
@ -1745,6 +1759,88 @@ endofstate:
return count;
}
//==========================================================================
//
// ResolveGotoLabel
//
//==========================================================================
static FState *ResolveGotoLabel (AActor *actor, const TypeInfo *type, char *name)
{
FState **stp, *state;
char *namestart = name;
char *label, *offset, *pt;
int v;
// Check for classname
if ((pt = strchr (name, '.')) != NULL)
{
const char *classname = name;
*pt = '\0';
name = pt + 1;
// The classname may either be "Super" to identify this class's immediate
// superclass, or it may the name of any class that this one derives from.
if (stricmp (classname, "Super") == 0)
{
type = type->ParentType;
actor = GetDefaultByType (type);
}
else
{
const TypeInfo *stype = TypeInfo::IFindType (classname);
if (stype == NULL)
{
SC_ScriptError ("%s is an unknown class.", classname);
}
if (!stype->IsDescendantOf (RUNTIME_CLASS(AActor)))
{
SC_ScriptError ("%s is not an actor class, so it has no states.", stype->Name+1);
}
if (!stype->IsAncestorOf (type))
{
SC_ScriptError ("%s is not derived from %s so cannot access its states.",
type->Name+1, stype->Name+1);
}
if (type != stype)
{
type = stype;
actor = GetDefaultByType (type);
}
}
}
label = name;
// Check for offset
offset = NULL;
if ((pt = strchr (name, '+')) != NULL)
{
*pt = '\0';
offset = pt + 1;
}
v = offset ? strtol (offset, NULL, 0) : 0;
// Calculate the state's address.
stp = FindState (actor, type, label);
state = NULL;
if (stp != NULL)
{
if (*stp != NULL)
{
state = *stp + v;
}
else if (v != 0)
{
SC_ScriptError ("Attempt to get invalid state from actor %s.", type->Name+1);
}
}
else
{
SC_ScriptError("Unknown state label %s", label);
}
free(namestart); // free the allocated string buffer
return state;
}
//==========================================================================
//
// FixStatePointers
@ -1776,14 +1872,15 @@ static void FixStatePointers (FActorInfo *actor, FState **start, FState **stop)
//
//==========================================================================
static void FixStatePointersAgain (FActorInfo *actor, FState **start, FState **stop)
static void FixStatePointersAgain (FActorInfo *actor, AActor *defaults, FState **start, FState **stop)
{
FState **stp;
for (stp = start; stp <= stop; ++stp)
{
if (*stp != NULL && (*stp < actor->OwnedStates || *stp >= actor->OwnedStates + actor->NumOwnedStates))
{ // It doesn't point into this actor's own states, so it must be a label string. Resolve it.
if (*stp != NULL && FState::StaticFindStateOwner (*stp, actor) == NULL)
{ // It's not a valid state, so it must be a label string. Resolve it.
*stp = ResolveGotoLabel (defaults, actor->Class, (char *)*stp);
}
}
}
@ -1796,82 +1893,79 @@ static void FixStatePointersAgain (FActorInfo *actor, FState **start, FState **s
//==========================================================================
static int FinishStates (FActorInfo *actor, AActor *defaults, Baggage &bag)
{
FState **stp;
int count = StateArray.Size();
FState * realstates=new FState[count];
FState *realstates = new FState[count];
int i;
int currange;
memcpy(realstates,&StateArray[0],count*sizeof(FState));
actor->OwnedStates=realstates;
actor->NumOwnedStates=count;
// adjust the state pointers
// In the case new states are added these must be adjusted, too!
FixStatePointers (actor, &defaults->SpawnState, &defaults->GreetingsState);
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(AWeapon)))
if (count > 0)
{
AWeapon * weapon=(AWeapon*)defaults;
memcpy(realstates, &StateArray[0], count*sizeof(FState));
actor->OwnedStates = realstates;
actor->NumOwnedStates = count;
FixStatePointers (actor, &weapon->UpState, &weapon->FlashState);
}
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
{
ACustomInventory * item=(ACustomInventory*)defaults;
FixStatePointers (actor, &item->UseState, &item->DropState);
}
for(i = currange = 0; i < count; i++)
{
// resolve labels and jumps
switch((ptrdiff_t)realstates[i].NextState)
// adjust the state pointers
// In the case new states are added these must be adjusted, too!
FixStatePointers (actor, &defaults->SpawnState, &defaults->GreetingsState);
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(AWeapon)))
{
case 0: // next
realstates[i].NextState=(i<count-1? &realstates[i+1]:&realstates[0]);
break;
AWeapon *weapon = (AWeapon*)defaults;
case -1: // stop
realstates[i].NextState=NULL;
break;
FixStatePointers (actor, &weapon->UpState, &weapon->FlashState);
}
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
{
ACustomInventory *item = (ACustomInventory*)defaults;
case -2: // wait
realstates[i].NextState=&realstates[i];
break;
FixStatePointers (actor, &item->UseState, &item->DropState);
}
default: // loop
if ((size_t)realstates[i].NextState < 0x10000)
for(i = currange = 0; i < count; i++)
{
// resolve labels and jumps
switch((ptrdiff_t)realstates[i].NextState)
{
realstates[i].NextState=&realstates[(size_t)realstates[i].NextState-1];
}
else // goto
{
char *label = strtok ((char*)realstates[i].NextState, "+");
char *labelpt = label;
char *offset = strtok (NULL, "+");
int v = offset ? strtol (offset, NULL, 0) : 0;
case 0: // next
realstates[i].NextState = (i < count-1 ? &realstates[i+1] : &realstates[0]);
break;
stp = FindState (defaults, bag.Info->Class, label);
if (stp)
case -1: // stop
realstates[i].NextState = NULL;
break;
case -2: // wait
realstates[i].NextState = &realstates[i];
break;
default: // loop
if ((size_t)realstates[i].NextState < 0x10000)
{
if (*stp) realstates[i].NextState=*stp+v;
else
{
realstates[i].NextState=NULL;
if (v)
{
SC_ScriptError("Attempt to get invalid state from actor %s\n", actor->Class->Name);
return 0;
}
}
realstates[i].NextState = &realstates[(size_t)realstates[i].NextState-1];
}
else // goto
{
realstates[i].NextState = ResolveGotoLabel (defaults, bag.Info->Class, (char *)realstates[i].NextState);
}
else
SC_ScriptError("Unknown state label %s", label);
free(labelpt); // free the allocated string buffer
}
}
}
StateArray.Clear ();
// Fix state pointers that are gotos
FixStatePointersAgain (actor, defaults, &defaults->SpawnState, &defaults->GreetingsState);
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(AWeapon)))
{
AWeapon *weapon = (AWeapon*)defaults;
FixStatePointersAgain (actor, defaults, &weapon->UpState, &weapon->FlashState);
}
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(ACustomInventory)))
{
ACustomInventory *item = (ACustomInventory*)defaults;
FixStatePointersAgain (actor, defaults, &item->UseState, &item->DropState);
}
return count;
}
@ -2063,6 +2157,29 @@ void ProcessActor(void (*process)(FState *, int))
SC_SetCMode (false);
}
//==========================================================================
//
// StatePropertyIsDeprecated
//
// Deprecated means it will be removed in a future version.
//
//==========================================================================
static void StatePropertyIsDeprecated (const char *actorname, const char *prop)
{
static bool warned = false;
Printf (TEXTCOLOR_YELLOW "In actor %s, the %s property is deprecated.\n",
actorname, prop);
if (!warned)
{
warned = true;
Printf (TEXTCOLOR_YELLOW "Instead of \"%s <state>\", add this to the actor's States block:\n"
TEXTCOLOR_YELLOW " %s:\n"
TEXTCOLOR_YELLOW " Goto <state>\n", prop, prop);
}
}
//==========================================================================
//
// Property parsers
@ -2336,6 +2453,7 @@ static void ActorDropItem (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorSpawnState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Spawn");
defaults->SpawnState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2344,6 +2462,7 @@ static void ActorSpawnState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorSeeState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "See");
defaults->SeeState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2352,6 +2471,7 @@ static void ActorSeeState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorMeleeState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Melee");
defaults->MeleeState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2360,6 +2480,7 @@ static void ActorMeleeState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorMissileState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Missile");
defaults->MissileState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2368,6 +2489,7 @@ static void ActorMissileState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorPainState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Pain");
defaults->PainState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2376,6 +2498,7 @@ static void ActorPainState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorDeathState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Death");
defaults->DeathState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2384,6 +2507,7 @@ static void ActorDeathState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorXDeathState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "XDeath");
defaults->XDeathState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2392,6 +2516,7 @@ static void ActorXDeathState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorBurnState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Burn");
defaults->BDeathState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2400,6 +2525,7 @@ static void ActorBurnState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorIceState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Ice");
defaults->IDeathState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2408,6 +2534,7 @@ static void ActorIceState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorRaiseState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Raise");
defaults->RaiseState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2416,6 +2543,7 @@ static void ActorRaiseState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorCrashState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Crash");
defaults->CrashState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2424,6 +2552,7 @@ static void ActorCrashState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorCrushState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Crush");
defaults->CrushState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2432,6 +2561,7 @@ static void ActorCrushState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorWoundState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Wound");
defaults->WoundState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2440,6 +2570,7 @@ static void ActorWoundState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorDisintegrateState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Disintegrate");
defaults->EDeathState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2448,6 +2579,7 @@ static void ActorDisintegrateState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorHealState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Heal");
defaults->HealState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2456,6 +2588,7 @@ static void ActorHealState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorYesState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Yes");
defaults->YesState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2464,6 +2597,7 @@ static void ActorYesState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorNoState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "No");
defaults->NoState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -2472,6 +2606,7 @@ static void ActorNoState (AActor *defaults, Baggage &bag)
//==========================================================================
static void ActorGreetingsState (AActor *defaults, Baggage &bag)
{
StatePropertyIsDeprecated (bag.Info->Class->Name+1, "Greetings");
defaults->GreetingsState=CheckState (bag.CurrentState, bag.Info->Class);
}
@ -3492,5 +3627,3 @@ void FinishThingdef()
}
}
}

View file

@ -1,6 +1,7 @@
#include "actors/shared/debris.txt"
#include "actors/shared/splashes.txt"
#include "actors/doom/deadthings.txt"
#include "actors/doom/doomarmor.txt"
#include "actors/doom/doomartifacts.txt"
#include "actors/doom/doomkeys.txt"

View file

@ -0,0 +1,123 @@
// Gibbed marine -----------------------------------------------------------
actor GibbedMarine 10
{
Game Doom
States
{
Spawn:
PLAY W -1
Stop
}
}
// Gibbed marine (extra copy) ----------------------------------------------
actor GibbedMarineExtra : GibbedMarine 12
{
Game Doom
}
// Dead marine -------------------------------------------------------------
actor DeadMarine 15
{
Game Doom
States
{
Spawn:
PLAY N -1
Stop
}
}
/* If it wasn't for Dehacked compatibility, the rest of these would be
* better defined as single frame states. But since Doom reused the
* dead state from the original monsters, we need to do the same.
*/
// Dead zombie man ---------------------------------------------------------
actor DeadZombieMan : ZombieMan 18
{
Game Doom
DropItem None
Skip_Super
States
{
Spawn:
Goto Super.Death+4
}
}
// Dead shotgun guy --------------------------------------------------------
actor DeadShotgunGuy : ShotgunGuy 19
{
Game Doom
DropItem None
Skip_Super
States
{
Spawn:
Goto Super.Death+4
}
};
// Dead imp ----------------------------------------------------------------
actor DeadDoomImp : DoomImp 20
{
Game Doom
Skip_Super
States
{
Spawn:
Goto Super.Death+4
}
}
// Dead demon --------------------------------------------------------------
actor DeadDemon : Demon 21
{
Game Doom
Skip_Super
States
{
Spawn:
Goto Super.Death+5
}
}
// Dead cacodemon ----------------------------------------------------------
actor DeadCacodemon : Cacodemon 22
{
Game Doom
Skip_Super
States
{
Spawn:
Goto Super.Death+5
}
}
// Dead lost soul ----------------------------------------------------------
/* [RH] Considering that the lost soul removes itself when it dies, there
* really wasn't much point in id including this thing, but they did anyway.
* (There was probably a time when it stayed around after death, and this is
* a holdover from that.)
*/
actor DeadLostSoul : LostSoul 23
{
Game Doom
Skip_Super
States
{
Spawn:
Goto Super.Death+5
}
}

View file

@ -238,6 +238,9 @@
<Filter
Name="Doom"
Filter="">
<File
RelativePath=".\decorate\doom\deadthings.txt">
</File>
<File
RelativePath=".\decorate\doom\doomarmor.txt">
</File>

View file

@ -187,6 +187,7 @@ decorate.txt decorate/decorate.txt
actors/shared/debris.txt decorate/shared/debris.txt
actors/shared/splashes.txt decorate/shared/splashes.txt
actors/doom/deadthings.txt decorate/doom/deadthings.txt
actors/doom/doomarmor.txt decorate/doom/doomarmor.txt
actors/doom/doomartifacts.txt decorate/doom/doomartifacts.txt
actors/doom/doomkeys.txt decorate/doom/doomkeys.txt