mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-24 12:51:09 +00:00
Merge branch 'master' of https://github.com/rheit/zdoom
This commit is contained in:
commit
bb85625d52
29 changed files with 445 additions and 171 deletions
|
@ -1294,10 +1294,17 @@ if( MSVC )
|
||||||
set_target_properties(zdoom PROPERTIES LINK_FLAGS "/MANIFEST:NO /DELAYLOAD:\"fmodex${X64}.dll\" /DELAYLOAD:\"openal32.dll\" /DELAYLOAD:\"libmpg123-0.dll\" /DELAYLOAD:\"libsndfile-1.dll\"")
|
set_target_properties(zdoom PROPERTIES LINK_FLAGS "/MANIFEST:NO /DELAYLOAD:\"fmodex${X64}.dll\" /DELAYLOAD:\"openal32.dll\" /DELAYLOAD:\"libmpg123-0.dll\" /DELAYLOAD:\"libsndfile-1.dll\"")
|
||||||
endif( ZDOOM_GENERATE_MAPFILE )
|
endif( ZDOOM_GENERATE_MAPFILE )
|
||||||
|
|
||||||
|
if( NO_GENERATOR_EXPRESSIONS )
|
||||||
add_custom_command(TARGET zdoom POST_BUILD
|
add_custom_command(TARGET zdoom POST_BUILD
|
||||||
COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\win32\\zdoom.exe.manifest\" -outputresource:\"$(TargetDir)$(TargetFileName)\"\;\#1
|
COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\win32\\zdoom.exe.manifest\" -outputresource:\"$(TargetDir)$(TargetFileName)\"\;\#1
|
||||||
COMMENT "Adding manifest..."
|
COMMENT "Adding manifest..."
|
||||||
)
|
)
|
||||||
|
else( NO_GENERATOR_EXPRESSIONS )
|
||||||
|
add_custom_command(TARGET zdoom POST_BUILD
|
||||||
|
COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\win32\\zdoom.exe.manifest\" -outputresource:\"$<TARGET_FILE:zdoom>\"\;\#1
|
||||||
|
COMMENT "Adding manifest..."
|
||||||
|
)
|
||||||
|
endif( NO_GENERATOR_EXPRESSIONS )
|
||||||
|
|
||||||
create_default_target_launcher( zdoom WORKING_DIRECTORY ${ZDOOM_OUTPUT_DIR} )
|
create_default_target_launcher( zdoom WORKING_DIRECTORY ${ZDOOM_OUTPUT_DIR} )
|
||||||
endif( MSVC )
|
endif( MSVC )
|
||||||
|
|
84
src/actor.h
84
src/actor.h
|
@ -39,6 +39,7 @@
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "memarena.h"
|
#include "memarena.h"
|
||||||
#include "g_level.h"
|
#include "g_level.h"
|
||||||
|
#include "tflags.h"
|
||||||
|
|
||||||
struct subsector_t;
|
struct subsector_t;
|
||||||
//
|
//
|
||||||
|
@ -105,10 +106,9 @@ struct subsector_t;
|
||||||
// Any questions?
|
// Any questions?
|
||||||
//
|
//
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
// --- mobj.flags ---
|
// --- mobj.flags ---
|
||||||
|
enum ActorFlag
|
||||||
|
{
|
||||||
MF_SPECIAL = 0x00000001, // call P_SpecialThing when touched
|
MF_SPECIAL = 0x00000001, // call P_SpecialThing when touched
|
||||||
MF_SOLID = 0x00000002,
|
MF_SOLID = 0x00000002,
|
||||||
MF_SHOOTABLE = 0x00000004,
|
MF_SHOOTABLE = 0x00000004,
|
||||||
|
@ -152,8 +152,13 @@ enum
|
||||||
MF_STEALTH = 0x40000000, // [RH] Andy Baker's stealth monsters
|
MF_STEALTH = 0x40000000, // [RH] Andy Baker's stealth monsters
|
||||||
MF_ICECORPSE = 0x80000000, // a frozen corpse (for blasting) [RH] was 0x800000
|
MF_ICECORPSE = 0x80000000, // a frozen corpse (for blasting) [RH] was 0x800000
|
||||||
|
|
||||||
// --- mobj.flags2 ---
|
// --- dummies for unknown/unimplemented Strife flags ---
|
||||||
|
MF_STRIFEx8000000 = 0, // seems related to MF_SHADOW
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- mobj.flags2 ---
|
||||||
|
enum ActorFlag2
|
||||||
|
{
|
||||||
MF2_DONTREFLECT = 0x00000001, // this projectile cannot be reflected
|
MF2_DONTREFLECT = 0x00000001, // this projectile cannot be reflected
|
||||||
MF2_WINDTHRUST = 0x00000002, // gets pushed around by the wind specials
|
MF2_WINDTHRUST = 0x00000002, // gets pushed around by the wind specials
|
||||||
MF2_DONTSEEKINVISIBLE=0x00000004, // For seeker missiles: Don't home in on invisible/shadow targets
|
MF2_DONTSEEKINVISIBLE=0x00000004, // For seeker missiles: Don't home in on invisible/shadow targets
|
||||||
|
@ -191,9 +196,11 @@ enum
|
||||||
// args should not be taken from the mapthing definition
|
// args should not be taken from the mapthing definition
|
||||||
MF2_SEEKERMISSILE = 0x40000000, // is a seeker (for reflection)
|
MF2_SEEKERMISSILE = 0x40000000, // is a seeker (for reflection)
|
||||||
MF2_REFLECTIVE = 0x80000000, // reflects missiles
|
MF2_REFLECTIVE = 0x80000000, // reflects missiles
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.flags3 ---
|
// --- mobj.flags3 ---
|
||||||
|
enum ActorFlag3
|
||||||
|
{
|
||||||
MF3_FLOORHUGGER = 0x00000001, // Missile stays on floor
|
MF3_FLOORHUGGER = 0x00000001, // Missile stays on floor
|
||||||
MF3_CEILINGHUGGER = 0x00000002, // Missile stays on ceiling
|
MF3_CEILINGHUGGER = 0x00000002, // Missile stays on ceiling
|
||||||
MF3_NORADIUSDMG = 0x00000004, // Actor does not take radius damage
|
MF3_NORADIUSDMG = 0x00000004, // Actor does not take radius damage
|
||||||
|
@ -226,9 +233,11 @@ enum
|
||||||
MF3_WARNBOT = 0x20000000, // Missile warns bot
|
MF3_WARNBOT = 0x20000000, // Missile warns bot
|
||||||
MF3_PUFFONACTORS = 0x40000000, // Puff appears even when hit bleeding actors
|
MF3_PUFFONACTORS = 0x40000000, // Puff appears even when hit bleeding actors
|
||||||
MF3_HUNTPLAYERS = 0x80000000, // Used with TIDtoHate, means to hate players too
|
MF3_HUNTPLAYERS = 0x80000000, // Used with TIDtoHate, means to hate players too
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.flags4 ---
|
// --- mobj.flags4 ---
|
||||||
|
enum ActorFlag4
|
||||||
|
{
|
||||||
MF4_NOHATEPLAYERS = 0x00000001, // Ignore player attacks
|
MF4_NOHATEPLAYERS = 0x00000001, // Ignore player attacks
|
||||||
MF4_QUICKTORETALIATE= 0x00000002, // Always switch targets when hurt
|
MF4_QUICKTORETALIATE= 0x00000002, // Always switch targets when hurt
|
||||||
MF4_NOICEDEATH = 0x00000004, // Actor never enters an ice death, not even the generic one
|
MF4_NOICEDEATH = 0x00000004, // Actor never enters an ice death, not even the generic one
|
||||||
|
@ -262,9 +271,12 @@ enum
|
||||||
MF4_EXTREMEDEATH = 0x20000000, // this projectile or weapon always gibs its victim
|
MF4_EXTREMEDEATH = 0x20000000, // this projectile or weapon always gibs its victim
|
||||||
MF4_FRIGHTENED = 0x40000000, // Monster runs away from player
|
MF4_FRIGHTENED = 0x40000000, // Monster runs away from player
|
||||||
MF4_BOSSSPAWNED = 0x80000000, // Spawned by a boss spawn cube
|
MF4_BOSSSPAWNED = 0x80000000, // Spawned by a boss spawn cube
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.flags5 ---
|
// --- mobj.flags5 ---
|
||||||
|
|
||||||
|
enum ActorFlag5
|
||||||
|
{
|
||||||
MF5_DONTDRAIN = 0x00000001, // cannot be drained health from.
|
MF5_DONTDRAIN = 0x00000001, // cannot be drained health from.
|
||||||
/* = 0x00000002, reserved for use by scripting branch */
|
/* = 0x00000002, reserved for use by scripting branch */
|
||||||
MF5_NODROPOFF = 0x00000004, // cannot drop off under any circumstances.
|
MF5_NODROPOFF = 0x00000004, // cannot drop off under any circumstances.
|
||||||
|
@ -298,9 +310,11 @@ enum
|
||||||
MF5_INCONVERSATION = 0x20000000, // Actor is having a conversation
|
MF5_INCONVERSATION = 0x20000000, // Actor is having a conversation
|
||||||
MF5_PAINLESS = 0x40000000, // Actor always inflicts painless damage.
|
MF5_PAINLESS = 0x40000000, // Actor always inflicts painless damage.
|
||||||
MF5_MOVEWITHSECTOR = 0x80000000, // P_ChangeSector() will still process this actor if it has MF_NOBLOCKMAP
|
MF5_MOVEWITHSECTOR = 0x80000000, // P_ChangeSector() will still process this actor if it has MF_NOBLOCKMAP
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.flags6 ---
|
// --- mobj.flags6 ---
|
||||||
|
enum ActorFlag6
|
||||||
|
{
|
||||||
MF6_NOBOSSRIP = 0x00000001, // For rippermissiles: Don't rip through bosses.
|
MF6_NOBOSSRIP = 0x00000001, // For rippermissiles: Don't rip through bosses.
|
||||||
MF6_THRUSPECIES = 0x00000002, // Actors passes through other of the same species.
|
MF6_THRUSPECIES = 0x00000002, // Actors passes through other of the same species.
|
||||||
MF6_MTHRUSPECIES = 0x00000004, // Missile passes through actors of its shooter's species.
|
MF6_MTHRUSPECIES = 0x00000004, // Missile passes through actors of its shooter's species.
|
||||||
|
@ -333,9 +347,11 @@ enum
|
||||||
MF6_NOTAUTOAIMED = 0x20000000, // Do not subject actor to player autoaim.
|
MF6_NOTAUTOAIMED = 0x20000000, // Do not subject actor to player autoaim.
|
||||||
MF6_NOTONAUTOMAP = 0x40000000, // will not be shown on automap with the 'scanner' powerup.
|
MF6_NOTONAUTOMAP = 0x40000000, // will not be shown on automap with the 'scanner' powerup.
|
||||||
MF6_RELATIVETOFLOOR = 0x80000000, // [RC] Make flying actors be affected by lifts.
|
MF6_RELATIVETOFLOOR = 0x80000000, // [RC] Make flying actors be affected by lifts.
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.flags7 ---
|
// --- mobj.flags7 ---
|
||||||
|
enum ActorFlag7
|
||||||
|
{
|
||||||
MF7_NEVERTARGET = 0x00000001, // can not be targetted at all, even if monster friendliness is considered.
|
MF7_NEVERTARGET = 0x00000001, // can not be targetted at all, even if monster friendliness is considered.
|
||||||
MF7_NOTELESTOMP = 0x00000002, // cannot telefrag under any circumstances (even when set by MAPINFO)
|
MF7_NOTELESTOMP = 0x00000002, // cannot telefrag under any circumstances (even when set by MAPINFO)
|
||||||
MF7_ALWAYSTELEFRAG = 0x00000004, // will unconditionally be telefragged when in the way. Overrides all other settings.
|
MF7_ALWAYSTELEFRAG = 0x00000004, // will unconditionally be telefragged when in the way. Overrides all other settings.
|
||||||
|
@ -354,11 +370,13 @@ enum
|
||||||
MF7_HITMASTER = 0x00008000, // Same as HITTARGET, except it's master instead of target.
|
MF7_HITMASTER = 0x00008000, // Same as HITTARGET, except it's master instead of target.
|
||||||
MF7_HITTRACER = 0x00010000, // Same as HITTARGET, but for tracer.
|
MF7_HITTRACER = 0x00010000, // Same as HITTARGET, but for tracer.
|
||||||
MF7_FLYCHEAT = 0x00020000, // must be part of the actor so that it can be tracked properly
|
MF7_FLYCHEAT = 0x00020000, // must be part of the actor so that it can be tracked properly
|
||||||
|
MF7_NODECAL = 0x00040000, // [ZK] Forces puff to have no impact decal
|
||||||
|
MF7_FORCEDECAL = 0x00080000, // [ZK] Forces puff's decal to override the weapon's.
|
||||||
|
};
|
||||||
|
|
||||||
// --- mobj.renderflags ---
|
// --- mobj.renderflags ---
|
||||||
|
enum ActorRenderFlag
|
||||||
|
{
|
||||||
RF_XFLIP = 0x0001, // Flip sprite horizontally
|
RF_XFLIP = 0x0001, // Flip sprite horizontally
|
||||||
RF_YFLIP = 0x0002, // Flip sprite vertically
|
RF_YFLIP = 0x0002, // Flip sprite vertically
|
||||||
RF_ONESIDED = 0x0004, // Wall/floor sprite is visible from front only
|
RF_ONESIDED = 0x0004, // Wall/floor sprite is visible from front only
|
||||||
|
@ -387,10 +405,6 @@ enum
|
||||||
|
|
||||||
RF_FORCEYBILLBOARD = 0x10000, // [BB] OpenGL only: draw with y axis billboard, i.e. anchored to the floor (overrides gl_billboard_mode setting)
|
RF_FORCEYBILLBOARD = 0x10000, // [BB] OpenGL only: draw with y axis billboard, i.e. anchored to the floor (overrides gl_billboard_mode setting)
|
||||||
RF_FORCEXYBILLBOARD = 0x20000, // [BB] OpenGL only: draw with xy axis billboard, i.e. unanchored (overrides gl_billboard_mode setting)
|
RF_FORCEXYBILLBOARD = 0x20000, // [BB] OpenGL only: draw with xy axis billboard, i.e. unanchored (overrides gl_billboard_mode setting)
|
||||||
|
|
||||||
// --- dummies for unknown/unimplemented Strife flags ---
|
|
||||||
|
|
||||||
MF_STRIFEx8000000 = 0, // seems related to MF_SHADOW
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TRANSLUC25 (FRACUNIT/4)
|
#define TRANSLUC25 (FRACUNIT/4)
|
||||||
|
@ -419,7 +433,7 @@ enum replace_t
|
||||||
ALLOW_REPLACE = 1
|
ALLOW_REPLACE = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EBounceFlags
|
enum ActorBounceFlag
|
||||||
{
|
{
|
||||||
BOUNCE_Walls = 1<<0, // bounces off of walls
|
BOUNCE_Walls = 1<<0, // bounces off of walls
|
||||||
BOUNCE_Floors = 1<<1, // bounces off of floors
|
BOUNCE_Floors = 1<<1, // bounces off of floors
|
||||||
|
@ -473,6 +487,26 @@ enum EBounceFlags
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// [TP] Flagset definitions
|
||||||
|
typedef TFlags<ActorFlag> ActorFlags;
|
||||||
|
typedef TFlags<ActorFlag2> ActorFlags2;
|
||||||
|
typedef TFlags<ActorFlag3> ActorFlags3;
|
||||||
|
typedef TFlags<ActorFlag4> ActorFlags4;
|
||||||
|
typedef TFlags<ActorFlag5> ActorFlags5;
|
||||||
|
typedef TFlags<ActorFlag6> ActorFlags6;
|
||||||
|
typedef TFlags<ActorFlag7> ActorFlags7;
|
||||||
|
typedef TFlags<ActorRenderFlag> ActorRenderFlags;
|
||||||
|
typedef TFlags<ActorBounceFlag, WORD> ActorBounceFlags;
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags2)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags3)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags4)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags5)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags6)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorFlags7)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorRenderFlags)
|
||||||
|
DEFINE_TFLAGS_OPERATORS (ActorBounceFlags)
|
||||||
|
|
||||||
// Used to affect the logic for thing activation through death, USESPECIAL and BUMPSPECIAL
|
// Used to affect the logic for thing activation through death, USESPECIAL and BUMPSPECIAL
|
||||||
// "thing" refers to what has the flag and the special, "trigger" refers to what used or bumped it
|
// "thing" refers to what has the flag and the special, "trigger" refers to what used or bumped it
|
||||||
enum EThingSpecialActivationType
|
enum EThingSpecialActivationType
|
||||||
|
@ -843,7 +877,7 @@ public:
|
||||||
BYTE frame; // sprite frame to draw
|
BYTE frame; // sprite frame to draw
|
||||||
fixed_t scaleX, scaleY; // Scaling values; FRACUNIT is normal size
|
fixed_t scaleX, scaleY; // Scaling values; FRACUNIT is normal size
|
||||||
FRenderStyle RenderStyle; // Style to draw this actor with
|
FRenderStyle RenderStyle; // Style to draw this actor with
|
||||||
DWORD renderflags; // Different rendering flags
|
ActorRenderFlags renderflags; // Different rendering flags
|
||||||
FTextureID picnum; // Draw this instead of sprite if valid
|
FTextureID picnum; // Draw this instead of sprite if valid
|
||||||
DWORD effects; // [RH] see p_effect.h
|
DWORD effects; // [RH] see p_effect.h
|
||||||
fixed_t alpha;
|
fixed_t alpha;
|
||||||
|
@ -869,13 +903,13 @@ public:
|
||||||
FState *state;
|
FState *state;
|
||||||
SDWORD Damage; // For missiles and monster railgun
|
SDWORD Damage; // For missiles and monster railgun
|
||||||
int projectileKickback;
|
int projectileKickback;
|
||||||
DWORD flags;
|
ActorFlags flags;
|
||||||
DWORD flags2; // Heretic flags
|
ActorFlags2 flags2; // Heretic flags
|
||||||
DWORD flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable
|
ActorFlags3 flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable
|
||||||
DWORD flags4; // [RH] Even more flags!
|
ActorFlags4 flags4; // [RH] Even more flags!
|
||||||
DWORD flags5; // OMG! We need another one.
|
ActorFlags5 flags5; // OMG! We need another one.
|
||||||
DWORD flags6; // Shit! Where did all the flags go?
|
ActorFlags6 flags6; // Shit! Where did all the flags go?
|
||||||
DWORD flags7; // WHO WANTS TO BET ON 8!?
|
ActorFlags7 flags7; // WHO WANTS TO BET ON 8!?
|
||||||
|
|
||||||
// [BB] If 0, everybody can see the actor, if > 0, only members of team (VisibleToTeam-1) can see it.
|
// [BB] If 0, everybody can see the actor, if > 0, only members of team (VisibleToTeam-1) can see it.
|
||||||
DWORD VisibleToTeam;
|
DWORD VisibleToTeam;
|
||||||
|
@ -921,7 +955,7 @@ public:
|
||||||
BYTE boomwaterlevel; // splash information for non-swimmable water sectors
|
BYTE boomwaterlevel; // splash information for non-swimmable water sectors
|
||||||
BYTE MinMissileChance;// [RH] If a random # is > than this, then missile attack.
|
BYTE MinMissileChance;// [RH] If a random # is > than this, then missile attack.
|
||||||
SBYTE LastLookPlayerNumber;// Player number last looked for (if TIDtoHate == 0)
|
SBYTE LastLookPlayerNumber;// Player number last looked for (if TIDtoHate == 0)
|
||||||
WORD BounceFlags; // which bouncing type?
|
ActorBounceFlags BounceFlags; // which bouncing type?
|
||||||
DWORD SpawnFlags; // Increased to DWORD because of Doom 64
|
DWORD SpawnFlags; // Increased to DWORD because of Doom 64
|
||||||
fixed_t meleerange; // specifies how far a melee attack reaches.
|
fixed_t meleerange; // specifies how far a melee attack reaches.
|
||||||
fixed_t meleethreshold; // Distance below which a monster doesn't try to shoot missiles anynore
|
fixed_t meleethreshold; // Distance below which a monster doesn't try to shoot missiles anynore
|
||||||
|
|
|
@ -544,7 +544,7 @@ angle_t DBot::FireRox (AActor *enemy, ticcmd_t *cmd)
|
||||||
// creating side-effects during gameplay.
|
// creating side-effects during gameplay.
|
||||||
bool FCajunMaster::SafeCheckPosition (AActor *actor, fixed_t x, fixed_t y, FCheckPosition &tm)
|
bool FCajunMaster::SafeCheckPosition (AActor *actor, fixed_t x, fixed_t y, FCheckPosition &tm)
|
||||||
{
|
{
|
||||||
int savedFlags = actor->flags;
|
ActorFlags savedFlags = actor->flags;
|
||||||
actor->flags &= ~MF_PICKUP;
|
actor->flags &= ~MF_PICKUP;
|
||||||
bool res = P_CheckPosition (actor, x, y, tm);
|
bool res = P_CheckPosition (actor, x, y, tm);
|
||||||
actor->flags = savedFlags;
|
actor->flags = savedFlags;
|
||||||
|
|
|
@ -1135,31 +1135,31 @@ static int PatchThing (int thingy)
|
||||||
// triggering line effects and can teleport when the missile flag is removed.
|
// triggering line effects and can teleport when the missile flag is removed.
|
||||||
info->flags2 &= ~MF2_NOTELEPORT;
|
info->flags2 &= ~MF2_NOTELEPORT;
|
||||||
}
|
}
|
||||||
info->flags = value[0];
|
info->flags = ActorFlags::FromInt (value[0]);
|
||||||
}
|
}
|
||||||
if (vchanged[1])
|
if (vchanged[1])
|
||||||
{
|
{
|
||||||
info->flags2 = value[1];
|
info->flags2 = ActorFlags2::FromInt (value[1]);
|
||||||
if (info->flags2 & 0x00000004) // old BOUNCE1
|
if (info->flags2 & 0x00000004) // old BOUNCE1
|
||||||
{
|
{
|
||||||
info->flags2 &= ~4;
|
info->flags2 &= ActorFlags2::FromInt (~4);
|
||||||
info->BounceFlags = BOUNCE_DoomCompat;
|
info->BounceFlags = BOUNCE_DoomCompat;
|
||||||
}
|
}
|
||||||
// Damage types that once were flags but now are not
|
// Damage types that once were flags but now are not
|
||||||
if (info->flags2 & 0x20000000)
|
if (info->flags2 & 0x20000000)
|
||||||
{
|
{
|
||||||
info->DamageType = NAME_Ice;
|
info->DamageType = NAME_Ice;
|
||||||
info->flags2 &= ~0x20000000;
|
info->flags2 &= ActorFlags2::FromInt (~0x20000000);
|
||||||
}
|
}
|
||||||
if (info->flags2 & 0x10000)
|
if (info->flags2 & 0x10000)
|
||||||
{
|
{
|
||||||
info->DamageType = NAME_Fire;
|
info->DamageType = NAME_Fire;
|
||||||
info->flags2 &= ~0x10000;
|
info->flags2 &= ActorFlags2::FromInt (~0x10000);
|
||||||
}
|
}
|
||||||
if (info->flags2 & 1)
|
if (info->flags2 & 1)
|
||||||
{
|
{
|
||||||
info->gravity = FRACUNIT/4;
|
info->gravity = FRACUNIT/4;
|
||||||
info->flags2 &= ~1;
|
info->flags2 &= ActorFlags2::FromInt (~1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (vchanged[2])
|
if (vchanged[2])
|
||||||
|
@ -1180,8 +1180,8 @@ static int PatchThing (int thingy)
|
||||||
else
|
else
|
||||||
info->renderflags &= ~RF_INVISIBLE;
|
info->renderflags &= ~RF_INVISIBLE;
|
||||||
}
|
}
|
||||||
DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags, info->flags2,
|
DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags.GetValue(), info->flags2.GetValue(),
|
||||||
info->flags, info->flags2);
|
info->flags.GetValue(), info->flags2.GetValue());
|
||||||
}
|
}
|
||||||
else if (stricmp (Line1, "ID #") == 0)
|
else if (stricmp (Line1, "ID #") == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "dobject.h"
|
#include "dobject.h"
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
|
#include "tflags.h"
|
||||||
|
|
||||||
class FFile
|
class FFile
|
||||||
{
|
{
|
||||||
|
@ -333,4 +334,10 @@ FArchive &operator<< (FArchive &arc, side_t *&side);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T, typename TT>
|
||||||
|
FArchive& operator<< (FArchive& arc, TFlags<T, TT>& flag)
|
||||||
|
{
|
||||||
|
return flag.Serialize (arc);
|
||||||
|
}
|
||||||
|
|
||||||
#endif //__FARCHIVE_H__
|
#endif //__FARCHIVE_H__
|
||||||
|
|
|
@ -1223,11 +1223,14 @@ void FParser::SF_ObjFlag(void)
|
||||||
|
|
||||||
if(mo && flagnum<26) // nullptr check
|
if(mo && flagnum<26) // nullptr check
|
||||||
{
|
{
|
||||||
|
DWORD tempflags = mo->flags;
|
||||||
|
|
||||||
// remove old bit
|
// remove old bit
|
||||||
mo->flags &= ~(1 << flagnum);
|
tempflags &= ~(1 << flagnum);
|
||||||
|
|
||||||
// make the new flag
|
// make the new flag
|
||||||
mo->flags |= (!!intvalue(t_argv[2])) << flagnum;
|
tempflags |= (!!intvalue(t_argv[2])) << flagnum;
|
||||||
|
mo->flags = ActorFlags::FromInt (tempflags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
t_return.type = svt_int;
|
t_return.type = svt_int;
|
||||||
|
|
|
@ -1923,7 +1923,7 @@ void APowerMorph::EndEffect( )
|
||||||
if (!bNoCallUndoMorph)
|
if (!bNoCallUndoMorph)
|
||||||
{
|
{
|
||||||
int savedMorphTics = Player->morphTics;
|
int savedMorphTics = Player->morphTics;
|
||||||
P_UndoPlayerMorph (Player, Player);
|
P_UndoPlayerMorph (Player, Player, 0, !!(Player->MorphStyle & MORPH_UNDOALWAYS));
|
||||||
|
|
||||||
// Abort if unmorph failed; in that case,
|
// Abort if unmorph failed; in that case,
|
||||||
// set the usual retry timer and return.
|
// set the usual retry timer and return.
|
||||||
|
|
|
@ -105,7 +105,7 @@ bool P_MorphPlayer (player_t *activator, player_t *p, const PClass *spawntype, i
|
||||||
morphed->flags |= actor->flags & (MF_SHADOW|MF_NOGRAVITY);
|
morphed->flags |= actor->flags & (MF_SHADOW|MF_NOGRAVITY);
|
||||||
morphed->flags2 |= actor->flags2 & MF2_FLY;
|
morphed->flags2 |= actor->flags2 & MF2_FLY;
|
||||||
morphed->flags3 |= actor->flags3 & MF3_GHOST;
|
morphed->flags3 |= actor->flags3 & MF3_GHOST;
|
||||||
Spawn(((enter_flash) ? enter_flash : RUNTIME_CLASS(ATeleportFog)), actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
AActor *eflash = Spawn(((enter_flash) ? enter_flash : RUNTIME_CLASS(ATeleportFog)), actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
||||||
actor->player = NULL;
|
actor->player = NULL;
|
||||||
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
|
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
|
||||||
actor->flags |= MF_UNMORPHED;
|
actor->flags |= MF_UNMORPHED;
|
||||||
|
@ -151,6 +151,8 @@ bool P_MorphPlayer (player_t *activator, player_t *p, const PClass *spawntype, i
|
||||||
p->camera = morphed;
|
p->camera = morphed;
|
||||||
}
|
}
|
||||||
morphed->ScoreIcon = actor->ScoreIcon; // [GRB]
|
morphed->ScoreIcon = actor->ScoreIcon; // [GRB]
|
||||||
|
if (eflash)
|
||||||
|
eflash->target = p->mo;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,7 +225,7 @@ bool P_UndoPlayerMorph (player_t *activator, player_t *player, int unmorphflag,
|
||||||
mo->angle = pmo->angle;
|
mo->angle = pmo->angle;
|
||||||
mo->player = player;
|
mo->player = player;
|
||||||
mo->reactiontime = 18;
|
mo->reactiontime = 18;
|
||||||
mo->flags = pmo->special2 & ~MF_JUSTHIT;
|
mo->flags = ActorFlags::FromInt (pmo->special2) & ~MF_JUSTHIT;
|
||||||
mo->velx = 0;
|
mo->velx = 0;
|
||||||
mo->vely = 0;
|
mo->vely = 0;
|
||||||
player->velx = 0;
|
player->velx = 0;
|
||||||
|
@ -305,9 +307,11 @@ bool P_UndoPlayerMorph (player_t *activator, player_t *player, int unmorphflag,
|
||||||
}
|
}
|
||||||
|
|
||||||
angle = mo->angle >> ANGLETOFINESHIFT;
|
angle = mo->angle >> ANGLETOFINESHIFT;
|
||||||
|
AActor *eflash = NULL;
|
||||||
if (exit_flash != NULL)
|
if (exit_flash != NULL)
|
||||||
{
|
{
|
||||||
Spawn(exit_flash, pmo->x + 20*finecosine[angle], pmo->y + 20*finesine[angle], pmo->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
eflash = Spawn(exit_flash, pmo->x + 20*finecosine[angle], pmo->y + 20*finesine[angle], pmo->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
||||||
|
if (eflash) eflash->target = mo;
|
||||||
}
|
}
|
||||||
mo->SetupWeaponSlots(); // Use original class's weapon slots.
|
mo->SetupWeaponSlots(); // Use original class's weapon slots.
|
||||||
beastweap = player->ReadyWeapon;
|
beastweap = player->ReadyWeapon;
|
||||||
|
@ -406,7 +410,9 @@ bool P_MorphMonster (AActor *actor, const PClass *spawntype, int duration, int s
|
||||||
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
|
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
|
||||||
actor->flags |= MF_UNMORPHED;
|
actor->flags |= MF_UNMORPHED;
|
||||||
actor->renderflags |= RF_INVISIBLE;
|
actor->renderflags |= RF_INVISIBLE;
|
||||||
Spawn(((enter_flash) ? enter_flash : RUNTIME_CLASS(ATeleportFog)), actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
AActor *eflash = Spawn(((enter_flash) ? enter_flash : RUNTIME_CLASS(ATeleportFog)), actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
||||||
|
if (eflash)
|
||||||
|
eflash->target = morphed;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,7 +439,7 @@ bool P_UndoMonsterMorph (AMorphedMonster *beast, bool force)
|
||||||
actor->SetOrigin (beast->x, beast->y, beast->z);
|
actor->SetOrigin (beast->x, beast->y, beast->z);
|
||||||
actor->flags |= MF_SOLID;
|
actor->flags |= MF_SOLID;
|
||||||
beast->flags &= ~MF_SOLID;
|
beast->flags &= ~MF_SOLID;
|
||||||
int beastflags6 = beast->flags6;
|
ActorFlags6 beastflags6 = beast->flags6;
|
||||||
beast->flags6 &= ~MF6_TOUCHY;
|
beast->flags6 &= ~MF6_TOUCHY;
|
||||||
if (!force && !P_TestMobjLocation (actor))
|
if (!force && !P_TestMobjLocation (actor))
|
||||||
{ // Didn't fit
|
{ // Didn't fit
|
||||||
|
@ -466,7 +472,9 @@ bool P_UndoMonsterMorph (AMorphedMonster *beast, bool force)
|
||||||
DObject::StaticPointerSubstitution (beast, actor);
|
DObject::StaticPointerSubstitution (beast, actor);
|
||||||
const PClass *exit_flash = beast->MorphExitFlash;
|
const PClass *exit_flash = beast->MorphExitFlash;
|
||||||
beast->Destroy ();
|
beast->Destroy ();
|
||||||
Spawn(exit_flash, beast->x, beast->y, beast->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
AActor *eflash = Spawn(exit_flash, beast->x, beast->y, beast->z + TELEFOGHEIGHT, ALLOW_REPLACE);
|
||||||
|
if (eflash)
|
||||||
|
eflash->target = actor;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ enum
|
||||||
MORPH_UNDOBYDEATHFORCED = 0x00000400, // Actor (if unmorphed when killed) forces unmorph (not very useful with UNDOBYDEATHSAVES)
|
MORPH_UNDOBYDEATHFORCED = 0x00000400, // Actor (if unmorphed when killed) forces unmorph (not very useful with UNDOBYDEATHSAVES)
|
||||||
MORPH_UNDOBYDEATHSAVES = 0x00000800, // Actor (if unmorphed when killed) regains their health and doesn't die
|
MORPH_UNDOBYDEATHSAVES = 0x00000800, // Actor (if unmorphed when killed) regains their health and doesn't die
|
||||||
MORPH_UNDOBYTIMEOUT = 0x00001000, // Player unmorphs once countdown expires
|
MORPH_UNDOBYTIMEOUT = 0x00001000, // Player unmorphs once countdown expires
|
||||||
|
MORPH_UNDOALWAYS = 0x00002000, // Powerups must always unmorph, no matter what.
|
||||||
|
|
||||||
MORPH_STANDARDUNDOING = MORPH_UNDOBYTOMEOFPOWER | MORPH_UNDOBYCHAOSDEVICE | MORPH_UNDOBYTIMEOUT,
|
MORPH_STANDARDUNDOING = MORPH_UNDOBYTOMEOFPOWER | MORPH_UNDOBYCHAOSDEVICE | MORPH_UNDOBYTIMEOUT,
|
||||||
};
|
};
|
||||||
|
|
|
@ -603,9 +603,9 @@ void AActorMover::Deactivate (AActor *activator)
|
||||||
if (tracer != NULL)
|
if (tracer != NULL)
|
||||||
{
|
{
|
||||||
tracer->UnlinkFromWorld ();
|
tracer->UnlinkFromWorld ();
|
||||||
tracer->flags = special1;
|
tracer->flags = ActorFlags::FromInt (special1);
|
||||||
tracer->LinkToWorld ();
|
tracer->LinkToWorld ();
|
||||||
tracer->flags2 = special2;
|
tracer->flags2 = ActorFlags2::FromInt (special2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,7 +202,7 @@ public:
|
||||||
TObjPtr<AActor> UnmorphedMe;
|
TObjPtr<AActor> UnmorphedMe;
|
||||||
int UnmorphTime, MorphStyle;
|
int UnmorphTime, MorphStyle;
|
||||||
const PClass *MorphExitFlash;
|
const PClass *MorphExitFlash;
|
||||||
DWORD FlagsSave;
|
ActorFlags FlagsSave;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AMapMarker : public AActor
|
class AMapMarker : public AActor
|
||||||
|
|
|
@ -113,8 +113,9 @@ FRandom pr_acs ("ACS");
|
||||||
#define NOT_FLOOR 8
|
#define NOT_FLOOR 8
|
||||||
#define NOT_CEILING 16
|
#define NOT_CEILING 16
|
||||||
|
|
||||||
// LineAtack flags
|
// LineAttack flags
|
||||||
#define FHF_NORANDOMPUFFZ 1
|
#define FHF_NORANDOMPUFFZ 1
|
||||||
|
#define FHF_NOIMPACTDECAL 2
|
||||||
|
|
||||||
// SpawnDecal flags
|
// SpawnDecal flags
|
||||||
#define SDF_ABSANGLE 1
|
#define SDF_ABSANGLE 1
|
||||||
|
@ -1390,7 +1391,7 @@ void FBehavior::StaticLoadDefaultModules ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Printf ("Could not find autoloaded ACS library %s\n", sc.String);
|
Printf (TEXTCOLOR_RED "Could not find autoloaded ACS library %s\n", sc.String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1408,7 +1409,17 @@ FBehavior *FBehavior::StaticLoadModule (int lumpnum, FileReader *fr, int len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new FBehavior (lumpnum, fr, len);
|
FBehavior * behavior = new FBehavior ();
|
||||||
|
if (behavior->Init(lumpnum, fr, len))
|
||||||
|
{
|
||||||
|
return behavior;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete behavior;
|
||||||
|
Printf(TEXTCOLOR_RED "%s: invalid ACS module", Wads.GetLumpFullName(lumpnum));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FBehavior::StaticCheckAllGood ()
|
bool FBehavior::StaticCheckAllGood ()
|
||||||
|
@ -1667,11 +1678,8 @@ static int ParseLocalArrayChunk(void *chunk, ACSLocalArrays *arrays, int offset)
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
FBehavior::FBehavior()
|
||||||
{
|
{
|
||||||
BYTE *object;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
NumScripts = 0;
|
NumScripts = 0;
|
||||||
NumFunctions = 0;
|
NumFunctions = 0;
|
||||||
NumArrays = 0;
|
NumArrays = 0;
|
||||||
|
@ -1683,11 +1691,21 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
Chunks = NULL;
|
Chunks = NULL;
|
||||||
Data = NULL;
|
Data = NULL;
|
||||||
Format = ACS_Unknown;
|
Format = ACS_Unknown;
|
||||||
LumpNum = lumpnum;
|
LumpNum = -1;
|
||||||
memset (MapVarStore, 0, sizeof(MapVarStore));
|
memset (MapVarStore, 0, sizeof(MapVarStore));
|
||||||
ModuleName[0] = 0;
|
ModuleName[0] = 0;
|
||||||
FunctionProfileData = NULL;
|
FunctionProfileData = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FBehavior::Init(int lumpnum, FileReader * fr, int len)
|
||||||
|
{
|
||||||
|
BYTE *object;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
LumpNum = lumpnum;
|
||||||
|
|
||||||
// Now that everything is set up, record this module as being among the loaded modules.
|
// Now that everything is set up, record this module as being among the loaded modules.
|
||||||
// We need to do this before resolving any imports, because an import might (indirectly)
|
// We need to do this before resolving any imports, because an import might (indirectly)
|
||||||
// need to resolve exports in this module. The only things that can be exported are
|
// need to resolve exports in this module. The only things that can be exported are
|
||||||
|
@ -1698,7 +1716,6 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
// 1. If not, corrupt modules cause memory leaks
|
// 1. If not, corrupt modules cause memory leaks
|
||||||
// 2. Corrupt modules won't be reported when a level is being loaded if this function quits before
|
// 2. Corrupt modules won't be reported when a level is being loaded if this function quits before
|
||||||
// adding it to the list.
|
// adding it to the list.
|
||||||
LibraryID = StaticModules.Push (this) << LIBRARYID_SHIFT;
|
|
||||||
|
|
||||||
if (fr == NULL) len = Wads.LumpLength (lumpnum);
|
if (fr == NULL) len = Wads.LumpLength (lumpnum);
|
||||||
|
|
||||||
|
@ -1710,7 +1727,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
// has 24 bytes if it is completely empty. An empty SPTR chunk adds 8 bytes.)
|
// has 24 bytes if it is completely empty. An empty SPTR chunk adds 8 bytes.)
|
||||||
if (len < 32)
|
if (len < 32)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
object = new BYTE[len];
|
object = new BYTE[len];
|
||||||
|
@ -1726,7 +1743,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
if (object[0] != 'A' || object[1] != 'C' || object[2] != 'S')
|
if (object[0] != 'A' || object[1] != 'C' || object[2] != 'S')
|
||||||
{
|
{
|
||||||
delete[] object;
|
delete[] object;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (object[3])
|
switch (object[3])
|
||||||
|
@ -1742,8 +1759,9 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
delete[] object;
|
delete[] object;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
LibraryID = StaticModules.Push (this) << LIBRARYID_SHIFT;
|
||||||
|
|
||||||
if (fr == NULL)
|
if (fr == NULL)
|
||||||
{
|
{
|
||||||
|
@ -2026,7 +2044,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
int lump = Wads.CheckNumForName (&parse[i], ns_acslibrary);
|
int lump = Wads.CheckNumForName (&parse[i], ns_acslibrary);
|
||||||
if (lump < 0)
|
if (lump < 0)
|
||||||
{
|
{
|
||||||
Printf ("Could not find ACS library %s.\n", &parse[i]);
|
Printf (TEXTCOLOR_RED "Could not find ACS library %s.\n", &parse[i]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2067,7 +2085,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
func->ImportNum = i+1;
|
func->ImportNum = i+1;
|
||||||
if (realfunc->ArgCount != func->ArgCount)
|
if (realfunc->ArgCount != func->ArgCount)
|
||||||
{
|
{
|
||||||
Printf ("Function %s in %s has %d arguments. %s expects it to have %d.\n",
|
Printf (TEXTCOLOR_ORANGE "Function %s in %s has %d arguments. %s expects it to have %d.\n",
|
||||||
(char *)(chunk + 2) + chunk[3+j], lib->ModuleName, realfunc->ArgCount,
|
(char *)(chunk + 2) + chunk[3+j], lib->ModuleName, realfunc->ArgCount,
|
||||||
ModuleName, func->ArgCount);
|
ModuleName, func->ArgCount);
|
||||||
Format = ACS_Unknown;
|
Format = ACS_Unknown;
|
||||||
|
@ -2120,7 +2138,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
if (lib->ArrayStore[impNum].ArraySize != expectedSize)
|
if (lib->ArrayStore[impNum].ArraySize != expectedSize)
|
||||||
{
|
{
|
||||||
Format = ACS_Unknown;
|
Format = ACS_Unknown;
|
||||||
Printf ("The array %s in %s has %u elements, but %s expects it to only have %u.\n",
|
Printf (TEXTCOLOR_ORANGE "The array %s in %s has %u elements, but %s expects it to only have %u.\n",
|
||||||
parse, lib->ModuleName, lib->ArrayStore[impNum].ArraySize,
|
parse, lib->ModuleName, lib->ArrayStore[impNum].ArraySize,
|
||||||
ModuleName, expectedSize);
|
ModuleName, expectedSize);
|
||||||
}
|
}
|
||||||
|
@ -2134,6 +2152,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
DPrintf ("Loaded %d scripts, %d functions\n", NumScripts, NumFunctions);
|
DPrintf ("Loaded %d scripts, %d functions\n", NumScripts, NumFunctions);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FBehavior::~FBehavior ()
|
FBehavior::~FBehavior ()
|
||||||
|
@ -2292,7 +2311,7 @@ void FBehavior::LoadScriptsDirectory ()
|
||||||
{
|
{
|
||||||
if (Scripts[i].Number == Scripts[i+1].Number)
|
if (Scripts[i].Number == Scripts[i+1].Number)
|
||||||
{
|
{
|
||||||
Printf("%s appears more than once.\n",
|
Printf(TEXTCOLOR_ORANGE "%s appears more than once.\n",
|
||||||
ScriptPresentation(Scripts[i].Number).GetChars());
|
ScriptPresentation(Scripts[i].Number).GetChars());
|
||||||
// Make the closed version the first one.
|
// Make the closed version the first one.
|
||||||
if (Scripts[i+1].Type == SCRIPT_Closed)
|
if (Scripts[i+1].Type == SCRIPT_Closed)
|
||||||
|
@ -2489,7 +2508,7 @@ bool FBehavior::IsGood ()
|
||||||
if (funcdef->Address == 0 && funcdef->ImportNum == 0)
|
if (funcdef->Address == 0 && funcdef->ImportNum == 0)
|
||||||
{
|
{
|
||||||
DWORD *chunk = (DWORD *)FindChunk (MAKE_ID('F','N','A','M'));
|
DWORD *chunk = (DWORD *)FindChunk (MAKE_ID('F','N','A','M'));
|
||||||
Printf ("Could not find ACS function %s for use in %s.\n",
|
Printf (TEXTCOLOR_RED "Could not find ACS function %s for use in %s.\n",
|
||||||
(char *)(chunk + 2) + chunk[3+i], ModuleName);
|
(char *)(chunk + 2) + chunk[3+i], ModuleName);
|
||||||
bad = true;
|
bad = true;
|
||||||
}
|
}
|
||||||
|
@ -2500,7 +2519,7 @@ bool FBehavior::IsGood ()
|
||||||
{
|
{
|
||||||
if (Imports[i] == NULL)
|
if (Imports[i] == NULL)
|
||||||
{
|
{
|
||||||
Printf ("Not all the libraries used by %s could be found.\n", ModuleName);
|
Printf (TEXTCOLOR_RED "Not all the libraries used by %s could be found.\n", ModuleName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3349,7 +3368,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
|
||||||
actor = Spawn (info, x, y, z, ALLOW_REPLACE);
|
actor = Spawn (info, x, y, z, ALLOW_REPLACE);
|
||||||
if (actor != NULL)
|
if (actor != NULL)
|
||||||
{
|
{
|
||||||
DWORD oldFlags2 = actor->flags2;
|
ActorFlags2 oldFlags2 = actor->flags2;
|
||||||
actor->flags2 |= MF2_PASSMOBJ;
|
actor->flags2 |= MF2_PASSMOBJ;
|
||||||
if (force || P_TestMobjLocation (actor))
|
if (force || P_TestMobjLocation (actor))
|
||||||
{
|
{
|
||||||
|
@ -5342,7 +5361,9 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args, const
|
||||||
fixed_t range = argCount > 6 && args[6]? args[6] : MISSILERANGE;
|
fixed_t range = argCount > 6 && args[6]? args[6] : MISSILERANGE;
|
||||||
int flags = argCount > 7 && args[7]? args[7] : 0;
|
int flags = argCount > 7 && args[7]? args[7] : 0;
|
||||||
|
|
||||||
int fhflags = (flags & FHF_NORANDOMPUFFZ)? LAF_NORANDOMPUFFZ : 0;
|
int fhflags = 0;
|
||||||
|
if (flags & FHF_NORANDOMPUFFZ) fhflags |= LAF_NORANDOMPUFFZ;
|
||||||
|
if (flags & FHF_NOIMPACTDECAL) fhflags |= LAF_NOIMPACTDECAL;
|
||||||
|
|
||||||
if (args[0] == 0)
|
if (args[0] == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -283,8 +283,9 @@ enum ACSFormat { ACS_Old, ACS_Enhanced, ACS_LittleEnhanced, ACS_Unknown };
|
||||||
class FBehavior
|
class FBehavior
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FBehavior (int lumpnum, FileReader * fr=NULL, int len=0);
|
FBehavior ();
|
||||||
~FBehavior ();
|
~FBehavior ();
|
||||||
|
bool Init(int lumpnum, FileReader * fr = NULL, int len = 0);
|
||||||
|
|
||||||
bool IsGood ();
|
bool IsGood ();
|
||||||
BYTE *FindChunk (DWORD id) const;
|
BYTE *FindChunk (DWORD id) const;
|
||||||
|
|
|
@ -894,5 +894,5 @@ void ACustomSprite::BeginPlay ()
|
||||||
if (cstat & 8)
|
if (cstat & 8)
|
||||||
renderflags |= RF_YFLIP;
|
renderflags |= RF_YFLIP;
|
||||||
// set face/wall/floor flags
|
// set face/wall/floor flags
|
||||||
renderflags |= ((cstat >> 4) & 3) << 12;
|
renderflags |= ActorRenderFlags::FromInt (((cstat >> 4) & 3) << 12);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2573,7 +2573,7 @@ static bool P_CheckForResurrection(AActor *self, bool usevilestates)
|
||||||
|
|
||||||
fixed_t oldheight = corpsehit->height;
|
fixed_t oldheight = corpsehit->height;
|
||||||
fixed_t oldradius = corpsehit->radius;
|
fixed_t oldradius = corpsehit->radius;
|
||||||
int oldflags = corpsehit->flags;
|
ActorFlags oldflags = corpsehit->flags;
|
||||||
|
|
||||||
corpsehit->flags |= MF_SOLID;
|
corpsehit->flags |= MF_SOLID;
|
||||||
corpsehit->height = corpsehit->GetDefault()->height;
|
corpsehit->height = corpsehit->GetDefault()->height;
|
||||||
|
|
|
@ -660,7 +660,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
|
||||||
|
|
||||||
FState *diestate = NULL;
|
FState *diestate = NULL;
|
||||||
int gibhealth = GibHealth();
|
int gibhealth = GibHealth();
|
||||||
int iflags4 = inflictor == NULL ? 0 : inflictor->flags4;
|
ActorFlags4 iflags4 = inflictor == NULL ? ActorFlags4::FromInt(0) : inflictor->flags4;
|
||||||
bool extremelydead = ((health < gibhealth || iflags4 & MF4_EXTREMEDEATH) && !(iflags4 & MF4_NOEXTREMEDEATH));
|
bool extremelydead = ((health < gibhealth || iflags4 & MF4_EXTREMEDEATH) && !(iflags4 & MF4_NOEXTREMEDEATH));
|
||||||
|
|
||||||
// Special check for 'extreme' damage type to ensure that it gets recorded properly as an extreme death for subsequent checks.
|
// Special check for 'extreme' damage type to ensure that it gets recorded properly as an extreme death for subsequent checks.
|
||||||
|
|
|
@ -461,7 +461,8 @@ enum // P_AimLineAttack flags
|
||||||
enum // P_LineAttack flags
|
enum // P_LineAttack flags
|
||||||
{
|
{
|
||||||
LAF_ISMELEEATTACK = 1,
|
LAF_ISMELEEATTACK = 1,
|
||||||
LAF_NORANDOMPUFFZ = 2
|
LAF_NORANDOMPUFFZ = 2,
|
||||||
|
LAF_NOIMPACTDECAL = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, const PClass *pufftype, int flags = 0, AActor **victim = NULL, int *actualdamage = NULL);
|
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, const PClass *pufftype, int flags = 0, AActor **victim = NULL, int *actualdamage = NULL);
|
||||||
|
|
|
@ -1592,7 +1592,7 @@ bool P_CheckPosition(AActor *thing, fixed_t x, fixed_t y, bool actorsonly)
|
||||||
|
|
||||||
bool P_TestMobjLocation(AActor *mobj)
|
bool P_TestMobjLocation(AActor *mobj)
|
||||||
{
|
{
|
||||||
int flags;
|
ActorFlags flags;
|
||||||
|
|
||||||
flags = mobj->flags;
|
flags = mobj->flags;
|
||||||
mobj->flags &= ~MF_PICKUP;
|
mobj->flags &= ~MF_PICKUP;
|
||||||
|
@ -3726,12 +3726,16 @@ AActor *P_LineAttack(AActor *t1, angle_t angle, fixed_t distance,
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RH] Spawn a decal
|
// [RH] Spawn a decal
|
||||||
if (trace.HitType == TRACE_HitWall && trace.Line->special != Line_Horizon)
|
if (trace.HitType == TRACE_HitWall && trace.Line->special != Line_Horizon && !(flags & LAF_NOIMPACTDECAL) && !(puffDefaults->flags7 & MF7_NODECAL))
|
||||||
{
|
{
|
||||||
// [TN] If the actor or weapon has a decal defined, use that one.
|
// [TN] If the actor or weapon has a decal defined, use that one.
|
||||||
if (t1->DecalGenerator != NULL ||
|
if (t1->DecalGenerator != NULL ||
|
||||||
(t1->player != NULL && t1->player->ReadyWeapon != NULL && t1->player->ReadyWeapon->DecalGenerator != NULL))
|
(t1->player != NULL && t1->player->ReadyWeapon != NULL && t1->player->ReadyWeapon->DecalGenerator != NULL))
|
||||||
{
|
{
|
||||||
|
// [ZK] If puff has FORCEDECAL set, do not use the weapon's decal
|
||||||
|
if (puffDefaults->flags7 & MF7_FORCEDECAL && puff != NULL && puff->DecalGenerator)
|
||||||
|
SpawnShootDecal(puff, trace);
|
||||||
|
else
|
||||||
SpawnShootDecal(t1, trace);
|
SpawnShootDecal(t1, trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4918,7 +4922,7 @@ EXTERN_CVAR(Int, cl_bloodtype)
|
||||||
|
|
||||||
bool P_AdjustFloorCeil(AActor *thing, FChangePosition *cpos)
|
bool P_AdjustFloorCeil(AActor *thing, FChangePosition *cpos)
|
||||||
{
|
{
|
||||||
int flags2 = thing->flags2 & MF2_PASSMOBJ;
|
ActorFlags2 flags2 = thing->flags2 & MF2_PASSMOBJ;
|
||||||
FCheckPosition tm;
|
FCheckPosition tm;
|
||||||
|
|
||||||
if ((thing->flags2 & MF2_PASSMOBJ) && (thing->flags3 & MF3_ISMONSTER))
|
if ((thing->flags2 & MF2_PASSMOBJ) && (thing->flags3 & MF3_ISMONSTER))
|
||||||
|
|
|
@ -481,7 +481,7 @@ bool AActor::SetState (FState *newstate, bool nofunction)
|
||||||
}
|
}
|
||||||
state = newstate;
|
state = newstate;
|
||||||
tics = GetTics(newstate);
|
tics = GetTics(newstate);
|
||||||
renderflags = (renderflags & ~RF_FULLBRIGHT) | newstate->GetFullbright();
|
renderflags = (renderflags & ~RF_FULLBRIGHT) | ActorRenderFlags::FromInt (newstate->GetFullbright());
|
||||||
newsprite = newstate->sprite;
|
newsprite = newstate->sprite;
|
||||||
if (newsprite != SPR_FIXED)
|
if (newsprite != SPR_FIXED)
|
||||||
{ // okay to change sprite and/or frame
|
{ // okay to change sprite and/or frame
|
||||||
|
@ -2750,10 +2750,10 @@ void P_NightmareRespawn (AActor *mobj)
|
||||||
mo->PrevZ = z; // Do not interpolate Z position if we changed it since spawning.
|
mo->PrevZ = z; // Do not interpolate Z position if we changed it since spawning.
|
||||||
|
|
||||||
// spawn a teleport fog at old spot because of removal of the body?
|
// spawn a teleport fog at old spot because of removal of the body?
|
||||||
P_SpawnTeleportFog(mobj, mobj->x, mobj->y, mobj->z + TELEFOGHEIGHT, true);
|
P_SpawnTeleportFog(mobj, mobj->x, mobj->y, mobj->z + TELEFOGHEIGHT, true, true);
|
||||||
|
|
||||||
// spawn a teleport fog at the new spot
|
// spawn a teleport fog at the new spot
|
||||||
P_SpawnTeleportFog(mobj, x, y, z + TELEFOGHEIGHT, false);
|
P_SpawnTeleportFog(mobj, x, y, z + TELEFOGHEIGHT, false, true);
|
||||||
|
|
||||||
// remove the old monster
|
// remove the old monster
|
||||||
mobj->Destroy ();
|
mobj->Destroy ();
|
||||||
|
@ -3991,7 +3991,7 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t
|
||||||
|
|
||||||
actor->sprite = st->sprite;
|
actor->sprite = st->sprite;
|
||||||
actor->frame = st->GetFrame();
|
actor->frame = st->GetFrame();
|
||||||
actor->renderflags = (actor->renderflags & ~RF_FULLBRIGHT) | st->GetFullbright();
|
actor->renderflags = (actor->renderflags & ~RF_FULLBRIGHT) | ActorRenderFlags::FromInt (st->GetFullbright());
|
||||||
actor->touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98
|
actor->touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98
|
||||||
if (G_SkillProperty(SKILLP_FastMonsters))
|
if (G_SkillProperty(SKILLP_FastMonsters))
|
||||||
actor->Speed = actor->GetClass()->Meta.GetMetaFixed(AMETA_FastSpeed, actor->Speed);
|
actor->Speed = actor->GetClass()->Meta.GetMetaFixed(AMETA_FastSpeed, actor->Speed);
|
||||||
|
@ -6465,35 +6465,35 @@ void PrintMiscActorInfo(AActor *query)
|
||||||
"OptFuzzy", "Stencil", "Translucent", "Add", "Shaded", "TranslucentStencil",
|
"OptFuzzy", "Stencil", "Translucent", "Add", "Shaded", "TranslucentStencil",
|
||||||
"Shadow", "Subtract", "AddStencil", "AddShaded"};
|
"Shadow", "Subtract", "AddStencil", "AddShaded"};
|
||||||
|
|
||||||
Printf("%s @ %p has the following flags:\n flags: %x", query->GetTag(), query, query->flags);
|
Printf("%s @ %p has the following flags:\n flags: %x", query->GetTag(), query, query->flags.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags));
|
if (query->flags & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags));
|
||||||
Printf("\n flags2: %x", query->flags2);
|
Printf("\n flags2: %x", query->flags2.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags2 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags2));
|
if (query->flags2 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags2));
|
||||||
Printf("\n flags3: %x", query->flags3);
|
Printf("\n flags3: %x", query->flags3.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags3 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags3));
|
if (query->flags3 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags3));
|
||||||
Printf("\n flags4: %x", query->flags4);
|
Printf("\n flags4: %x", query->flags4.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags4 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags4));
|
if (query->flags4 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags4));
|
||||||
Printf("\n flags5: %x", query->flags5);
|
Printf("\n flags5: %x", query->flags5.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags5 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags5));
|
if (query->flags5 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags5));
|
||||||
Printf("\n flags6: %x", query->flags6);
|
Printf("\n flags6: %x", query->flags6.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags6 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags6));
|
if (query->flags6 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags6));
|
||||||
Printf("\n flags7: %x", query->flags7);
|
Printf("\n flags7: %x", query->flags7.GetValue());
|
||||||
for (flagi = 0; flagi <= 31; flagi++)
|
for (flagi = 0; flagi <= 31; flagi++)
|
||||||
if (query->flags7 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags7));
|
if (query->flags7 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags7));
|
||||||
Printf("\nBounce flags: %x\nBounce factors: f:%f, w:%f",
|
Printf("\nBounce flags: %x\nBounce factors: f:%f, w:%f",
|
||||||
query->BounceFlags, FIXED2FLOAT(query->bouncefactor),
|
query->BounceFlags.GetValue(), FIXED2FLOAT(query->bouncefactor),
|
||||||
FIXED2FLOAT(query->wallbouncefactor));
|
FIXED2FLOAT(query->wallbouncefactor));
|
||||||
/*for (flagi = 0; flagi < 31; flagi++)
|
/*for (flagi = 0; flagi < 31; flagi++)
|
||||||
if (query->BounceFlags & 1<<flagi) Printf(" %s", flagnamesb[flagi]);*/
|
if (query->BounceFlags & 1<<flagi) Printf(" %s", flagnamesb[flagi]);*/
|
||||||
Printf("\nRender style = %i:%s, alpha %f\nRender flags: %x",
|
Printf("\nRender style = %i:%s, alpha %f\nRender flags: %x",
|
||||||
querystyle, (querystyle < STYLE_Count ? renderstyles[querystyle] : "Unknown"),
|
querystyle, (querystyle < STYLE_Count ? renderstyles[querystyle] : "Unknown"),
|
||||||
FIXED2FLOAT(query->alpha), query->renderflags);
|
FIXED2FLOAT(query->alpha), query->renderflags.GetValue());
|
||||||
/*for (flagi = 0; flagi < 31; flagi++)
|
/*for (flagi = 0; flagi < 31; flagi++)
|
||||||
if (query->renderflags & 1<<flagi) Printf(" %s", flagnamesr[flagi]);*/
|
if (query->renderflags & 1<<flagi) Printf(" %s", flagnamesr[flagi]);*/
|
||||||
Printf("\nSpecial+args: %s(%i, %i, %i, %i, %i)\nspecial1: %i, special2: %i.",
|
Printf("\nSpecial+args: %s(%i, %i, %i, %i, %i)\nspecial1: %i, special2: %i.",
|
||||||
|
|
|
@ -86,7 +86,7 @@ bool P_Thing_Spawn (int tid, AActor *source, int type, angle_t angle, bool fog,
|
||||||
|
|
||||||
if (mobj != NULL)
|
if (mobj != NULL)
|
||||||
{
|
{
|
||||||
DWORD oldFlags2 = mobj->flags2;
|
ActorFlags2 oldFlags2 = mobj->flags2;
|
||||||
mobj->flags2 |= MF2_PASSMOBJ;
|
mobj->flags2 |= MF2_PASSMOBJ;
|
||||||
if (P_TestMobjLocation (mobj))
|
if (P_TestMobjLocation (mobj))
|
||||||
{
|
{
|
||||||
|
@ -94,7 +94,7 @@ bool P_Thing_Spawn (int tid, AActor *source, int type, angle_t angle, bool fog,
|
||||||
mobj->angle = (angle != ANGLE_MAX ? angle : spot->angle);
|
mobj->angle = (angle != ANGLE_MAX ? angle : spot->angle);
|
||||||
if (fog)
|
if (fog)
|
||||||
{
|
{
|
||||||
P_SpawnTeleportFog(mobj, spot->x, spot->y, spot->z + TELEFOGHEIGHT, false);
|
P_SpawnTeleportFog(mobj, spot->x, spot->y, spot->z + TELEFOGHEIGHT, false, true);
|
||||||
}
|
}
|
||||||
if (mobj->flags & MF_SPECIAL)
|
if (mobj->flags & MF_SPECIAL)
|
||||||
mobj->flags |= MF_DROPPED; // Don't respawn
|
mobj->flags |= MF_DROPPED; // Don't respawn
|
||||||
|
@ -132,8 +132,8 @@ bool P_MoveThing(AActor *source, fixed_t x, fixed_t y, fixed_t z, bool fog)
|
||||||
{
|
{
|
||||||
if (fog)
|
if (fog)
|
||||||
{
|
{
|
||||||
P_SpawnTeleportFog(source, x, y, z);
|
P_SpawnTeleportFog(source, x, y, z, false, true);
|
||||||
P_SpawnTeleportFog(source, oldx, oldy, oldz, false);
|
P_SpawnTeleportFog(source, oldx, oldy, oldz, true, true);
|
||||||
}
|
}
|
||||||
source->PrevX = x;
|
source->PrevX = x;
|
||||||
source->PrevY = y;
|
source->PrevY = y;
|
||||||
|
@ -429,7 +429,7 @@ bool P_Thing_Raise(AActor *thing, AActor *raiser)
|
||||||
// [RH] Check against real height and radius
|
// [RH] Check against real height and radius
|
||||||
fixed_t oldheight = thing->height;
|
fixed_t oldheight = thing->height;
|
||||||
fixed_t oldradius = thing->radius;
|
fixed_t oldradius = thing->radius;
|
||||||
int oldflags = thing->flags;
|
ActorFlags oldflags = thing->flags;
|
||||||
|
|
||||||
thing->flags |= MF_SOLID;
|
thing->flags |= MF_SOLID;
|
||||||
thing->height = info->height; // [RH] Use real height
|
thing->height = info->height; // [RH] Use real height
|
||||||
|
@ -468,7 +468,7 @@ bool P_Thing_CanRaise(AActor *thing)
|
||||||
AActor *info = thing->GetDefault();
|
AActor *info = thing->GetDefault();
|
||||||
|
|
||||||
// Check against real height and radius
|
// Check against real height and radius
|
||||||
int oldflags = thing->flags;
|
ActorFlags oldflags = thing->flags;
|
||||||
fixed_t oldheight = thing->height;
|
fixed_t oldheight = thing->height;
|
||||||
fixed_t oldradius = thing->radius;
|
fixed_t oldradius = thing->radius;
|
||||||
|
|
||||||
|
|
|
@ -790,7 +790,7 @@ void R_RenderActorView (AActor *actor, bool dontmaplines)
|
||||||
P_FindParticleSubsectors ();
|
P_FindParticleSubsectors ();
|
||||||
|
|
||||||
WallCycles.Clock();
|
WallCycles.Clock();
|
||||||
DWORD savedflags = camera->renderflags;
|
ActorRenderFlags savedflags = camera->renderflags;
|
||||||
// Never draw the player unless in chasecam mode
|
// Never draw the player unless in chasecam mode
|
||||||
if (!r_showviewer)
|
if (!r_showviewer)
|
||||||
{
|
{
|
||||||
|
|
111
src/tflags.h
Normal file
111
src/tflags.h
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
** tflags.h
|
||||||
|
**
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** Copyright 2015 Teemu Piippo
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions
|
||||||
|
** are met:
|
||||||
|
**
|
||||||
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
|
** documentation and/or other materials provided with the distribution.
|
||||||
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
|
** derived from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "doomtype.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TFlags
|
||||||
|
*
|
||||||
|
* A Qt-inspired type-safe flagset type.
|
||||||
|
*
|
||||||
|
* T is the enum type of individual flags,
|
||||||
|
* TT is the underlying integer type used (defaults to DWORD)
|
||||||
|
*/
|
||||||
|
template<typename T, typename TT = DWORD>
|
||||||
|
class TFlags
|
||||||
|
{
|
||||||
|
struct ZeroDummy {};
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef TFlags<T, TT> Self;
|
||||||
|
typedef T EnumType;
|
||||||
|
typedef TT IntType;
|
||||||
|
|
||||||
|
TFlags(){}
|
||||||
|
TFlags (const Self& other) : Value (other.GetValue()) {}
|
||||||
|
TFlags (T value) : Value (static_cast<TT> (value)) {}
|
||||||
|
|
||||||
|
// This allows initializing the flagset with 0, as 0 implicitly converts into a null pointer.
|
||||||
|
TFlags (ZeroDummy*) : Value (0) {}
|
||||||
|
|
||||||
|
// Relation operators
|
||||||
|
Self operator| (Self other) const { return Self::FromInt (Value | other.GetValue()); }
|
||||||
|
Self operator& (Self other) const { return Self::FromInt (Value & other.GetValue()); }
|
||||||
|
Self operator^ (Self other) const { return Self::FromInt (Value ^ other.GetValue()); }
|
||||||
|
Self operator| (T value) const { return Self::FromInt (Value | value); }
|
||||||
|
Self operator& (T value) const { return Self::FromInt (Value & value); }
|
||||||
|
Self operator^ (T value) const { return Self::FromInt (Value ^ value); }
|
||||||
|
Self operator~() const { return Self::FromInt (~Value); }
|
||||||
|
|
||||||
|
// Assignment operators
|
||||||
|
Self& operator= (Self other) { Value = other.GetValue(); return *this; }
|
||||||
|
Self& operator|= (Self other) { Value |= other.GetValue(); return *this; }
|
||||||
|
Self& operator&= (Self other) { Value &= other.GetValue(); return *this; }
|
||||||
|
Self& operator^= (Self other) { Value ^= other.GetValue(); return *this; }
|
||||||
|
Self& operator= (T value) { Value = value; return *this; }
|
||||||
|
Self& operator|= (T value) { Value |= value; return *this; }
|
||||||
|
Self& operator&= (T value) { Value &= value; return *this; }
|
||||||
|
Self& operator^= (T value) { Value ^= value; return *this; }
|
||||||
|
|
||||||
|
// Access the value of the flagset
|
||||||
|
TT GetValue() const { return Value; }
|
||||||
|
operator TT() const { return Value; }
|
||||||
|
|
||||||
|
// Serialize to FArchive
|
||||||
|
FArchive& Serialize (FArchive& arc)
|
||||||
|
{
|
||||||
|
arc << Value;
|
||||||
|
return arc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the value of the flagset manually with an integer.
|
||||||
|
// Please think twice before using this.
|
||||||
|
static Self FromInt (TT value) { return Self (static_cast<T> (value)); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
TT Value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Additional operators for TFlags types.
|
||||||
|
*/
|
||||||
|
#define DEFINE_TFLAGS_OPERATORS(T) \
|
||||||
|
inline T operator| (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \
|
||||||
|
inline T operator& (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \
|
||||||
|
inline T operator^ (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \
|
||||||
|
inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \
|
||||||
|
inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \
|
||||||
|
inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \
|
||||||
|
inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); }
|
||||||
|
|
|
@ -3056,8 +3056,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Respawn)
|
||||||
|
|
||||||
if (flags & RSF_FOG)
|
if (flags & RSF_FOG)
|
||||||
{
|
{
|
||||||
P_SpawnTeleportFog(self, oldx, oldy, oldz, true);
|
P_SpawnTeleportFog(self, oldx, oldy, oldz, true, true);
|
||||||
P_SpawnTeleportFog(self, self->x, self->y, self->z, false);
|
P_SpawnTeleportFog(self, self->x, self->y, self->z, false, true);
|
||||||
}
|
}
|
||||||
if (self->CountsAsKill())
|
if (self->CountsAsKill())
|
||||||
{
|
{
|
||||||
|
@ -3745,7 +3745,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_ChangeFlag)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD *flagp = (DWORD*) (((char*)self) + fd->structoffset);
|
ActorFlags *flagp = (ActorFlags*) (((char*)self) + fd->structoffset);
|
||||||
|
|
||||||
// If these 2 flags get changed we need to update the blockmap and sector links.
|
// If these 2 flags get changed we need to update the blockmap and sector links.
|
||||||
bool linkchange = flagp == &self->flags && (fd->flagbit == MF_NOBLOCKMAP || fd->flagbit == MF_NOSECTOR);
|
bool linkchange = flagp == &self->flags && (fd->flagbit == MF_NOBLOCKMAP || fd->flagbit == MF_NOSECTOR);
|
||||||
|
@ -4228,9 +4228,9 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetUserArray)
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// A_Teleport(optional state teleportstate, optional class targettype,
|
// A_Teleport([state teleportstate, [class targettype,
|
||||||
// optional class fogtype, optional int flags, optional fixed mindist,
|
// [class fogtype, [int flags, [fixed mindist,
|
||||||
// optional fixed maxdist)
|
// [fixed maxdist]]]]]])
|
||||||
//
|
//
|
||||||
// Attempts to teleport to a targettype at least mindist away and at most
|
// Attempts to teleport to a targettype at least mindist away and at most
|
||||||
// maxdist away (0 means unlimited). If successful, spawn a fogtype at old
|
// maxdist away (0 means unlimited). If successful, spawn a fogtype at old
|
||||||
|
@ -4253,13 +4253,25 @@ enum T_Flags
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Teleport)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Teleport)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(6);
|
ACTION_PARAM_START(7);
|
||||||
ACTION_PARAM_STATE(TeleportState, 0);
|
ACTION_PARAM_STATE(TeleportState, 0);
|
||||||
ACTION_PARAM_CLASS(TargetType, 1);
|
ACTION_PARAM_CLASS(TargetType, 1);
|
||||||
ACTION_PARAM_CLASS(FogType, 2);
|
ACTION_PARAM_CLASS(FogType, 2);
|
||||||
ACTION_PARAM_INT(Flags, 3);
|
ACTION_PARAM_INT(Flags, 3);
|
||||||
ACTION_PARAM_FIXED(MinDist, 4);
|
ACTION_PARAM_FIXED(MinDist, 4);
|
||||||
ACTION_PARAM_FIXED(MaxDist, 5);
|
ACTION_PARAM_FIXED(MaxDist, 5);
|
||||||
|
ACTION_PARAM_INT(ptr, 6);
|
||||||
|
|
||||||
|
AActor *ref = COPY_AAPTR(self, ptr);
|
||||||
|
|
||||||
|
if (!ref)
|
||||||
|
{
|
||||||
|
ACTION_SET_RESULT(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ref->flags2 & MF2_NOTELEPORT)
|
||||||
|
return;
|
||||||
|
|
||||||
// Randomly choose not to teleport like A_Srcr2Decide.
|
// Randomly choose not to teleport like A_Srcr2Decide.
|
||||||
if (Flags & TF_RANDOMDECIDE)
|
if (Flags & TF_RANDOMDECIDE)
|
||||||
|
@ -4269,7 +4281,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Teleport)
|
||||||
192, 120, 120, 120, 64, 64, 32, 16, 0
|
192, 120, 120, 120, 64, 64, 32, 16, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned int chanceindex = self->health / ((self->SpawnHealth()/8 == 0) ? 1 : self->SpawnHealth()/8);
|
unsigned int chanceindex = ref->health / ((ref->SpawnHealth()/8 == 0) ? 1 : ref->SpawnHealth()/8);
|
||||||
|
|
||||||
if (chanceindex >= countof(chance))
|
if (chanceindex >= countof(chance))
|
||||||
{
|
{
|
||||||
|
@ -4280,37 +4292,42 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Teleport)
|
||||||
}
|
}
|
||||||
|
|
||||||
DSpotState *state = DSpotState::GetSpotState();
|
DSpotState *state = DSpotState::GetSpotState();
|
||||||
if (state == NULL) return;
|
if (state == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!TargetType) TargetType = PClass::FindClass("BossSpot");
|
if (!TargetType)
|
||||||
|
TargetType = PClass::FindClass("BossSpot");
|
||||||
|
|
||||||
AActor * spot = state->GetSpotWithMinMaxDistance(TargetType, self->x, self->y, MinDist, MaxDist);
|
AActor * spot = state->GetSpotWithMinMaxDistance(TargetType, ref->x, ref->y, MinDist, MaxDist);
|
||||||
if (spot == NULL) return;
|
if (spot == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
fixed_t prevX = self->x;
|
fixed_t prevX = ref->x;
|
||||||
fixed_t prevY = self->y;
|
fixed_t prevY = ref->y;
|
||||||
fixed_t prevZ = self->z;
|
fixed_t prevZ = ref->z;
|
||||||
fixed_t aboveFloor = spot->z - spot->floorz;
|
fixed_t aboveFloor = spot->z - spot->floorz;
|
||||||
fixed_t finalz = spot->floorz + aboveFloor;
|
fixed_t finalz = spot->floorz + aboveFloor;
|
||||||
|
|
||||||
if (spot->z + self->height > spot->ceilingz)
|
if (spot->z + ref->height > spot->ceilingz)
|
||||||
finalz = spot->ceilingz - self->height;
|
finalz = spot->ceilingz - ref->height;
|
||||||
else if (spot->z < spot->floorz)
|
else if (spot->z < spot->floorz)
|
||||||
finalz = spot->floorz;
|
finalz = spot->floorz;
|
||||||
|
|
||||||
|
|
||||||
//Take precedence and cooperate with telefragging first.
|
//Take precedence and cooperate with telefragging first.
|
||||||
bool teleResult = P_TeleportMove(self, spot->x, spot->y, finalz, Flags & TF_TELEFRAG);
|
bool teleResult = P_TeleportMove(ref, spot->x, spot->y, finalz, Flags & TF_TELEFRAG);
|
||||||
|
|
||||||
if (Flags & TF_FORCED)
|
if (!teleResult && (Flags & TF_FORCED))
|
||||||
{
|
{
|
||||||
//If for some reason the original move didn't work, regardless of telefrag, force it to move.
|
//If for some reason the original move didn't work, regardless of telefrag, force it to move.
|
||||||
self->SetOrigin(spot->x, spot->y, finalz);
|
ref->SetOrigin(spot->x, spot->y, finalz);
|
||||||
teleResult = true;
|
teleResult = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AActor *fog1 = NULL, *fog2 = NULL;
|
||||||
if (teleResult)
|
if (teleResult)
|
||||||
{
|
{
|
||||||
|
|
||||||
//If a fog type is defined in the parameter, or the user wants to use the actor's predefined fogs,
|
//If a fog type is defined in the parameter, or the user wants to use the actor's predefined fogs,
|
||||||
//and if there's no desire to be fogless, spawn a fog based upon settings.
|
//and if there's no desire to be fogless, spawn a fog based upon settings.
|
||||||
if (FogType || (Flags & TF_USEACTORFOG))
|
if (FogType || (Flags & TF_USEACTORFOG))
|
||||||
|
@ -4318,31 +4335,40 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Teleport)
|
||||||
if (!(Flags & TF_NOSRCFOG))
|
if (!(Flags & TF_NOSRCFOG))
|
||||||
{
|
{
|
||||||
if (Flags & TF_USEACTORFOG)
|
if (Flags & TF_USEACTORFOG)
|
||||||
P_SpawnTeleportFog(self, prevX, prevY, prevZ, true);
|
P_SpawnTeleportFog(ref, prevX, prevY, prevZ, true, true);
|
||||||
else
|
else
|
||||||
Spawn(FogType, prevX, prevY, prevZ, ALLOW_REPLACE);
|
{
|
||||||
|
fog1 = Spawn(FogType, prevX, prevY, prevZ, ALLOW_REPLACE);
|
||||||
|
if (fog1 != NULL)
|
||||||
|
fog1->target = ref;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!(Flags & TF_NODESTFOG))
|
if (!(Flags & TF_NODESTFOG))
|
||||||
{
|
{
|
||||||
if (Flags & TF_USEACTORFOG)
|
if (Flags & TF_USEACTORFOG)
|
||||||
P_SpawnTeleportFog(self, self->x, self->y, self->z, false);
|
P_SpawnTeleportFog(ref, ref->x, ref->y, ref->z, false, true);
|
||||||
else
|
else
|
||||||
Spawn(FogType, self->x, self->y, self->z, ALLOW_REPLACE);
|
{
|
||||||
|
fog2 = Spawn(FogType, ref->x, ref->y, ref->z, ALLOW_REPLACE);
|
||||||
|
if (fog2 != NULL)
|
||||||
|
fog2->target = ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (Flags & TF_USESPOTZ)
|
if (Flags & TF_USESPOTZ)
|
||||||
self->z = spot->z;
|
ref->z = spot->z;
|
||||||
else
|
else
|
||||||
self->z = self->floorz;
|
ref->z = ref->floorz;
|
||||||
|
|
||||||
if (!(Flags & TF_KEEPANGLE))
|
if (!(Flags & TF_KEEPANGLE))
|
||||||
self->angle = spot->angle;
|
ref->angle = spot->angle;
|
||||||
|
|
||||||
if (!(Flags & TF_KEEPVELOCITY))
|
if (!(Flags & TF_KEEPVELOCITY))
|
||||||
self->velx = self->vely = self->velz = 0;
|
ref->velx = ref->vely = ref->velz = 0;
|
||||||
|
|
||||||
if (!(Flags & TF_NOJUMP))
|
if (!(Flags & TF_NOJUMP)) //The state jump should only happen with the calling actor.
|
||||||
{
|
{
|
||||||
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
|
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
|
||||||
if (TeleportState == NULL)
|
if (TeleportState == NULL)
|
||||||
|
@ -5818,6 +5844,43 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_ResetHealth)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// A_JumpIfHigherOrLower
|
||||||
|
//
|
||||||
|
// Jumps if a target, master, or tracer is higher or lower than the calling
|
||||||
|
// actor. Can also specify how much higher/lower the actor needs to be than
|
||||||
|
// itself. Can also take into account the height of the actor in question,
|
||||||
|
// depending on which it's checking. This means adding height of the
|
||||||
|
// calling actor's self if the pointer is higher, or height of the pointer
|
||||||
|
// if its lower.
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfHigherOrLower)
|
||||||
|
{
|
||||||
|
ACTION_PARAM_START(6);
|
||||||
|
ACTION_PARAM_STATE(high, 0);
|
||||||
|
ACTION_PARAM_STATE(low, 1);
|
||||||
|
ACTION_PARAM_FIXED(offsethigh, 2);
|
||||||
|
ACTION_PARAM_FIXED(offsetlow, 3);
|
||||||
|
ACTION_PARAM_BOOL(includeHeight, 4);
|
||||||
|
ACTION_PARAM_INT(ptr, 5);
|
||||||
|
|
||||||
|
AActor *mobj = COPY_AAPTR(self, ptr);
|
||||||
|
|
||||||
|
|
||||||
|
if (!mobj || (mobj == self)) //AAPTR_DEFAULT is completely useless in this regard.
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ACTION_SET_RESULT(false); //No inventory jump chains please.
|
||||||
|
|
||||||
|
if ((high) && (mobj->z > ((includeHeight ? self->height : 0) + self->z + offsethigh)))
|
||||||
|
ACTION_JUMP(high);
|
||||||
|
else if ((low) && (mobj->z + (includeHeight ? mobj->height : 0)) < (self->z + offsetlow))
|
||||||
|
ACTION_JUMP(low);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// A_SetRipperLevel(int level)
|
// A_SetRipperLevel(int level)
|
||||||
|
|
|
@ -60,7 +60,7 @@ static TArray<FVariableInfo*> variables;
|
||||||
#define DEFINE_DEPRECATED_FLAG(name) { DEPF_##name, #name, -1, 0 }
|
#define DEFINE_DEPRECATED_FLAG(name) { DEPF_##name, #name, -1, 0 }
|
||||||
#define DEFINE_DUMMY_FLAG(name) { DEPF_UNUSED, #name, -1, 0 }
|
#define DEFINE_DUMMY_FLAG(name) { DEPF_UNUSED, #name, -1, 0 }
|
||||||
|
|
||||||
static FFlagDef ActorFlags[]=
|
static FFlagDef ActorFlagDefs[]=
|
||||||
{
|
{
|
||||||
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
|
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
|
||||||
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
|
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
|
||||||
|
@ -254,6 +254,10 @@ static FFlagDef ActorFlags[]=
|
||||||
DEFINE_FLAG(MF7, HITMASTER, AActor, flags7),
|
DEFINE_FLAG(MF7, HITMASTER, AActor, flags7),
|
||||||
DEFINE_FLAG(MF7, HITTRACER, AActor, flags7),
|
DEFINE_FLAG(MF7, HITTRACER, AActor, flags7),
|
||||||
|
|
||||||
|
// [ZK] Decal flags
|
||||||
|
DEFINE_FLAG(MF7, NODECAL, AActor, flags7),
|
||||||
|
DEFINE_FLAG(MF7, FORCEDECAL, AActor, flags7),
|
||||||
|
|
||||||
// Effect flags
|
// Effect flags
|
||||||
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),
|
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),
|
||||||
DEFINE_FLAG2(FX_ROCKET, ROCKETTRAIL, AActor, effects),
|
DEFINE_FLAG2(FX_ROCKET, ROCKETTRAIL, AActor, effects),
|
||||||
|
@ -302,7 +306,7 @@ static FFlagDef ActorFlags[]=
|
||||||
DEFINE_DUMMY_FLAG(EXPLODEONDEATH), // seems useless
|
DEFINE_DUMMY_FLAG(EXPLODEONDEATH), // seems useless
|
||||||
};
|
};
|
||||||
|
|
||||||
static FFlagDef InventoryFlags[] =
|
static FFlagDef InventoryFlagDefs[] =
|
||||||
{
|
{
|
||||||
// Inventory flags
|
// Inventory flags
|
||||||
DEFINE_FLAG(IF, QUIET, AInventory, ItemFlags),
|
DEFINE_FLAG(IF, QUIET, AInventory, ItemFlags),
|
||||||
|
@ -329,7 +333,7 @@ static FFlagDef InventoryFlags[] =
|
||||||
DEFINE_DEPRECATED_FLAG(PICKUPFLASH),
|
DEFINE_DEPRECATED_FLAG(PICKUPFLASH),
|
||||||
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),};
|
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),};
|
||||||
|
|
||||||
static FFlagDef WeaponFlags[] =
|
static FFlagDef WeaponFlagDefs[] =
|
||||||
{
|
{
|
||||||
// Weapon flags
|
// Weapon flags
|
||||||
DEFINE_FLAG(WIF, NOAUTOFIRE, AWeapon, WeaponFlags),
|
DEFINE_FLAG(WIF, NOAUTOFIRE, AWeapon, WeaponFlags),
|
||||||
|
@ -356,7 +360,7 @@ static FFlagDef WeaponFlags[] =
|
||||||
DEFINE_DUMMY_FLAG(ALLOW_WITH_RESPAWN_INVUL),
|
DEFINE_DUMMY_FLAG(ALLOW_WITH_RESPAWN_INVUL),
|
||||||
};
|
};
|
||||||
|
|
||||||
static FFlagDef PlayerPawnFlags[] =
|
static FFlagDef PlayerPawnFlagDefs[] =
|
||||||
{
|
{
|
||||||
// PlayerPawn flags
|
// PlayerPawn flags
|
||||||
DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags),
|
DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags),
|
||||||
|
@ -364,7 +368,7 @@ static FFlagDef PlayerPawnFlags[] =
|
||||||
DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags),
|
DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags),
|
||||||
};
|
};
|
||||||
|
|
||||||
static FFlagDef PowerSpeedFlags[] =
|
static FFlagDef PowerSpeedFlagDefs[] =
|
||||||
{
|
{
|
||||||
// PowerSpeed flags
|
// PowerSpeed flags
|
||||||
DEFINE_FLAG(PSF, NOTRAIL, APowerSpeed, SpeedFlags),
|
DEFINE_FLAG(PSF, NOTRAIL, APowerSpeed, SpeedFlags),
|
||||||
|
@ -372,11 +376,11 @@ static FFlagDef PowerSpeedFlags[] =
|
||||||
|
|
||||||
static const struct FFlagList { const PClass *Type; FFlagDef *Defs; int NumDefs; } FlagLists[] =
|
static const struct FFlagList { const PClass *Type; FFlagDef *Defs; int NumDefs; } FlagLists[] =
|
||||||
{
|
{
|
||||||
{ RUNTIME_CLASS(AActor), ActorFlags, countof(ActorFlags) },
|
{ RUNTIME_CLASS(AActor), ActorFlagDefs, countof(ActorFlagDefs) },
|
||||||
{ RUNTIME_CLASS(AInventory), InventoryFlags, countof(InventoryFlags) },
|
{ RUNTIME_CLASS(AInventory), InventoryFlagDefs, countof(InventoryFlagDefs) },
|
||||||
{ RUNTIME_CLASS(AWeapon), WeaponFlags, countof(WeaponFlags) },
|
{ RUNTIME_CLASS(AWeapon), WeaponFlagDefs, countof(WeaponFlagDefs) },
|
||||||
{ RUNTIME_CLASS(APlayerPawn), PlayerPawnFlags,countof(PlayerPawnFlags) },
|
{ RUNTIME_CLASS(APlayerPawn), PlayerPawnFlagDefs, countof(PlayerPawnFlagDefs) },
|
||||||
{ RUNTIME_CLASS(APowerSpeed), PowerSpeedFlags,countof(PowerSpeedFlags) },
|
{ RUNTIME_CLASS(APowerSpeed), PowerSpeedFlagDefs, countof(PowerSpeedFlagDefs) },
|
||||||
};
|
};
|
||||||
#define NUM_FLAG_LISTS (countof(FlagLists))
|
#define NUM_FLAG_LISTS (countof(FlagLists))
|
||||||
|
|
||||||
|
@ -463,11 +467,11 @@ FFlagDef *FindFlag (const PClass *type, const char *part1, const char *part2)
|
||||||
|
|
||||||
const char *GetFlagName(unsigned int flagnum, int flagoffset)
|
const char *GetFlagName(unsigned int flagnum, int flagoffset)
|
||||||
{
|
{
|
||||||
for(unsigned i = 0; i < countof(ActorFlags); i++)
|
for(unsigned i = 0; i < countof(ActorFlagDefs); i++)
|
||||||
{
|
{
|
||||||
if (ActorFlags[i].flagbit == flagnum && ActorFlags[i].structoffset == flagoffset)
|
if (ActorFlagDefs[i].flagbit == flagnum && ActorFlagDefs[i].structoffset == flagoffset)
|
||||||
{
|
{
|
||||||
return ActorFlags[i].name;
|
return ActorFlagDefs[i].name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "(unknown)"; // return something printable
|
return "(unknown)"; // return something printable
|
||||||
|
|
|
@ -526,6 +526,7 @@ static int ParseMorphStyle (FScanner &sc)
|
||||||
{ "MRF_UNDOBYDEATH", MORPH_UNDOBYDEATH},
|
{ "MRF_UNDOBYDEATH", MORPH_UNDOBYDEATH},
|
||||||
{ "MRF_UNDOBYDEATHFORCED", MORPH_UNDOBYDEATHFORCED},
|
{ "MRF_UNDOBYDEATHFORCED", MORPH_UNDOBYDEATHFORCED},
|
||||||
{ "MRF_UNDOBYDEATHSAVES", MORPH_UNDOBYDEATHSAVES},
|
{ "MRF_UNDOBYDEATHSAVES", MORPH_UNDOBYDEATHSAVES},
|
||||||
|
{ "MRF_UNDOALWAYS", MORPH_UNDOALWAYS },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1050,7 +1050,7 @@ DEFINE_PROPERTY(bloodtype, Sss, Actor)
|
||||||
DEFINE_PROPERTY(bouncetype, S, Actor)
|
DEFINE_PROPERTY(bouncetype, S, Actor)
|
||||||
{
|
{
|
||||||
static const char *names[] = { "None", "Doom", "Heretic", "Hexen", "DoomCompat", "HereticCompat", "HexenCompat", "Grenade", "Classic", NULL };
|
static const char *names[] = { "None", "Doom", "Heretic", "Hexen", "DoomCompat", "HereticCompat", "HexenCompat", "Grenade", "Classic", NULL };
|
||||||
static const int flags[] = { BOUNCE_None,
|
static const ActorBounceFlag flags[] = { BOUNCE_None,
|
||||||
BOUNCE_Doom, BOUNCE_Heretic, BOUNCE_Hexen,
|
BOUNCE_Doom, BOUNCE_Heretic, BOUNCE_Hexen,
|
||||||
BOUNCE_DoomCompat, BOUNCE_HereticCompat, BOUNCE_HexenCompat,
|
BOUNCE_DoomCompat, BOUNCE_HereticCompat, BOUNCE_HexenCompat,
|
||||||
BOUNCE_Grenade, BOUNCE_Classic, };
|
BOUNCE_Grenade, BOUNCE_Classic, };
|
||||||
|
@ -1310,13 +1310,13 @@ DEFINE_PROPERTY(species, S, Actor)
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
DEFINE_PROPERTY(clearflags, 0, Actor)
|
DEFINE_PROPERTY(clearflags, 0, Actor)
|
||||||
{
|
{
|
||||||
defaults->flags =
|
defaults->flags = 0;
|
||||||
defaults->flags3 =
|
|
||||||
defaults->flags4 =
|
|
||||||
defaults->flags5 =
|
|
||||||
defaults->flags6 =
|
|
||||||
defaults->flags7 = 0;
|
|
||||||
defaults->flags2 &= MF2_ARGSDEFINED; // this flag must not be cleared
|
defaults->flags2 &= MF2_ARGSDEFINED; // this flag must not be cleared
|
||||||
|
defaults->flags3 = 0;
|
||||||
|
defaults->flags4 = 0;
|
||||||
|
defaults->flags5 = 0;
|
||||||
|
defaults->flags6 = 0;
|
||||||
|
defaults->flags7 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -437,7 +437,8 @@ struct acttab {
|
||||||
#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead)
|
#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead)
|
||||||
|
|
||||||
/* Free all memory associated with the given acttab */
|
/* Free all memory associated with the given acttab */
|
||||||
void acttab_free(acttab *p){
|
void acttab_free(acttab **pp){
|
||||||
|
acttab *p = *pp;
|
||||||
free( p->aAction );
|
free( p->aAction );
|
||||||
free( p->aLookahead );
|
free( p->aLookahead );
|
||||||
free( p );
|
free( p );
|
||||||
|
@ -2506,12 +2507,14 @@ struct lemon *gp;
|
||||||
ErrorMsg(ps.filename,0,"Can't allocate %d of memory to hold this file.",
|
ErrorMsg(ps.filename,0,"Can't allocate %d of memory to hold this file.",
|
||||||
filesize+1);
|
filesize+1);
|
||||||
gp->errorcnt++;
|
gp->errorcnt++;
|
||||||
|
fclose(fp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( fread(filebuf,1,filesize,fp)!=filesize ){
|
if( fread(filebuf,1,filesize,fp)!=filesize ){
|
||||||
ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.",
|
ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.",
|
||||||
filesize);
|
filesize);
|
||||||
free(filebuf);
|
free(filebuf);
|
||||||
|
fclose(fp);
|
||||||
gp->errorcnt++;
|
gp->errorcnt++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3081,9 +3084,11 @@ struct lemon *lemp;
|
||||||
in = fopen(tpltname,"rb");
|
in = fopen(tpltname,"rb");
|
||||||
if( in==0 ){
|
if( in==0 ){
|
||||||
fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
|
fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
|
||||||
|
free(tpltname);
|
||||||
lemp->errorcnt++;
|
lemp->errorcnt++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
free(tpltname);
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3942,6 +3947,7 @@ int mhflag; /* Output in makeheaders format if true */
|
||||||
/* Append any addition code the user desires */
|
/* Append any addition code the user desires */
|
||||||
tplt_print(out,lemp,lemp->extracode,lemp->extracodeln,&lineno);
|
tplt_print(out,lemp,lemp->extracode,lemp->extracodeln,&lineno);
|
||||||
|
|
||||||
|
acttab_free(&pActtab);
|
||||||
fclose(in);
|
fclose(in);
|
||||||
fclose(out);
|
fclose(out);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -248,7 +248,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_CheckCeiling(state label);
|
action native A_CheckCeiling(state label);
|
||||||
action native A_PlayerSkinCheck(state label);
|
action native A_PlayerSkinCheck(state label);
|
||||||
action native A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, float missileheight);
|
action native A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, float missileheight);
|
||||||
action native A_Teleport(state teleportstate = "", class<SpecialSpot> targettype = "BossSpot", class<Actor> fogtype = "TeleportFog", int flags = 0, float mindist = 0, float maxdist = 0);
|
action native A_Teleport(state teleportstate = "", class<SpecialSpot> targettype = "BossSpot", class<Actor> fogtype = "TeleportFog", int flags = 0, float mindist = 0, float maxdist = 0, int ptr = AAPTR_DEFAULT);
|
||||||
action native A_Warp(int ptr_destination, float xofs = 0, float yofs = 0, float zofs = 0, float angle = 0, int flags = 0, state success_state = "");
|
action native A_Warp(int ptr_destination, float xofs = 0, float yofs = 0, float zofs = 0, float angle = 0, int flags = 0, state success_state = "");
|
||||||
action native A_ThrowGrenade(class<Actor> itemtype, float zheight = 0, float xyvel = 0, float zvel = 0, bool useammo = true);
|
action native A_ThrowGrenade(class<Actor> itemtype, float zheight = 0, float xyvel = 0, float zvel = 0, bool useammo = true);
|
||||||
action native A_Weave(int xspeed, int yspeed, float xdist, float ydist);
|
action native A_Weave(int xspeed, int yspeed, float xdist, float ydist);
|
||||||
|
@ -330,6 +330,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_SetFloatBobPhase(int bob);
|
action native A_SetFloatBobPhase(int bob);
|
||||||
action native A_SetHealth(int health, int ptr = AAPTR_DEFAULT);
|
action native A_SetHealth(int health, int ptr = AAPTR_DEFAULT);
|
||||||
action native A_ResetHealth(int ptr = AAPTR_DEFAULT);
|
action native A_ResetHealth(int ptr = AAPTR_DEFAULT);
|
||||||
|
action native A_JumpIfHigherOrLower(state high, state low, float offsethigh = 0, float offsetlow = 0, bool includeHeight = true, int ptr = AAPTR_TARGET);
|
||||||
action native A_SetRipperLevel(int level);
|
action native A_SetRipperLevel(int level);
|
||||||
action native A_SetRipMin(int min);
|
action native A_SetRipMin(int min);
|
||||||
action native A_SetRipMax(int max);
|
action native A_SetRipMax(int max);
|
||||||
|
|
|
@ -140,6 +140,7 @@ const int MRF_NEWTIDBEHAVIOUR = 256;
|
||||||
const int MRF_UNDOBYDEATH = 512;
|
const int MRF_UNDOBYDEATH = 512;
|
||||||
const int MRF_UNDOBYDEATHFORCED = 1024;
|
const int MRF_UNDOBYDEATHFORCED = 1024;
|
||||||
const int MRF_UNDOBYDEATHSAVES = 2048;
|
const int MRF_UNDOBYDEATHSAVES = 2048;
|
||||||
|
const int MRF_UNDOALWAYS = 4096;
|
||||||
|
|
||||||
// Flags for A_RailAttack and A_CustomRailgun
|
// Flags for A_RailAttack and A_CustomRailgun
|
||||||
const int RGF_SILENT = 1;
|
const int RGF_SILENT = 1;
|
||||||
|
|
Loading…
Reference in a new issue