mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-01-18 07:02:03 +00:00
SVN r49 (trunk)
This commit is contained in:
parent
3165756b02
commit
da51ac7446
37 changed files with 212 additions and 94 deletions
|
@ -1,4 +1,28 @@
|
||||||
|
April 16, 2006 (Changes by Graf Zahl)
|
||||||
|
- Increased the limit for the sound DoorCloseLight in Hexen to 4 because
|
||||||
|
it got cut off in the polyobject crusher in MAP01.
|
||||||
|
- Fixed: A player that has no body (as in the head popped off in Heretic
|
||||||
|
and Hexen) must not be resurrected.
|
||||||
|
- Fixed: Repeatable switches that are being activated while the switch
|
||||||
|
animation was still running didn't react properly.
|
||||||
|
- Fixed: Not all paths in P_LoadSegs freed the vertchanged array.
|
||||||
|
- Fixed: With infinitely tall actors on P_CheckPosition must not
|
||||||
|
check for stepping on things.
|
||||||
|
- Fixed: R_FakeFlat used the control sector's floor light level for
|
||||||
|
ceilings of deep water areas.
|
||||||
|
- Fixed: Dormant floating monsters still adjusted their height to their
|
||||||
|
target.
|
||||||
|
- Fixed: Invisible special things should never create terrain splashes.
|
||||||
|
- Changed: The Demon no longer reduces the actual state durations for
|
||||||
|
fast mode. Now this is done by AActor::SetState and controlled by
|
||||||
|
actor flags.
|
||||||
|
- Fixed: Friendly monsters are now completely excluded fron being counted
|
||||||
|
as kills.
|
||||||
|
|
||||||
April 15, 2006 (Changes by Graf Zahl)
|
April 15, 2006 (Changes by Graf Zahl)
|
||||||
|
- Changed -warp for ExMy to use atoi to parse the parameters. This is
|
||||||
|
more robust than reading the characters directly.
|
||||||
|
- Expanded thing and line args to 32 bit.
|
||||||
- Extended Makewad so it can write Zip files in addition to WAD files.
|
- Extended Makewad so it can write Zip files in addition to WAD files.
|
||||||
|
|
||||||
April 14, 2006 (Changes by Graf Zahl)
|
April 14, 2006 (Changes by Graf Zahl)
|
||||||
|
|
18
src/actor.h
18
src/actor.h
|
@ -273,6 +273,9 @@ enum
|
||||||
MF4_FRIGHTENED = 0x40000000, // Monster runs away from player
|
MF4_FRIGHTENED = 0x40000000, // Monster runs away from player
|
||||||
MF4_NOBOUNCESOUND = 0x80000000, // Strife's grenades don't make a bouncing sound.
|
MF4_NOBOUNCESOUND = 0x80000000, // Strife's grenades don't make a bouncing sound.
|
||||||
|
|
||||||
|
MF5_FASTER = 0x00000001, // moves faster when DF_FAST_MONSTERS or nightmare is on.
|
||||||
|
MF5_FASTMELEE = 0x00000002, // has a faster melee attack when DF_FAST_MONSTERS or nightmare is on.
|
||||||
|
|
||||||
// --- mobj.renderflags ---
|
// --- mobj.renderflags ---
|
||||||
|
|
||||||
RF_XFLIP = 0x0001, // Flip sprite horizontally
|
RF_XFLIP = 0x0001, // Flip sprite horizontally
|
||||||
|
@ -483,8 +486,8 @@ public:
|
||||||
// Called by RoughBlockCheck
|
// Called by RoughBlockCheck
|
||||||
virtual bool IsOkayToAttack (AActor *target);
|
virtual bool IsOkayToAttack (AActor *target);
|
||||||
|
|
||||||
virtual void ChangeSpecial (byte special, byte data1, byte data2,
|
virtual void ChangeSpecial (int special, int data1, int data2,
|
||||||
byte data3, byte data4, byte data5);
|
int data3, int data4, int data5);
|
||||||
|
|
||||||
// Plays the actor's ActiveSound if its voice isn't already making noise.
|
// Plays the actor's ActiveSound if its voice isn't already making noise.
|
||||||
void PlayActiveSound ();
|
void PlayActiveSound ();
|
||||||
|
@ -566,6 +569,12 @@ public:
|
||||||
// What species am I?
|
// What species am I?
|
||||||
virtual const TypeInfo *GetSpecies();
|
virtual const TypeInfo *GetSpecies();
|
||||||
|
|
||||||
|
// Check for monsters that count as kill but excludes all friendlies.
|
||||||
|
bool CountsAsKill() const
|
||||||
|
{
|
||||||
|
return (flags & MF_COUNTKILL) && !(flags & MF_FRIENDLY);
|
||||||
|
}
|
||||||
|
|
||||||
// info for drawing
|
// info for drawing
|
||||||
// NOTE: The first member variable *must* be x.
|
// NOTE: The first member variable *must* be x.
|
||||||
fixed_t x,y,z;
|
fixed_t x,y,z;
|
||||||
|
@ -600,6 +609,7 @@ public:
|
||||||
DWORD flags2; // Heretic flags
|
DWORD flags2; // Heretic flags
|
||||||
DWORD flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable
|
DWORD flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable
|
||||||
DWORD flags4; // [RH] Even more flags!
|
DWORD flags4; // [RH] Even more flags!
|
||||||
|
DWORD flags5; // OMG! We need another one.
|
||||||
int special1; // Special info
|
int special1; // Special info
|
||||||
int special2; // Special info
|
int special2; // Special info
|
||||||
int health;
|
int health;
|
||||||
|
@ -627,7 +637,7 @@ public:
|
||||||
fixed_t floorclip; // value to use for floor clipping
|
fixed_t floorclip; // value to use for floor clipping
|
||||||
SWORD tid; // thing identifier
|
SWORD tid; // thing identifier
|
||||||
BYTE special; // special
|
BYTE special; // special
|
||||||
BYTE args[5]; // special arguments
|
int args[5]; // special arguments
|
||||||
|
|
||||||
AActor *inext, **iprev;// Links to other mobjs in same bucket
|
AActor *inext, **iprev;// Links to other mobjs in same bucket
|
||||||
AActor *goal; // Monster's goal if not chasing anything
|
AActor *goal; // Monster's goal if not chasing anything
|
||||||
|
@ -711,6 +721,8 @@ public:
|
||||||
void UnlinkFromWorld ();
|
void UnlinkFromWorld ();
|
||||||
void AdjustFloorClip ();
|
void AdjustFloorClip ();
|
||||||
void SetOrigin (fixed_t x, fixed_t y, fixed_t z);
|
void SetOrigin (fixed_t x, fixed_t y, fixed_t z);
|
||||||
|
bool InStateSequence(FState * newstate, FState * basestate);
|
||||||
|
int GetTics(FState * newstate);
|
||||||
bool SetState (FState *newstate);
|
bool SetState (FState *newstate);
|
||||||
bool SetStateNF (FState *newstate);
|
bool SetStateNF (FState *newstate);
|
||||||
bool UpdateWaterLevel (fixed_t oldz);
|
bool UpdateWaterLevel (fixed_t oldz);
|
||||||
|
|
|
@ -433,7 +433,6 @@ void C_AddNotifyString (int printlevel, const char *source)
|
||||||
REPLACELINE
|
REPLACELINE
|
||||||
} addtype = NEWLINE;
|
} addtype = NEWLINE;
|
||||||
|
|
||||||
char *work;
|
|
||||||
brokenlines_t *lines;
|
brokenlines_t *lines;
|
||||||
int i, len, width;
|
int i, len, width;
|
||||||
|
|
||||||
|
@ -451,13 +450,12 @@ void C_AddNotifyString (int printlevel, const char *source)
|
||||||
|
|
||||||
width = con_scaletext > 1 ? DisplayWidth/2 : con_scaletext == 1 ? DisplayWidth / CleanXfac : DisplayWidth;
|
width = con_scaletext > 1 ? DisplayWidth/2 : con_scaletext == 1 ? DisplayWidth / CleanXfac : DisplayWidth;
|
||||||
|
|
||||||
if (addtype == APPENDLINE && NotifyStrings[NUMNOTIFIES-1].printlevel == printlevel
|
if (addtype == APPENDLINE && NotifyStrings[NUMNOTIFIES-1].printlevel == printlevel)
|
||||||
&& (work = (char *)malloc (strlen ((char *)NotifyStrings[NUMNOTIFIES-1].text)
|
|
||||||
+ strlen (source) + 1)) )
|
|
||||||
{
|
{
|
||||||
sprintf (work, "%s%s", NotifyStrings[NUMNOTIFIES-1].text, source);
|
string str;
|
||||||
lines = V_BreakLines (width, work);
|
|
||||||
free (work);
|
str.Format("%s%s", NotifyStrings[NUMNOTIFIES-1].text, source);
|
||||||
|
lines = V_BreakLines (width, str.GetChars());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2143,8 +2143,8 @@ void D_DoomMain (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ep = Args.GetArg(p+1)[0]-'0';
|
ep = atoi (Args.GetArg(p+1));
|
||||||
map = p < Args.NumArgs() - 2 ? Args.GetArg(p+2)[0]-'0' : 10;
|
map = p < Args.NumArgs() - 2 ? atoi (Args.GetArg(p+2)) : 10;
|
||||||
if ((unsigned)map > 9)
|
if ((unsigned)map > 9)
|
||||||
{
|
{
|
||||||
map = ep;
|
map = ep;
|
||||||
|
|
|
@ -288,15 +288,16 @@ void A_VileChase (AActor *self)
|
||||||
corpsehit->target = NULL;
|
corpsehit->target = NULL;
|
||||||
corpsehit->lastenemy = NULL;
|
corpsehit->lastenemy = NULL;
|
||||||
|
|
||||||
// You are the Archvile's minion now, so hate what it hates
|
|
||||||
corpsehit->CopyFriendliness (self, false);
|
|
||||||
|
|
||||||
// [RH] If it's a monster, it gets to count as another kill
|
// [RH] If it's a monster, it gets to count as another kill
|
||||||
if (corpsehit->flags & MF_COUNTKILL)
|
if (corpsehit->CountsAsKill())
|
||||||
{
|
{
|
||||||
level.total_monsters++;
|
level.total_monsters++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// You are the Archvile's minion now, so hate what it hates
|
||||||
|
corpsehit->CopyFriendliness (self, false);
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ IMPLEMENT_ACTOR (ADemon, Doom, 3002, 8)
|
||||||
PROP_Mass (400)
|
PROP_Mass (400)
|
||||||
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
|
||||||
PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_FLOORCLIP)
|
PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_FLOORCLIP)
|
||||||
|
PROP_Flags5 (MF5_FASTER|MF5_FASTMELEE)
|
||||||
|
|
||||||
PROP_SpawnState (S_SARG_STND)
|
PROP_SpawnState (S_SARG_STND)
|
||||||
PROP_SeeState (S_SARG_RUN)
|
PROP_SeeState (S_SARG_RUN)
|
||||||
|
@ -83,32 +84,6 @@ IMPLEMENT_ACTOR (ADemon, Doom, 3002, 8)
|
||||||
PROP_ActiveSound ("demon/active")
|
PROP_ActiveSound ("demon/active")
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
static void SetTics (FState *state, int count)
|
|
||||||
{
|
|
||||||
state->Tics = (count+1) & 255;
|
|
||||||
state->Misc1 = state->GetMisc1() | ((count+1)>>8);
|
|
||||||
state->Frame = (state->Frame & ~SF_BIGTIC) | (count > 254 ? SF_BIGTIC : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
AT_SPEED_SET (Demon, speednow)
|
|
||||||
{
|
|
||||||
static bool isFast = false;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (speednow == SPEED_Fast && !isFast)
|
|
||||||
{
|
|
||||||
isFast = true;
|
|
||||||
for (i = S_SARG_RUN; i < S_SARG_PAIN; i++)
|
|
||||||
SetTics (&ADemon::States[i], ADemon::States[i].GetTics() >> 1);
|
|
||||||
}
|
|
||||||
else if (speednow == SPEED_Normal && isFast)
|
|
||||||
{
|
|
||||||
isFast = false;
|
|
||||||
for (i = S_SARG_RUN; i < S_SARG_PAIN; i++)
|
|
||||||
SetTics (&ADemon::States[i], ADemon::States[i].GetTics() << 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AStealthDemon : public ADemon
|
class AStealthDemon : public ADemon
|
||||||
{
|
{
|
||||||
DECLARE_STATELESS_ACTOR (AStealthDemon, ADemon)
|
DECLARE_STATELESS_ACTOR (AStealthDemon, ADemon)
|
||||||
|
|
|
@ -779,6 +779,7 @@ private:
|
||||||
angle_t badguyangle;
|
angle_t badguyangle;
|
||||||
angle_t diffang;
|
angle_t diffang;
|
||||||
|
|
||||||
|
|
||||||
if (FacePriority < 10)
|
if (FacePriority < 10)
|
||||||
{
|
{
|
||||||
// dead
|
// dead
|
||||||
|
@ -804,6 +805,12 @@ private:
|
||||||
FaceIndex = CalcPainOffset() + ST_EVILGRINOFFSET;
|
FaceIndex = CalcPainOffset() + ST_EVILGRINOFFSET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This happens when a weapon is added to the inventory
|
||||||
|
// by other means than being picked up.
|
||||||
|
bEvilGrin = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FacePriority < 8)
|
if (FacePriority < 8)
|
||||||
|
|
|
@ -305,7 +305,7 @@ void A_PotteryExplode (AActor *actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
S_Sound (mo, CHAN_BODY, "PotteryExplode", 1, ATTN_NORM);
|
S_Sound (mo, CHAN_BODY, "PotteryExplode", 1, ATTN_NORM);
|
||||||
if (SpawnableThings[actor->args[0]])
|
if (actor->args[0]>=0 && actor->args[0]<=255 && SpawnableThings[actor->args[0]])
|
||||||
{ // Spawn an item
|
{ // Spawn an item
|
||||||
if (!(dmflags & DF_NO_MONSTERS)
|
if (!(dmflags & DF_NO_MONSTERS)
|
||||||
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
|
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
|
||||||
|
@ -1083,7 +1083,7 @@ void A_SoAExplode (AActor *actor)
|
||||||
mo->momy = pr_soaexplode.Random2()<<(FRACBITS-6);
|
mo->momy = pr_soaexplode.Random2()<<(FRACBITS-6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (SpawnableThings[actor->args[0]])
|
if (actor->args[0]>=0 && actor->args[0]<=255 && SpawnableThings[actor->args[0]])
|
||||||
{ // Spawn an item
|
{ // Spawn an item
|
||||||
if (!(dmflags & DF_NO_MONSTERS)
|
if (!(dmflags & DF_NO_MONSTERS)
|
||||||
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
|
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
|
||||||
|
|
|
@ -81,6 +81,7 @@ protected:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASecurityCamera, Any, 9025, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASecurityCamera, Any, 9025, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
PROP_RenderStyle (STYLE_None)
|
PROP_RenderStyle (STYLE_None)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ IMPLEMENT_ACTOR (AHateTarget, Any, 9076, 0)
|
||||||
PROP_RadiusFixed (20)
|
PROP_RadiusFixed (20)
|
||||||
PROP_HeightFixed (56)
|
PROP_HeightFixed (56)
|
||||||
PROP_Flags (MF_SHOOTABLE|MF_NOGRAVITY|MF_NOBLOOD)
|
PROP_Flags (MF_SHOOTABLE|MF_NOGRAVITY|MF_NOBLOOD)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
PROP_SpawnState (0)
|
PROP_SpawnState (0)
|
||||||
PROP_MassLong (INT_MAX)
|
PROP_MassLong (INT_MAX)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
|
@ -70,6 +70,7 @@ END_POINTERS
|
||||||
|
|
||||||
BEGIN_STATELESS_DEFAULTS (AInterpolationPoint, Any, 9070, 0)
|
BEGIN_STATELESS_DEFAULTS (AInterpolationPoint, Any, 9070, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
PROP_RenderStyle (STYLE_None)
|
PROP_RenderStyle (STYLE_None)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
|
@ -142,6 +143,7 @@ public:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (AInterpolationSpecial, Any, 9075, 0)
|
IMPLEMENT_STATELESS_ACTOR (AInterpolationSpecial, Any, 9075, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -191,6 +193,7 @@ END_POINTERS
|
||||||
|
|
||||||
BEGIN_STATELESS_DEFAULTS (APathFollower, Any, 9071, 0)
|
BEGIN_STATELESS_DEFAULTS (APathFollower, Any, 9071, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void APathFollower::Serialize (FArchive &arc)
|
void APathFollower::Serialize (FArchive &arc)
|
||||||
|
|
|
@ -51,6 +51,7 @@ public:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASecretTrigger, Any, 9046, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASecretTrigger, Any, 9046, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void ASecretTrigger::PostBeginPlay ()
|
void ASecretTrigger::PostBeginPlay ()
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASectorAction, Any, -1, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASectorAction, Any, -1, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void ASectorAction::Destroy ()
|
void ASectorAction::Destroy ()
|
||||||
|
|
|
@ -14,6 +14,7 @@ IMPLEMENT_ACTOR (AUnknown, Any, -1, 0)
|
||||||
PROP_RadiusFixed (32)
|
PROP_RadiusFixed (32)
|
||||||
PROP_HeightFixed (56)
|
PROP_HeightFixed (56)
|
||||||
PROP_Flags (MF_NOGRAVITY|MF_NOBLOCKMAP)
|
PROP_Flags (MF_NOGRAVITY|MF_NOBLOCKMAP)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
|
|
||||||
PROP_SpawnState (0)
|
PROP_SpawnState (0)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
@ -24,7 +25,8 @@ IMPLEMENT_STATELESS_ACTOR (APatrolPoint, Any, 9024, 0)
|
||||||
PROP_RadiusFixed (8)
|
PROP_RadiusFixed (8)
|
||||||
PROP_HeightFixed (8)
|
PROP_HeightFixed (8)
|
||||||
PROP_Mass (10)
|
PROP_Mass (10)
|
||||||
PROP_Flags (MF_NOBLOCKMAP)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
PROP_RenderStyle (STYLE_None)
|
PROP_RenderStyle (STYLE_None)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
|
@ -34,7 +36,8 @@ IMPLEMENT_STATELESS_ACTOR (APatrolSpecial, Any, 9047, 0)
|
||||||
PROP_RadiusFixed (8)
|
PROP_RadiusFixed (8)
|
||||||
PROP_HeightFixed (8)
|
PROP_HeightFixed (8)
|
||||||
PROP_Mass (10)
|
PROP_Mass (10)
|
||||||
PROP_Flags (MF_NOBLOCKMAP)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
PROP_RenderStyle (STYLE_None)
|
PROP_RenderStyle (STYLE_None)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
|
@ -114,12 +117,14 @@ void ABlood::SetDamage (int damage)
|
||||||
IMPLEMENT_STATELESS_ACTOR (AMapSpot, Any, 9001, 0)
|
IMPLEMENT_STATELESS_ACTOR (AMapSpot, Any, 9001, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
PROP_RenderStyle (STYLE_None)
|
PROP_RenderStyle (STYLE_None)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
// Map spot with gravity ---------------------------------------------------
|
// Map spot with gravity ---------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (AMapSpotGravity, Any, 9013, 0)
|
IMPLEMENT_STATELESS_ACTOR (AMapSpotGravity, Any, 9013, 0)
|
||||||
PROP_Flags (0)
|
PROP_Flags (0)
|
||||||
|
PROP_Flags3(MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
// Bloody gibs -------------------------------------------------------------
|
// Bloody gibs -------------------------------------------------------------
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASkyViewpoint, Any, 9080, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASkyViewpoint, Any, 9080, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
// If this actor has no TID, make it the default sky box
|
// If this actor has no TID, make it the default sky box
|
||||||
|
@ -90,6 +91,7 @@ public:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASkyPicker, Any, 9081, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASkyPicker, Any, 9081, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void ASkyPicker::PostBeginPlay ()
|
void ASkyPicker::PostBeginPlay ()
|
||||||
|
|
|
@ -48,6 +48,7 @@ public:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ASoundEnvironment, Any, 9048, 0)
|
IMPLEMENT_STATELESS_ACTOR (ASoundEnvironment, Any, 9048, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void ASoundEnvironment::PostBeginPlay ()
|
void ASoundEnvironment::PostBeginPlay ()
|
||||||
|
|
|
@ -44,6 +44,7 @@ public:
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (AWaterZone, Any, 9045, 0)
|
IMPLEMENT_STATELESS_ACTOR (AWaterZone, Any, 9045, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY)
|
||||||
|
PROP_Flags3 (MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
void AWaterZone::PostBeginPlay ()
|
void AWaterZone::PostBeginPlay ()
|
||||||
|
|
|
@ -103,6 +103,9 @@ bool AWeapon::Use (bool pickup)
|
||||||
{
|
{
|
||||||
AWeapon *useweap = this;
|
AWeapon *useweap = this;
|
||||||
|
|
||||||
|
// Powered up weapons cannot be used directly.
|
||||||
|
if (WeaponFlags & WIF_POWERED_UP) return false;
|
||||||
|
|
||||||
// If the player is powered-up, use the alternate version of the
|
// If the player is powered-up, use the alternate version of the
|
||||||
// weapon, if one exists.
|
// weapon, if one exists.
|
||||||
if (SisterWeapon != NULL &&
|
if (SisterWeapon != NULL &&
|
||||||
|
|
|
@ -257,14 +257,17 @@ enum
|
||||||
ADEF_Flags2, // "
|
ADEF_Flags2, // "
|
||||||
ADEF_Flags3, // "
|
ADEF_Flags3, // "
|
||||||
ADEF_Flags4, // "
|
ADEF_Flags4, // "
|
||||||
|
ADEF_Flags5, // "
|
||||||
ADEF_FlagsSet, // Or these flags with previous
|
ADEF_FlagsSet, // Or these flags with previous
|
||||||
ADEF_Flags2Set, // "
|
ADEF_Flags2Set, // "
|
||||||
ADEF_Flags3Set, // "
|
ADEF_Flags3Set, // "
|
||||||
ADEF_Flags4Set, // "
|
ADEF_Flags4Set, // "
|
||||||
|
ADEF_Flags5Set, // "
|
||||||
ADEF_FlagsClear, // Clear these flags from previous
|
ADEF_FlagsClear, // Clear these flags from previous
|
||||||
ADEF_Flags2Clear, // "
|
ADEF_Flags2Clear, // "
|
||||||
ADEF_Flags3Clear, // "
|
ADEF_Flags3Clear, // "
|
||||||
ADEF_Flags4Clear, // "
|
ADEF_Flags4Clear, // "
|
||||||
|
ADEF_Flags5Clear, // "
|
||||||
ADEF_Alpha,
|
ADEF_Alpha,
|
||||||
ADEF_RenderStyle,
|
ADEF_RenderStyle,
|
||||||
ADEF_RenderFlags,
|
ADEF_RenderFlags,
|
||||||
|
|
|
@ -194,14 +194,17 @@ static void ApplyActorDefault (int defnum, const char *datastr, int dataint)
|
||||||
case ADEF_Flags2: actor->flags2 = dataint; break;
|
case ADEF_Flags2: actor->flags2 = dataint; break;
|
||||||
case ADEF_Flags3: actor->flags3 = dataint; break;
|
case ADEF_Flags3: actor->flags3 = dataint; break;
|
||||||
case ADEF_Flags4: actor->flags4 = dataint; break;
|
case ADEF_Flags4: actor->flags4 = dataint; break;
|
||||||
|
case ADEF_Flags5: actor->flags5 = dataint; break;
|
||||||
case ADEF_FlagsSet: actor->flags |= dataint; break;
|
case ADEF_FlagsSet: actor->flags |= dataint; break;
|
||||||
case ADEF_Flags2Set: actor->flags2 |= dataint; break;
|
case ADEF_Flags2Set: actor->flags2 |= dataint; break;
|
||||||
case ADEF_Flags3Set: actor->flags3 |= dataint; break;
|
case ADEF_Flags3Set: actor->flags3 |= dataint; break;
|
||||||
case ADEF_Flags4Set: actor->flags4 |= dataint; break;
|
case ADEF_Flags4Set: actor->flags4 |= dataint; break;
|
||||||
|
case ADEF_Flags5Set: actor->flags5 |= dataint; break;
|
||||||
case ADEF_FlagsClear: actor->flags &= ~dataint; break;
|
case ADEF_FlagsClear: actor->flags &= ~dataint; break;
|
||||||
case ADEF_Flags2Clear: actor->flags2 &= ~dataint; break;
|
case ADEF_Flags2Clear: actor->flags2 &= ~dataint; break;
|
||||||
case ADEF_Flags3Clear: actor->flags3 &= ~dataint; break;
|
case ADEF_Flags3Clear: actor->flags3 &= ~dataint; break;
|
||||||
case ADEF_Flags4Clear: actor->flags4 &= ~dataint; break;
|
case ADEF_Flags4Clear: actor->flags4 &= ~dataint; break;
|
||||||
|
case ADEF_Flags5Clear: actor->flags5 &= ~dataint; break;
|
||||||
case ADEF_Alpha: actor->alpha = dataint; break;
|
case ADEF_Alpha: actor->alpha = dataint; break;
|
||||||
case ADEF_RenderStyle: actor->RenderStyle = dataint; break;
|
case ADEF_RenderStyle: actor->RenderStyle = dataint; break;
|
||||||
case ADEF_RenderFlags: actor->renderflags = dataint; break;
|
case ADEF_RenderFlags: actor->renderflags = dataint; break;
|
||||||
|
|
|
@ -237,14 +237,17 @@ public:
|
||||||
#define PROP_Flags2(x) ADD_LONG_PROP(ADEF_Flags2,x)
|
#define PROP_Flags2(x) ADD_LONG_PROP(ADEF_Flags2,x)
|
||||||
#define PROP_Flags3(x) ADD_LONG_PROP(ADEF_Flags3,x)
|
#define PROP_Flags3(x) ADD_LONG_PROP(ADEF_Flags3,x)
|
||||||
#define PROP_Flags4(x) ADD_LONG_PROP(ADEF_Flags4,x)
|
#define PROP_Flags4(x) ADD_LONG_PROP(ADEF_Flags4,x)
|
||||||
|
#define PROP_Flags5(x) ADD_LONG_PROP(ADEF_Flags5,x)
|
||||||
#define PROP_FlagsSet(x) ADD_LONG_PROP(ADEF_FlagsSet,x)
|
#define PROP_FlagsSet(x) ADD_LONG_PROP(ADEF_FlagsSet,x)
|
||||||
#define PROP_Flags2Set(x) ADD_LONG_PROP(ADEF_Flags2Set,x)
|
#define PROP_Flags2Set(x) ADD_LONG_PROP(ADEF_Flags2Set,x)
|
||||||
#define PROP_Flags3Set(x) ADD_LONG_PROP(ADEF_Flags3Set,x)
|
#define PROP_Flags3Set(x) ADD_LONG_PROP(ADEF_Flags3Set,x)
|
||||||
#define PROP_Flags4Set(x) ADD_LONG_PROP(ADEF_Flags4Set,x)
|
#define PROP_Flags4Set(x) ADD_LONG_PROP(ADEF_Flags4Set,x)
|
||||||
|
#define PROP_Flags5Set(x) ADD_LONG_PROP(ADEF_Flags5Set,x)
|
||||||
#define PROP_FlagsClear(x) ADD_LONG_PROP(ADEF_FlagsClear,x)
|
#define PROP_FlagsClear(x) ADD_LONG_PROP(ADEF_FlagsClear,x)
|
||||||
#define PROP_Flags2Clear(x) ADD_LONG_PROP(ADEF_Flags2Clear,x)
|
#define PROP_Flags2Clear(x) ADD_LONG_PROP(ADEF_Flags2Clear,x)
|
||||||
#define PROP_Flags3Clear(x) ADD_LONG_PROP(ADEF_Flags3Clear,x)
|
#define PROP_Flags3Clear(x) ADD_LONG_PROP(ADEF_Flags3Clear,x)
|
||||||
#define PROP_Flags4Clear(x) ADD_LONG_PROP(ADEF_Flags4Clear,x)
|
#define PROP_Flags4Clear(x) ADD_LONG_PROP(ADEF_Flags4Clear,x)
|
||||||
|
#define PROP_Flags5Clear(x) ADD_LONG_PROP(ADEF_Flags5Clear,x)
|
||||||
#define PROP_Alpha(x) ADD_LONG_PROP(ADEF_Alpha,x)
|
#define PROP_Alpha(x) ADD_LONG_PROP(ADEF_Alpha,x)
|
||||||
#define PROP_RenderStyle(x) ADD_BYTE_PROP(ADEF_RenderStyle,x)
|
#define PROP_RenderStyle(x) ADD_BYTE_PROP(ADEF_RenderStyle,x)
|
||||||
#define PROP_RenderFlags(x) ADD_WORD_PROP(ADEF_RenderFlags,x)
|
#define PROP_RenderFlags(x) ADD_WORD_PROP(ADEF_RenderFlags,x)
|
||||||
|
|
|
@ -271,6 +271,12 @@ void cht_DoCheat (player_t *player, int cheat)
|
||||||
// [GRB]
|
// [GRB]
|
||||||
case CHT_RESSURECT:
|
case CHT_RESSURECT:
|
||||||
if (player->playerstate != PST_LIVE && player->mo != NULL)
|
if (player->playerstate != PST_LIVE && player->mo != NULL)
|
||||||
|
{
|
||||||
|
if (player->mo->IsKindOf(RUNTIME_CLASS(APlayerChunk)))
|
||||||
|
{
|
||||||
|
Printf("Unable to resurrect. Player is no longer connected to its body.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
player->playerstate = PST_LIVE;
|
player->playerstate = PST_LIVE;
|
||||||
if (player->mo->tracer != NULL)
|
if (player->mo->tracer != NULL)
|
||||||
|
@ -291,6 +297,7 @@ void cht_DoCheat (player_t *player, int cheat)
|
||||||
player->mo->GiveDefaultInventory();
|
player->mo->GiveDefaultInventory();
|
||||||
P_SetPsprite(player, ps_weapon, player->ReadyWeapon->UpState);
|
P_SetPsprite(player, ps_weapon, player->ReadyWeapon->UpState);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CHT_TAKEWEAPS:
|
case CHT_TAKEWEAPS:
|
||||||
|
|
|
@ -1770,7 +1770,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
|
||||||
{
|
{
|
||||||
// If this is a monster, subtract it from the total monster
|
// If this is a monster, subtract it from the total monster
|
||||||
// count, because it already added to it during spawning.
|
// count, because it already added to it during spawning.
|
||||||
if (actor->flags & MF_COUNTKILL)
|
if (actor->CountsAsKill())
|
||||||
{
|
{
|
||||||
level.total_monsters--;
|
level.total_monsters--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -411,7 +411,7 @@ void AActor::Die (AActor *source, AActor *inflictor)
|
||||||
|
|
||||||
if (source && source->player)
|
if (source && source->player)
|
||||||
{
|
{
|
||||||
if (flags & MF_COUNTKILL)
|
if (CountsAsKill())
|
||||||
{ // count for intermission
|
{ // count for intermission
|
||||||
source->player->killcount++;
|
source->player->killcount++;
|
||||||
level.killed_monsters++;
|
level.killed_monsters++;
|
||||||
|
@ -553,7 +553,7 @@ void AActor::Die (AActor *source, AActor *inflictor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!multiplayer && (flags & MF_COUNTKILL))
|
else if (!multiplayer && CountsAsKill())
|
||||||
{
|
{
|
||||||
// count all monster deaths,
|
// count all monster deaths,
|
||||||
// even those caused by other monsters
|
// even those caused by other monsters
|
||||||
|
|
|
@ -1032,8 +1032,8 @@ FUNC(LS_Thing_Remove)
|
||||||
// Don't remove live players.
|
// Don't remove live players.
|
||||||
if (actor->player == NULL || actor != actor->player->mo)
|
if (actor->player == NULL || actor != actor->player->mo)
|
||||||
{
|
{
|
||||||
// be friendly to the level statistics! ;)
|
// be friendly to the level statistics. ;)
|
||||||
if (actor->flags&MF_COUNTKILL && actor->health > 0) level.total_monsters--;
|
if (actor->CountsAsKill() && actor->health > 0) level.total_monsters--;
|
||||||
if (actor->flags&MF_COUNTITEM) level.total_items--;
|
if (actor->flags&MF_COUNTITEM) level.total_items--;
|
||||||
actor->Destroy ();
|
actor->Destroy ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1307,7 +1307,7 @@ BOOL P_CheckPosition (AActor *thing, fixed_t x, fixed_t y)
|
||||||
// other things in the blocks and see if we hit something that is
|
// other things in the blocks and see if we hit something that is
|
||||||
// definitely blocking. Otherwise, we need to check the lines, or we
|
// definitely blocking. Otherwise, we need to check the lines, or we
|
||||||
// could end up stuck inside a wall.
|
// could end up stuck inside a wall.
|
||||||
if (BlockingMobj == NULL)
|
if (BlockingMobj == NULL || (compatflags & COMPATF_NO_PASSMOBJ))
|
||||||
{ // Thing slammed into something; don't let it move now.
|
{ // Thing slammed into something; don't let it move now.
|
||||||
thing->height = realheight;
|
thing->height = realheight;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -274,6 +274,7 @@ void AActor::Serialize (FArchive &arc)
|
||||||
<< flags2
|
<< flags2
|
||||||
<< flags3
|
<< flags3
|
||||||
<< flags4
|
<< flags4
|
||||||
|
<< flags5
|
||||||
<< special1
|
<< special1
|
||||||
<< special2
|
<< special2
|
||||||
<< health
|
<< health
|
||||||
|
@ -442,6 +443,59 @@ AActor &AActor::operator= (const AActor &other)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AActor::InStateSequence
|
||||||
|
//
|
||||||
|
// Checks whether the current state is in a contiguous sequence that
|
||||||
|
// starts with basestate
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
bool AActor::InStateSequence(FState * newstate, FState * basestate)
|
||||||
|
{
|
||||||
|
if (basestate == NULL) return false;
|
||||||
|
|
||||||
|
FState * thisstate = basestate;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (newstate == thisstate) return true;
|
||||||
|
basestate = thisstate;
|
||||||
|
thisstate = thisstate->GetNextState();
|
||||||
|
}
|
||||||
|
while (thisstate == basestate+1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AActor::GetTics
|
||||||
|
//
|
||||||
|
// Get the actual duration of the next state
|
||||||
|
// This is a more generalized attempt to make the Demon faster in
|
||||||
|
// nightmare mode. Actually changing the states' durations has to
|
||||||
|
// be considered highly problematic.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
int AActor::GetTics(FState * newstate)
|
||||||
|
{
|
||||||
|
int tics = newstate->GetTics();
|
||||||
|
|
||||||
|
if (gameskill == sk_nightmare || (dmflags & DF_FAST_MONSTERS))
|
||||||
|
{
|
||||||
|
if (flags5 & MF5_FASTER)
|
||||||
|
{
|
||||||
|
if (InStateSequence(newstate, SeeState)) return tics - (tics>>1);
|
||||||
|
}
|
||||||
|
if (flags5 & MF5_FASTMELEE)
|
||||||
|
{
|
||||||
|
if (InStateSequence(newstate, MeleeState)) return tics - (tics>>1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tics;
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// AActor::SetState
|
// AActor::SetState
|
||||||
|
@ -473,7 +527,7 @@ bool AActor::SetState (FState *newstate)
|
||||||
prevsprite = -1;
|
prevsprite = -1;
|
||||||
}
|
}
|
||||||
state = newstate;
|
state = newstate;
|
||||||
tics = newstate->GetTics();
|
tics = GetTics(newstate);
|
||||||
renderflags = (renderflags & ~RF_FULLBRIGHT) | newstate->GetFullbright();
|
renderflags = (renderflags & ~RF_FULLBRIGHT) | newstate->GetFullbright();
|
||||||
newsprite = newstate->sprite.index;
|
newsprite = newstate->sprite.index;
|
||||||
if (newsprite != 1)
|
if (newsprite != 1)
|
||||||
|
@ -552,7 +606,7 @@ bool AActor::SetStateNF (FState *newstate)
|
||||||
prevsprite = -1;
|
prevsprite = -1;
|
||||||
}
|
}
|
||||||
state = newstate;
|
state = newstate;
|
||||||
tics = newstate->GetTics();
|
tics = GetTics(newstate);
|
||||||
renderflags = (renderflags & ~RF_FULLBRIGHT) | newstate->GetFullbright();
|
renderflags = (renderflags & ~RF_FULLBRIGHT) | newstate->GetFullbright();
|
||||||
newsprite = newstate->sprite.index;
|
newsprite = newstate->sprite.index;
|
||||||
if (newsprite != 1)
|
if (newsprite != 1)
|
||||||
|
@ -788,6 +842,7 @@ bool AActor::GiveAmmo (const TypeInfo *type, int amount)
|
||||||
|
|
||||||
void AActor::CopyFriendliness (const AActor *other, bool changeTarget)
|
void AActor::CopyFriendliness (const AActor *other, bool changeTarget)
|
||||||
{
|
{
|
||||||
|
level.total_monsters -= CountsAsKill();
|
||||||
TIDtoHate = other->TIDtoHate;
|
TIDtoHate = other->TIDtoHate;
|
||||||
LastLook = other->LastLook;
|
LastLook = other->LastLook;
|
||||||
flags = (flags & ~MF_FRIENDLY) | (other->flags & MF_FRIENDLY);
|
flags = (flags & ~MF_FRIENDLY) | (other->flags & MF_FRIENDLY);
|
||||||
|
@ -798,6 +853,7 @@ void AActor::CopyFriendliness (const AActor *other, bool changeTarget)
|
||||||
{
|
{
|
||||||
target = other->target;
|
target = other->target;
|
||||||
}
|
}
|
||||||
|
level.total_monsters += CountsAsKill();
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -1759,7 +1815,7 @@ void P_ZMovement (AActor *mo)
|
||||||
//
|
//
|
||||||
// adjust height
|
// adjust height
|
||||||
//
|
//
|
||||||
if ((mo->flags & MF_FLOAT) && mo->target)
|
if ((mo->flags & MF_FLOAT) && !(mo->flags2 & MF2_DORMANT) && mo->target)
|
||||||
{ // float down towards target if too close
|
{ // float down towards target if too close
|
||||||
if (!(mo->flags & MF_SKULLFLY) && !(mo->flags & MF_INFLOAT))
|
if (!(mo->flags & MF_SKULLFLY) && !(mo->flags & MF_INFLOAT))
|
||||||
{
|
{
|
||||||
|
@ -2068,8 +2124,8 @@ void P_NightmareRespawn (AActor *mobj)
|
||||||
// something is occupying its position?
|
// something is occupying its position?
|
||||||
if (!P_TestMobjLocation (mo))
|
if (!P_TestMobjLocation (mo))
|
||||||
{
|
{
|
||||||
//[GrafZahl] MF_COUNTKILL still needs to be checked here!
|
//[GrafZahl] MF_COUNTKILL still needs to be checked here.
|
||||||
if (mo->flags & MF_COUNTKILL) level.total_monsters--;
|
if (mo->CountsAsKill()) level.total_monsters--;
|
||||||
mo->Destroy ();
|
mo->Destroy ();
|
||||||
return; // no respawn
|
return; // no respawn
|
||||||
}
|
}
|
||||||
|
@ -2316,8 +2372,8 @@ bool AActor::IsOkayToAttack (AActor *link)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AActor::ChangeSpecial (byte special, byte data1, byte data2,
|
void AActor::ChangeSpecial (int special, int data1, int data2,
|
||||||
byte data3, byte data4, byte data5)
|
int data3, int data4, int data5)
|
||||||
{
|
{
|
||||||
this->special = special;
|
this->special = special;
|
||||||
args[0] = data1;
|
args[0] = data1;
|
||||||
|
@ -3048,7 +3104,7 @@ AActor *AActor::StaticSpawn (const TypeInfo *type, fixed_t ix, fixed_t iy, fixed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// [RH] Count monsters whenever they are spawned.
|
// [RH] Count monsters whenever they are spawned.
|
||||||
if (actor->flags & MF_COUNTKILL)
|
if (actor->CountsAsKill())
|
||||||
{
|
{
|
||||||
level.total_monsters++;
|
level.total_monsters++;
|
||||||
}
|
}
|
||||||
|
@ -3087,7 +3143,6 @@ void AActor::HandleSpawnFlags ()
|
||||||
if (SpawnFlags & MTF_FRIENDLY)
|
if (SpawnFlags & MTF_FRIENDLY)
|
||||||
{
|
{
|
||||||
flags |= MF_FRIENDLY;
|
flags |= MF_FRIENDLY;
|
||||||
// Friendlies don't count as kills!
|
|
||||||
if (flags & MF_COUNTKILL)
|
if (flags & MF_COUNTKILL)
|
||||||
{
|
{
|
||||||
flags &= ~MF_COUNTKILL;
|
flags &= ~MF_COUNTKILL;
|
||||||
|
@ -3728,7 +3783,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
|
||||||
|
|
||||||
// [RH] Set the thing's special
|
// [RH] Set the thing's special
|
||||||
mobj->special = mthing->special;
|
mobj->special = mthing->special;
|
||||||
memcpy (mobj->args, mthing->args, sizeof(mobj->args));
|
for(int j=0;j<5;j++) mobj->args[j]=mthing->args[j];
|
||||||
|
|
||||||
// [RH] Add ThingID to mobj and link it in with the others
|
// [RH] Add ThingID to mobj and link it in with the others
|
||||||
mobj->tid = mthing->thingid;
|
mobj->tid = mthing->thingid;
|
||||||
|
|
|
@ -553,6 +553,7 @@ void P_LoadSegs (int lump)
|
||||||
Printf ("This map has no segs.\n");
|
Printf ("This map has no segs.\n");
|
||||||
delete[] subsectors;
|
delete[] subsectors;
|
||||||
delete[] nodes;
|
delete[] nodes;
|
||||||
|
delete[] vertchanged;
|
||||||
ForceNodeBuild = true;
|
ForceNodeBuild = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -700,7 +701,6 @@ void P_LoadSegs (int lump)
|
||||||
delete[] subsectors;
|
delete[] subsectors;
|
||||||
delete[] nodes;
|
delete[] nodes;
|
||||||
ForceNodeBuild = true;
|
ForceNodeBuild = true;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] vertchanged; // phares 10/4/98
|
delete[] vertchanged; // phares 10/4/98
|
||||||
|
|
|
@ -428,7 +428,7 @@ static WORD AddSwitchDef (FSwitchDef *def)
|
||||||
// Start a button counting down till it turns off.
|
// Start a button counting down till it turns off.
|
||||||
// [RH] Rewritten to remove MAXBUTTONS limit.
|
// [RH] Rewritten to remove MAXBUTTONS limit.
|
||||||
//
|
//
|
||||||
static void P_StartButton (side_t *side, DActiveButton::EWhere w, int switchnum,
|
static bool P_StartButton (side_t *side, DActiveButton::EWhere w, int switchnum,
|
||||||
fixed_t x, fixed_t y, bool useagain)
|
fixed_t x, fixed_t y, bool useagain)
|
||||||
{
|
{
|
||||||
DActiveButton *button;
|
DActiveButton *button;
|
||||||
|
@ -438,10 +438,14 @@ static void P_StartButton (side_t *side, DActiveButton::EWhere w, int switchnum,
|
||||||
while ( (button = iterator.Next ()) )
|
while ( (button = iterator.Next ()) )
|
||||||
{
|
{
|
||||||
if (button->m_Side == side)
|
if (button->m_Side == side)
|
||||||
return;
|
{
|
||||||
|
button->m_Timer=1; // force advancing to the next frame
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new DActiveButton (side, w, switchnum, x, y, useagain);
|
new DActiveButton (side, w, switchnum, x, y, useagain);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int TryFindSwitch (SWORD texture)
|
static int TryFindSwitch (SWORD texture)
|
||||||
|
@ -527,13 +531,16 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, byte special, bool *ques
|
||||||
// button just activated, either).
|
// button just activated, either).
|
||||||
fixed_t pt[3];
|
fixed_t pt[3];
|
||||||
line_t *line = &lines[side->linenum];
|
line_t *line = &lines[side->linenum];
|
||||||
|
bool playsound;
|
||||||
|
|
||||||
pt[0] = line->v1->x + (line->dx >> 1);
|
pt[0] = line->v1->x + (line->dx >> 1);
|
||||||
pt[1] = line->v1->y + (line->dy >> 1);
|
pt[1] = line->v1->y + (line->dy >> 1);
|
||||||
S_SoundID (pt, CHAN_VOICE|CHAN_LISTENERZ|CHAN_IMMOBILE, sound, 1, ATTN_STATIC);
|
|
||||||
*texture = SwitchList[i]->u.Textures[SwitchList[i]->NumFrames*2];
|
*texture = SwitchList[i]->u.Textures[SwitchList[i]->NumFrames*2];
|
||||||
if (useAgain || SwitchList[i]->NumFrames > 1)
|
if (useAgain || SwitchList[i]->NumFrames > 1)
|
||||||
P_StartButton (side, where, i, pt[0], pt[1], !!useAgain);
|
playsound = P_StartButton (side, where, i, pt[0], pt[1], !!useAgain);
|
||||||
|
else
|
||||||
|
playsound = true;
|
||||||
|
if (playsound) S_SoundID (pt, CHAN_VOICE|CHAN_LISTENERZ|CHAN_IMMOBILE, sound, 1, ATTN_STATIC);
|
||||||
if (quest != NULL)
|
if (quest != NULL)
|
||||||
{
|
{
|
||||||
*quest = SwitchList[i]->QuestPanel;
|
*quest = SwitchList[i]->QuestPanel;
|
||||||
|
|
|
@ -116,6 +116,7 @@ void ATeleportFog::PostBeginPlay ()
|
||||||
|
|
||||||
IMPLEMENT_STATELESS_ACTOR (ATeleportDest, Any, 14, 0)
|
IMPLEMENT_STATELESS_ACTOR (ATeleportDest, Any, 14, 0)
|
||||||
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
|
PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
|
||||||
|
PROP_Flags3(MF3_DONTSPLASH)
|
||||||
END_DEFAULTS
|
END_DEFAULTS
|
||||||
|
|
||||||
// Teleport dest that can spawn above floor
|
// Teleport dest that can spawn above floor
|
||||||
|
|
|
@ -93,7 +93,7 @@ bool P_Thing_Spawn (int tid, int type, angle_t angle, bool fog, int newtid)
|
||||||
{
|
{
|
||||||
// If this is a monster, subtract it from the total monster
|
// If this is a monster, subtract it from the total monster
|
||||||
// count, because it already added to it during spawning.
|
// count, because it already added to it during spawning.
|
||||||
if (mobj->flags & MF_COUNTKILL)
|
if (mobj->CountsAsKill())
|
||||||
{
|
{
|
||||||
level.total_monsters--;
|
level.total_monsters--;
|
||||||
}
|
}
|
||||||
|
@ -337,7 +337,7 @@ nolead:
|
||||||
{
|
{
|
||||||
// If this is a monster, subtract it from the total monster
|
// If this is a monster, subtract it from the total monster
|
||||||
// count, because it already added to it during spawning.
|
// count, because it already added to it during spawning.
|
||||||
if (mobj->flags & MF_COUNTKILL)
|
if (mobj->CountsAsKill())
|
||||||
{
|
{
|
||||||
level.total_monsters--;
|
level.total_monsters--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -268,8 +268,8 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld)
|
||||||
ld->special = *tlate++;
|
ld->special = *tlate++;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
short *destp;
|
int *destp;
|
||||||
short flagtemp;
|
int flagtemp;
|
||||||
BYTE op = *tlate++;
|
BYTE op = *tlate++;
|
||||||
BYTE dest;
|
BYTE dest;
|
||||||
BYTE val = 0; // quiet, GCC
|
BYTE val = 0; // quiet, GCC
|
||||||
|
@ -291,7 +291,7 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
flagtemp = short((flags >> 9) & 0x3f);
|
flagtemp = ((flags >> 9) & 0x3f);
|
||||||
destp = &flagtemp;
|
destp = &flagtemp;
|
||||||
}
|
}
|
||||||
lsize = op >> 4;
|
lsize = op >> 4;
|
||||||
|
|
|
@ -385,7 +385,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec,
|
||||||
|
|
||||||
if (ceilinglightlevel != NULL)
|
if (ceilinglightlevel != NULL)
|
||||||
{
|
{
|
||||||
*ceilinglightlevel = GetFloorLight (s);
|
*ceilinglightlevel = GetCeilingLight (s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FakeSide = FAKED_BelowFloor;
|
FakeSide = FAKED_BelowFloor;
|
||||||
|
@ -504,7 +504,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec,
|
||||||
|
|
||||||
if (ceilinglightlevel != NULL)
|
if (ceilinglightlevel != NULL)
|
||||||
{
|
{
|
||||||
*ceilinglightlevel = GetFloorLight (s);
|
*ceilinglightlevel = GetCeilingLight (s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FakeSide = FAKED_BelowFloor;
|
FakeSide = FAKED_BelowFloor;
|
||||||
|
|
|
@ -428,9 +428,7 @@ struct line_s
|
||||||
byte special; // [RH] specials are only one byte (like Hexen)
|
byte special; // [RH] specials are only one byte (like Hexen)
|
||||||
byte alpha; // <--- translucency (0-255/255=opaque)
|
byte alpha; // <--- translucency (0-255/255=opaque)
|
||||||
short id; // <--- same as tag or set with Line_SetIdentification
|
short id; // <--- same as tag or set with Line_SetIdentification
|
||||||
short args[5]; // <--- hexen-style arguments
|
int args[5]; // <--- hexen-style arguments (expanded to ZDoom's full width)
|
||||||
// note that these are shorts in order to support
|
|
||||||
// the tag parameter from DOOM.
|
|
||||||
int firstid, nextid;
|
int firstid, nextid;
|
||||||
DWORD sidenum[2]; // sidenum[1] will be 0xffffffff if one sided
|
DWORD sidenum[2]; // sidenum[1] will be 0xffffffff if one sided
|
||||||
fixed_t bbox[4]; // bounding box, for the extent of the LineDef.
|
fixed_t bbox[4]; // bounding box, for the extent of the LineDef.
|
||||||
|
|
|
@ -1101,7 +1101,7 @@ void A_SpawnItem(AActor * self)
|
||||||
if (!P_TestMobjLocation(mo))
|
if (!P_TestMobjLocation(mo))
|
||||||
{
|
{
|
||||||
// The monster is blocked so don't spawn it at all!
|
// The monster is blocked so don't spawn it at all!
|
||||||
if (mo->flags&MF_COUNTKILL) level.total_monsters--;
|
if (mo->CountsAsKill()) level.total_monsters--;
|
||||||
mo->Destroy();
|
mo->Destroy();
|
||||||
StateCall.Result=false; // for an inventory iten's use state
|
StateCall.Result=false; // for an inventory iten's use state
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -943,6 +943,8 @@ $alias menu/dismiss PlatformStop
|
||||||
$alias menu/choose DoorCloseLight
|
$alias menu/choose DoorCloseLight
|
||||||
$alias menu/clear PlatformStop
|
$alias menu/clear PlatformStop
|
||||||
|
|
||||||
|
$limit DoorCloseLight 4
|
||||||
|
|
||||||
$endif // ifhexen
|
$endif // ifhexen
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
|
@ -1775,6 +1775,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\src\thingdef.cpp">
|
RelativePath=".\src\thingdef.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\thingdef.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\src\thingdef_codeptr.cpp">
|
RelativePath=".\src\thingdef_codeptr.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
|
Loading…
Reference in a new issue