SVN r49 (trunk)

This commit is contained in:
Christoph Oelckers 2006-04-16 13:29:50 +00:00
parent 3165756b02
commit da51ac7446
37 changed files with 212 additions and 94 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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
{ {

View file

@ -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;

View file

@ -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;
} }
} }

View file

@ -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)

View file

@ -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)

View file

@ -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))

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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 ()

View file

@ -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 ()

View file

@ -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 -------------------------------------------------------------

View file

@ -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 ()

View file

@ -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 ()

View file

@ -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 ()

View file

@ -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 &&

View file

@ -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,

View file

@ -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;

View file

@ -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)

View file

@ -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:

View file

@ -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--;
} }

View file

@ -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

View file

@ -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 ();
} }

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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--;
} }

View file

@ -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;

View file

@ -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;

View file

@ -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.

View file

@ -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;

View file

@ -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
//=========================================================================== //===========================================================================

View file

@ -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>