mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 14:51:40 +00:00
- added submission for raising master/children/siblings.
- added submission for no decals on wall option. - removed some useless code from SpawnMissile function. SVN r1716 (trunk)
This commit is contained in:
parent
19f8b03738
commit
8e5b7373b8
11 changed files with 148 additions and 79 deletions
|
@ -1,4 +1,9 @@
|
|||
July 12, 2009 (Changes by Graf Zahl)
|
||||
July 13, 2009 (Changes by Graf Zahl)
|
||||
- added submission for raising master/children/siblings.
|
||||
- added submission for no decals on wall option.
|
||||
- removed some useless code from SpawnMissile function.
|
||||
|
||||
July 12, 2009 (Changes by Graf Zahl)
|
||||
- Backported 2 fixes from Skulltag:
|
||||
* A_SentinelAttack must check for a NULL target
|
||||
* Monsters with CANTLEAVEFLOORPIC could not move because their floor
|
||||
|
|
|
@ -130,6 +130,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
|
|||
smoothlighting = <bool>; // Use smooth fake contrast.
|
||||
clipmidtex = <bool>; // Side's mid textures are clipped to floor and ceiling.
|
||||
wrapmidtex = <bool>; // Side's mid textures are wrapped.
|
||||
nodecals = <bool>; // Disables decals on the sidedef.
|
||||
}
|
||||
|
||||
sector
|
||||
|
|
|
@ -301,6 +301,7 @@ xx(Heightceiling)
|
|||
xx(Lightlevel)
|
||||
xx(Texturefloor)
|
||||
xx(Textureceiling)
|
||||
xx(Nodecals)
|
||||
|
||||
xx(Skill1)
|
||||
xx(Skill2)
|
||||
|
|
|
@ -1369,60 +1369,6 @@ FUNC(LS_Thing_SpawnFacing)
|
|||
return P_Thing_Spawn (arg0, it, arg1, ANGLE_MAX, arg2 ? false : true, arg3);
|
||||
}
|
||||
|
||||
static bool DoThingRaise(AActor *thing)
|
||||
{
|
||||
if (thing == NULL)
|
||||
return false; // not valid
|
||||
|
||||
if (!(thing->flags & MF_CORPSE) )
|
||||
return true; // not a corpse
|
||||
|
||||
if (thing->tics != -1)
|
||||
return true; // not lying still yet
|
||||
|
||||
FState * RaiseState = thing->FindState(NAME_Raise);
|
||||
if (RaiseState == NULL)
|
||||
return true; // monster doesn't have a raise state
|
||||
|
||||
AActor *info = thing->GetDefault ();
|
||||
|
||||
thing->velx = thing->vely = 0;
|
||||
|
||||
// [RH] Check against real height and radius
|
||||
fixed_t oldheight = thing->height;
|
||||
fixed_t oldradius = thing->radius;
|
||||
int oldflags = thing->flags;
|
||||
|
||||
thing->flags |= MF_SOLID;
|
||||
thing->height = info->height; // [RH] Use real height
|
||||
thing->radius = info->radius; // [RH] Use real radius
|
||||
if (!P_CheckPosition (thing, thing->x, thing->y))
|
||||
{
|
||||
thing->flags = oldflags;
|
||||
thing->radius = oldradius;
|
||||
thing->height = oldheight;
|
||||
return false;
|
||||
}
|
||||
|
||||
S_Sound (thing, CHAN_BODY, "vile/raise", 1, ATTN_IDLE);
|
||||
|
||||
thing->SetState (RaiseState);
|
||||
thing->flags = info->flags;
|
||||
thing->flags2 = info->flags2;
|
||||
thing->flags3 = info->flags3;
|
||||
thing->flags4 = info->flags4;
|
||||
thing->health = info->health;
|
||||
thing->target = NULL;
|
||||
thing->lastenemy = NULL;
|
||||
|
||||
// [RH] If it's a monster, it gets to count as another kill
|
||||
if (thing->CountsAsKill())
|
||||
{
|
||||
level.total_monsters++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
FUNC(LS_Thing_Raise)
|
||||
// Thing_Raise(tid)
|
||||
{
|
||||
|
@ -1431,7 +1377,7 @@ FUNC(LS_Thing_Raise)
|
|||
|
||||
if (arg0==0)
|
||||
{
|
||||
ok = DoThingRaise (it);
|
||||
ok = P_Thing_Raise (it);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1439,7 +1385,7 @@ FUNC(LS_Thing_Raise)
|
|||
|
||||
while ( (target = iterator.Next ()) )
|
||||
{
|
||||
ok |= DoThingRaise(target);
|
||||
ok |= P_Thing_Raise(target);
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
|
|
|
@ -140,6 +140,7 @@ bool P_MoveThing(AActor *source, fixed_t x, fixed_t y, fixed_t z, bool fog);
|
|||
bool P_Thing_Move (int tid, AActor *source, int mapspot, bool fog);
|
||||
int P_Thing_Damage (int tid, AActor *whofor0, int amount, FName type);
|
||||
void P_RemoveThing(AActor * actor);
|
||||
bool P_Thing_Raise(AActor *thing);
|
||||
|
||||
//
|
||||
// P_ENEMY
|
||||
|
|
|
@ -4796,26 +4796,6 @@ static fixed_t GetDefaultSpeed(const PClass *type)
|
|||
return GetDefaultByType(type)->Speed;
|
||||
}
|
||||
|
||||
static AActor * SpawnMissile (const PClass *type, fixed_t x, fixed_t y, fixed_t z)
|
||||
{
|
||||
AActor *th = Spawn (type, x, y, z, ALLOW_REPLACE);
|
||||
|
||||
if (th != NULL)
|
||||
{
|
||||
// Force floor huggers to the floor and ceiling huggers to the ceiling
|
||||
if (th->flags3 & MF3_FLOORHUGGER)
|
||||
{
|
||||
z = th->floorz;
|
||||
}
|
||||
else if (th->flags3 & MF3_CEILINGHUGGER)
|
||||
{
|
||||
z = th->ceilingz - th->height;
|
||||
}
|
||||
}
|
||||
return th;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// FUNC P_SpawnMissile
|
||||
|
@ -4851,7 +4831,7 @@ AActor *P_SpawnMissileXYZ (fixed_t x, fixed_t y, fixed_t z,
|
|||
z -= source->floorclip;
|
||||
}
|
||||
|
||||
AActor *th = SpawnMissile (type, x, y, z);
|
||||
AActor *th = Spawn (type, x, y, z, ALLOW_REPLACE);
|
||||
|
||||
P_PlaySpawnSound(th, source);
|
||||
th->target = source; // record missile's originator
|
||||
|
@ -4966,7 +4946,7 @@ AActor *P_SpawnMissileAngleZSpeed (AActor *source, fixed_t z,
|
|||
z -= source->floorclip;
|
||||
}
|
||||
|
||||
mo = SpawnMissile (type, source->x, source->y, z);
|
||||
mo = Spawn (type, source->x, source->y, z, ALLOW_REPLACE);
|
||||
|
||||
P_PlaySpawnSound(mo, source);
|
||||
mo->target = owner != NULL ? owner : source; // Originator
|
||||
|
|
|
@ -424,6 +424,60 @@ void P_RemoveThing(AActor * actor)
|
|||
}
|
||||
}
|
||||
|
||||
bool P_Thing_Raise(AActor *thing)
|
||||
{
|
||||
if (thing == NULL)
|
||||
return false; // not valid
|
||||
|
||||
if (!(thing->flags & MF_CORPSE) )
|
||||
return true; // not a corpse
|
||||
|
||||
if (thing->tics != -1)
|
||||
return true; // not lying still yet
|
||||
|
||||
FState * RaiseState = thing->FindState(NAME_Raise);
|
||||
if (RaiseState == NULL)
|
||||
return true; // monster doesn't have a raise state
|
||||
|
||||
AActor *info = thing->GetDefault ();
|
||||
|
||||
thing->velx = thing->vely = 0;
|
||||
|
||||
// [RH] Check against real height and radius
|
||||
fixed_t oldheight = thing->height;
|
||||
fixed_t oldradius = thing->radius;
|
||||
int oldflags = thing->flags;
|
||||
|
||||
thing->flags |= MF_SOLID;
|
||||
thing->height = info->height; // [RH] Use real height
|
||||
thing->radius = info->radius; // [RH] Use real radius
|
||||
if (!P_CheckPosition (thing, thing->x, thing->y))
|
||||
{
|
||||
thing->flags = oldflags;
|
||||
thing->radius = oldradius;
|
||||
thing->height = oldheight;
|
||||
return false;
|
||||
}
|
||||
|
||||
S_Sound (thing, CHAN_BODY, "vile/raise", 1, ATTN_IDLE);
|
||||
|
||||
thing->SetState (RaiseState);
|
||||
thing->flags = info->flags;
|
||||
thing->flags2 = info->flags2;
|
||||
thing->flags3 = info->flags3;
|
||||
thing->flags4 = info->flags4;
|
||||
thing->health = info->health;
|
||||
thing->target = NULL;
|
||||
thing->lastenemy = NULL;
|
||||
|
||||
// [RH] If it's a monster, it gets to count as another kill
|
||||
if (thing->CountsAsKill())
|
||||
{
|
||||
level.total_monsters++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
CCMD (dumpspawnables)
|
||||
{
|
||||
|
|
|
@ -973,6 +973,10 @@ struct UDMFParser
|
|||
Flag(sd->Flags, WALLF_CLIP_MIDTEX, key);
|
||||
continue;
|
||||
|
||||
case NAME_Nodecals:
|
||||
Flag(sd->Flags, WALLF_NOAUTODECALS, key);
|
||||
continue;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
|
|
|
@ -2549,6 +2549,78 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RemoveChildren)
|
|||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_RemoveSiblings
|
||||
//
|
||||
//===========================================================================
|
||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RemoveSiblings)
|
||||
{
|
||||
TThinkerIterator<AActor> it;
|
||||
AActor * mo;
|
||||
ACTION_PARAM_START(1);
|
||||
ACTION_PARAM_BOOL(removeall,0);
|
||||
|
||||
while ( (mo = it.Next()) )
|
||||
{
|
||||
if ( ( mo->master == self->master ) && ( mo != self ) && ( ( mo->health <= 0 ) || removeall) )
|
||||
{
|
||||
P_RemoveThing(mo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_RaiseMaster
|
||||
//
|
||||
//===========================================================================
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_RaiseMaster)
|
||||
{
|
||||
if (self->master != NULL)
|
||||
{
|
||||
P_Thing_Raise(self->master);
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_RaiseChildren
|
||||
//
|
||||
//===========================================================================
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_RaiseChildren)
|
||||
{
|
||||
TThinkerIterator<AActor> it;
|
||||
AActor * mo;
|
||||
|
||||
while (mo = it.Next())
|
||||
{
|
||||
if ( mo->master == self )
|
||||
{
|
||||
P_Thing_Raise(mo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_RaiseSiblings
|
||||
//
|
||||
//===========================================================================
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_RaiseSiblings)
|
||||
{
|
||||
TThinkerIterator<AActor> it;
|
||||
AActor * mo;
|
||||
|
||||
while ( (mo = it.Next()) )
|
||||
{
|
||||
if ( ( mo->master == self->master ) && ( mo != self ) )
|
||||
{
|
||||
P_Thing_Raise(mo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_MonsterRefire
|
||||
|
|
|
@ -197,9 +197,13 @@ ACTOR Actor native //: Thinker
|
|||
action native A_JumpIf(bool expression, state label);
|
||||
action native A_RemoveMaster();
|
||||
action native A_RemoveChildren(bool removeall = false);
|
||||
action native A_RemoveSiblings(bool removeall = false);
|
||||
action native A_KillMaster();
|
||||
action native A_KillChildren();
|
||||
action native A_KillSiblings();
|
||||
action native A_RaiseMaster();
|
||||
action native A_RaiseChildren();
|
||||
action native A_RaiseSiblings();
|
||||
action native A_CheckFloor(state label);
|
||||
action native A_CheckCeiling(state label);
|
||||
action native A_PlayerSkinCheck(state label);
|
||||
|
|
|
@ -633,6 +633,7 @@ ACTOR MaceFX4 native
|
|||
-NOGRAVITY
|
||||
+TELESTOMP
|
||||
+THRUGHOST
|
||||
-NOTELEPORT
|
||||
BounceType "HereticCompat"
|
||||
SeeSound ""
|
||||
|
||||
|
|
Loading…
Reference in a new issue