mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-22 04:01:31 +00:00
Merge remote-tracking branch 'gzdoom/master' into asmjit
This commit is contained in:
commit
eb9d2b54f3
67 changed files with 393 additions and 383 deletions
|
@ -204,9 +204,9 @@ if( MSVC )
|
|||
# Avoid CRT DLL dependancies in release builds, optionally generate assembly output for checking crash locations.
|
||||
option( ZDOOM_GENERATE_ASM "Generate assembly output." OFF )
|
||||
if( ZDOOM_GENERATE_ASM )
|
||||
set( REL_C_FLAGS "/MT /Oy /Oi /FAcs" )
|
||||
set( REL_C_FLAGS "/MT /Oy /Oi /FAcs /GS-" )
|
||||
else()
|
||||
set( REL_C_FLAGS "/MT /Oy /Oi" )
|
||||
set( REL_C_FLAGS "/MT /Oy /Oi /GS-" )
|
||||
endif()
|
||||
|
||||
|
||||
|
|
15
src/actor.h
15
src/actor.h
|
@ -403,6 +403,7 @@ enum ActorFlag8
|
|||
MF8_INSCROLLSEC = 0x00000002, // actor is partially inside a scrolling sector
|
||||
MF8_BLOCKASPLAYER = 0x00000004, // actor is blocked by player-blocking lines even if not a player
|
||||
MF8_DONTFACETALKER = 0x00000008, // don't alter the angle to face the player in conversations
|
||||
MF8_HITOWNER = 0x00000010, // projectile can hit the actor that fired it
|
||||
};
|
||||
|
||||
// --- mobj.renderflags ---
|
||||
|
@ -1140,7 +1141,7 @@ public:
|
|||
uint8_t WeaveIndexZ;
|
||||
int skillrespawncount;
|
||||
int TIDtoHate; // TID of things to hate (0 if none)
|
||||
FNameNoInit Species; // For monster families
|
||||
FName Species; // For monster families
|
||||
TObjPtr<AActor*> alternative; // (Un)Morphed actors stored here. Those with the MF_UNMORPHED flag are the originals.
|
||||
TObjPtr<AActor*> tracer; // Thing being chased/attacked for tracers
|
||||
TObjPtr<AActor*> master; // Thing which spawned this one (prevents mutual attacks)
|
||||
|
@ -1183,12 +1184,12 @@ public:
|
|||
line_t *BlockingLine; // Line that blocked the last move
|
||||
|
||||
int PoisonDamage; // Damage received per tic from poison.
|
||||
FNameNoInit PoisonDamageType; // Damage type dealt by poison.
|
||||
FName PoisonDamageType; // Damage type dealt by poison.
|
||||
int PoisonDuration; // Duration left for receiving poison damage.
|
||||
int PoisonPeriod; // How often poison damage is applied. (Every X tics.)
|
||||
|
||||
int PoisonDamageReceived; // Damage received per tic from poison.
|
||||
FNameNoInit PoisonDamageTypeReceived; // Damage type received by poison.
|
||||
FName PoisonDamageTypeReceived; // Damage type received by poison.
|
||||
int PoisonDurationReceived; // Duration left for receiving poison damage.
|
||||
int PoisonPeriodReceived; // How often poison damage is applied. (Every X tics.)
|
||||
TObjPtr<AActor*> Poisoner; // Last source of received poison damage.
|
||||
|
@ -1228,13 +1229,13 @@ public:
|
|||
int32_t Mass;
|
||||
int16_t PainChance;
|
||||
int PainThreshold;
|
||||
FNameNoInit DamageType;
|
||||
FNameNoInit DamageTypeReceived;
|
||||
FName DamageType;
|
||||
FName DamageTypeReceived;
|
||||
double DamageFactor;
|
||||
double DamageMultiply;
|
||||
|
||||
FNameNoInit PainType;
|
||||
FNameNoInit DeathType;
|
||||
FName PainType;
|
||||
FName DeathType;
|
||||
PClassActor *TeleFogSourceType;
|
||||
PClassActor *TeleFogDestType;
|
||||
int RipperLevel;
|
||||
|
|
|
@ -1807,7 +1807,7 @@ struct TabData
|
|||
FName TabName;
|
||||
|
||||
TabData()
|
||||
: UseCount(0)
|
||||
: UseCount(0), TabName(NAME_None)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -756,7 +756,7 @@ void D_ReadUserInfoStrings (int pnum, uint8_t **stream, bool update)
|
|||
const char *breakpt;
|
||||
FString value;
|
||||
bool compact;
|
||||
FName keyname;
|
||||
FName keyname = NAME_None;
|
||||
unsigned int infotype = 0;
|
||||
|
||||
if (*ptr++ != '\\')
|
||||
|
@ -925,8 +925,6 @@ void WriteUserInfo(FSerializer &arc, userinfo_t &info)
|
|||
|
||||
void ReadUserInfo(FSerializer &arc, userinfo_t &info, FString &skin)
|
||||
{
|
||||
FName name;
|
||||
FBaseCVar **cvar;
|
||||
UCVarValue val;
|
||||
const char *key;
|
||||
const char *str;
|
||||
|
@ -938,8 +936,8 @@ void ReadUserInfo(FSerializer &arc, userinfo_t &info, FString &skin)
|
|||
while ((key = arc.GetKey()))
|
||||
{
|
||||
arc.StringPtr(nullptr, str);
|
||||
name = key;
|
||||
cvar = info.CheckKey(name);
|
||||
FName name = key;
|
||||
FBaseCVar **cvar = info.CheckKey(name);
|
||||
if (cvar != NULL && *cvar != NULL)
|
||||
{
|
||||
switch (name)
|
||||
|
|
164
src/d_player.h
164
src/d_player.h
|
@ -141,7 +141,7 @@ public:
|
|||
double SideMove1, SideMove2;
|
||||
FTextureID ScoreIcon;
|
||||
int SpawnMask;
|
||||
FNameNoInit MorphWeapon;
|
||||
FName MorphWeapon;
|
||||
double AttackZOffset; // attack height, relative to player center
|
||||
double UseRange; // [NS] Distance at which player can +use
|
||||
double AirCapacity; // Multiplier for air supply underwater.
|
||||
|
@ -155,10 +155,10 @@ public:
|
|||
double ViewBob;
|
||||
|
||||
// Former class properties that were moved into the object to get rid of the meta class.
|
||||
FNameNoInit SoundClass; // Sound class
|
||||
FNameNoInit Face; // Doom status bar face (when used)
|
||||
FNameNoInit Portrait;
|
||||
FNameNoInit Slot[10];
|
||||
FName SoundClass; // Sound class
|
||||
FName Face; // Doom status bar face (when used)
|
||||
FName Portrait;
|
||||
FName Slot[10];
|
||||
double HexenArmor[5];
|
||||
uint8_t ColorRangeStart; // Skin color range
|
||||
uint8_t ColorRangeEnd;
|
||||
|
@ -372,7 +372,7 @@ void WriteUserInfo(FSerializer &arc, userinfo_t &info);
|
|||
class player_t
|
||||
{
|
||||
public:
|
||||
player_t();
|
||||
player_t() = default;
|
||||
~player_t();
|
||||
player_t &operator= (const player_t &p);
|
||||
|
||||
|
@ -384,117 +384,117 @@ public:
|
|||
void SetLogText (const char *text);
|
||||
void SendPitchLimits() const;
|
||||
|
||||
APlayerPawn *mo;
|
||||
uint8_t playerstate;
|
||||
ticcmd_t cmd;
|
||||
APlayerPawn *mo = nullptr;
|
||||
uint8_t playerstate = 0;
|
||||
ticcmd_t cmd = {};
|
||||
usercmd_t original_cmd;
|
||||
uint32_t original_oldbuttons;
|
||||
|
||||
userinfo_t userinfo; // [RH] who is this?
|
||||
|
||||
PClassActor *cls; // class of associated PlayerPawn
|
||||
PClassActor *cls = nullptr; // class of associated PlayerPawn
|
||||
|
||||
float DesiredFOV; // desired field of vision
|
||||
float FOV; // current field of vision
|
||||
double viewz; // focal origin above r.z
|
||||
double viewheight; // base height above floor for viewz
|
||||
double deltaviewheight; // squat speed.
|
||||
double bob; // bounded/scaled total velocity
|
||||
float DesiredFOV = 0; // desired field of vision
|
||||
float FOV = 0; // current field of vision
|
||||
double viewz = 0; // focal origin above r.z
|
||||
double viewheight = 0; // base height above floor for viewz
|
||||
double deltaviewheight = 0; // squat speed.
|
||||
double bob = 0; // bounded/scaled total velocity
|
||||
|
||||
// killough 10/98: used for realistic bobbing (i.e. not simply overall speed)
|
||||
// mo->velx and mo->vely represent true velocity experienced by player.
|
||||
// This only represents the thrust that the player applies himself.
|
||||
// This avoids anomalies with such things as Boom ice and conveyors.
|
||||
DVector2 Vel;
|
||||
DVector2 Vel = { 0,0 };
|
||||
|
||||
bool centering;
|
||||
uint8_t turnticks;
|
||||
bool centering = false;
|
||||
uint8_t turnticks = 0;
|
||||
|
||||
|
||||
bool attackdown;
|
||||
bool usedown;
|
||||
uint32_t oldbuttons;
|
||||
int health; // only used between levels, mo->health
|
||||
bool attackdown = false;
|
||||
bool usedown = false;
|
||||
uint32_t oldbuttons = false;
|
||||
int health = 0; // only used between levels, mo->health
|
||||
// is used during levels
|
||||
|
||||
int inventorytics;
|
||||
uint8_t CurrentPlayerClass; // class # for this player instance
|
||||
int inventorytics = 0;
|
||||
uint8_t CurrentPlayerClass = 0; // class # for this player instance
|
||||
|
||||
int frags[MAXPLAYERS]; // kills of other players
|
||||
int fragcount; // [RH] Cumulative frags for this player
|
||||
int lastkilltime; // [RH] For multikills
|
||||
uint8_t multicount;
|
||||
uint8_t spreecount; // [RH] Keep track of killing sprees
|
||||
uint16_t WeaponState;
|
||||
int frags[MAXPLAYERS] = {}; // kills of other players
|
||||
int fragcount = 0; // [RH] Cumulative frags for this player
|
||||
int lastkilltime = 0; // [RH] For multikills
|
||||
uint8_t multicount = 0;
|
||||
uint8_t spreecount = 0; // [RH] Keep track of killing sprees
|
||||
uint16_t WeaponState = 0;
|
||||
|
||||
AWeapon *ReadyWeapon;
|
||||
AWeapon *PendingWeapon; // WP_NOCHANGE if not changing
|
||||
TObjPtr<DPSprite*> psprites; // view sprites (gun, etc)
|
||||
AWeapon *ReadyWeapon = nullptr;
|
||||
AWeapon *PendingWeapon = nullptr; // WP_NOCHANGE if not changing
|
||||
TObjPtr<DPSprite*> psprites = nullptr; // view sprites (gun, etc)
|
||||
|
||||
int cheats; // bit flags
|
||||
int timefreezer; // Player has an active time freezer
|
||||
short refire; // refired shots are less accurate
|
||||
short inconsistant;
|
||||
bool waiting;
|
||||
int killcount, itemcount, secretcount; // for intermission
|
||||
int damagecount, bonuscount;// for screen flashing
|
||||
int hazardcount; // for delayed Strife damage
|
||||
int hazardinterval; // Frequency of damage infliction
|
||||
FName hazardtype; // Damage type of last hazardous damage encounter.
|
||||
int poisoncount; // screen flash for poison damage
|
||||
FName poisontype; // type of poison damage to apply
|
||||
FName poisonpaintype; // type of Pain state to enter for poison damage
|
||||
TObjPtr<AActor*> poisoner; // NULL for non-player actors
|
||||
TObjPtr<AActor*> attacker; // who did damage (NULL for floors)
|
||||
int extralight; // so gun flashes light up areas
|
||||
short fixedcolormap; // can be set to REDCOLORMAP, etc.
|
||||
short fixedlightlevel;
|
||||
int morphTics; // player is a chicken/pig if > 0
|
||||
PClassActor *MorphedPlayerClass; // [MH] (for SBARINFO) class # for this player instance when morphed
|
||||
int MorphStyle; // which effects to apply for this player instance when morphed
|
||||
PClassActor *MorphExitFlash; // flash to apply when demorphing (cache of value given to P_MorphPlayer)
|
||||
TObjPtr<AWeapon*> PremorphWeapon; // ready weapon before morphing
|
||||
int chickenPeck; // chicken peck countdown
|
||||
int jumpTics; // delay the next jump for a moment
|
||||
bool onground; // Identifies if this player is on the ground or other object
|
||||
int cheats = 0; // bit flags
|
||||
int timefreezer = 0; // Player has an active time freezer
|
||||
short refire = 0; // refired shots are less accurate
|
||||
short inconsistant = 0;
|
||||
bool waiting = 0;
|
||||
int killcount = 0, itemcount = 0, secretcount = 0; // for intermission
|
||||
int damagecount = 0, bonuscount = 0;// for screen flashing
|
||||
int hazardcount = 0; // for delayed Strife damage
|
||||
int hazardinterval = 0; // Frequency of damage infliction
|
||||
FName hazardtype = NAME_None; // Damage type of last hazardous damage encounter.
|
||||
int poisoncount = 0; // screen flash for poison damage
|
||||
FName poisontype = NAME_None; // type of poison damage to apply
|
||||
FName poisonpaintype = NAME_None; // type of Pain state to enter for poison damage
|
||||
TObjPtr<AActor*> poisoner = nullptr; // NULL for non-player actors
|
||||
TObjPtr<AActor*> attacker = nullptr; // who did damage (NULL for floors)
|
||||
int extralight = 0; // so gun flashes light up areas
|
||||
short fixedcolormap = 0; // can be set to REDCOLORMAP, etc.
|
||||
short fixedlightlevel = 0;
|
||||
int morphTics = 0; // player is a chicken/pig if > 0
|
||||
PClassActor *MorphedPlayerClass = nullptr; // [MH] (for SBARINFO) class # for this player instance when morphed
|
||||
int MorphStyle = 0; // which effects to apply for this player instance when morphed
|
||||
PClassActor *MorphExitFlash = nullptr; // flash to apply when demorphing (cache of value given to P_MorphPlayer)
|
||||
TObjPtr<AWeapon*> PremorphWeapon = nullptr; // ready weapon before morphing
|
||||
int chickenPeck = 0; // chicken peck countdown
|
||||
int jumpTics = 0; // delay the next jump for a moment
|
||||
bool onground = 0; // Identifies if this player is on the ground or other object
|
||||
|
||||
int respawn_time; // [RH] delay respawning until this tic
|
||||
TObjPtr<AActor*> camera; // [RH] Whose eyes this player sees through
|
||||
int respawn_time = 0; // [RH] delay respawning until this tic
|
||||
TObjPtr<AActor*> camera = nullptr; // [RH] Whose eyes this player sees through
|
||||
|
||||
int air_finished; // [RH] Time when you start drowning
|
||||
int air_finished = 0; // [RH] Time when you start drowning
|
||||
|
||||
FName LastDamageType; // [RH] For damage-specific pain and death sounds
|
||||
FName LastDamageType = NAME_None; // [RH] For damage-specific pain and death sounds
|
||||
|
||||
TObjPtr<AActor*> MUSINFOactor; // For MUSINFO purposes
|
||||
int8_t MUSINFOtics;
|
||||
TObjPtr<AActor*> MUSINFOactor = nullptr; // For MUSINFO purposes
|
||||
int8_t MUSINFOtics = 0;
|
||||
|
||||
bool settings_controller; // Player can control game settings.
|
||||
int8_t crouching;
|
||||
int8_t crouchdir;
|
||||
bool settings_controller = false; // Player can control game settings.
|
||||
int8_t crouching = 0;
|
||||
int8_t crouchdir = 0;
|
||||
|
||||
//Added by MC:
|
||||
TObjPtr<DBot*> Bot;
|
||||
TObjPtr<DBot*> Bot = nullptr;
|
||||
|
||||
float BlendR; // [RH] Final blending values
|
||||
float BlendG;
|
||||
float BlendB;
|
||||
float BlendA;
|
||||
float BlendR = 0; // [RH] Final blending values
|
||||
float BlendG = 0;
|
||||
float BlendB = 0;
|
||||
float BlendA = 0;
|
||||
|
||||
FString LogText; // [RH] Log for Strife
|
||||
|
||||
DAngle MinPitch; // Viewpitch limits (negative is up, positive is down)
|
||||
DAngle MaxPitch;
|
||||
DAngle MinPitch = 0.; // Viewpitch limits (negative is up, positive is down)
|
||||
DAngle MaxPitch = 0.;
|
||||
|
||||
double crouchfactor;
|
||||
double crouchoffset;
|
||||
double crouchviewdelta;
|
||||
double crouchfactor = 0;
|
||||
double crouchoffset = 0;
|
||||
double crouchviewdelta = 0;
|
||||
|
||||
FWeaponSlots weapons;
|
||||
|
||||
// [CW] I moved these here for multiplayer conversation support.
|
||||
TObjPtr<AActor*> ConversationNPC, ConversationPC;
|
||||
DAngle ConversationNPCAngle;
|
||||
bool ConversationFaceTalker;
|
||||
TObjPtr<AActor*> ConversationNPC = nullptr, ConversationPC = nullptr;
|
||||
DAngle ConversationNPCAngle = 0.;
|
||||
bool ConversationFaceTalker = false;
|
||||
|
||||
double GetDeltaViewHeight() const
|
||||
{
|
||||
|
|
|
@ -1037,8 +1037,8 @@ FDecalLib::FTranslation *FDecalLib::GenerateTranslation (uint32_t start, uint32_
|
|||
}
|
||||
|
||||
FDecalBase::FDecalBase ()
|
||||
: Name(NAME_None)
|
||||
{
|
||||
Name = NAME_None;
|
||||
}
|
||||
|
||||
FDecalBase::~FDecalBase ()
|
||||
|
@ -1152,8 +1152,8 @@ const FDecalTemplate *FDecalGroup::GetDecal () const
|
|||
}
|
||||
|
||||
FDecalAnimator::FDecalAnimator (const char *name)
|
||||
: Name(name)
|
||||
{
|
||||
Name = name;
|
||||
}
|
||||
|
||||
FDecalAnimator::~FDecalAnimator ()
|
||||
|
|
|
@ -58,8 +58,8 @@ public:
|
|||
uint8_t *Meta = nullptr; // Per-class static script data
|
||||
unsigned Size = sizeof(DObject);
|
||||
unsigned MetaSize = 0;
|
||||
FName TypeName;
|
||||
FName SourceLumpName;
|
||||
FName TypeName = NAME_None;
|
||||
FName SourceLumpName = NAME_None;
|
||||
bool bRuntimeClass = false; // class was defined at run-time, not compile-time
|
||||
bool bDecorateClass = false; // may be subject to some idiosyncracies due to DECORATE backwards compatibility
|
||||
bool bAbstract = false;
|
||||
|
|
|
@ -373,7 +373,7 @@ struct FMapThing
|
|||
uint32_t RenderStyle;
|
||||
int FloatbobPhase;
|
||||
int friendlyseeblocks;
|
||||
FNameNoInit arg0str;
|
||||
FName arg0str;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ struct EDSector
|
|||
|
||||
int damageamount;
|
||||
int damageinterval;
|
||||
FNameNoInit damagetype;
|
||||
FName damagetype;
|
||||
uint8_t leaky;
|
||||
uint8_t leakyadd;
|
||||
uint8_t leakyremove;
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "actor.h"
|
||||
#include "c_dispatch.h"
|
||||
#include "d_net.h"
|
||||
#include "info.h"
|
||||
|
||||
DStaticEventHandler* E_FirstEventHandler = nullptr;
|
||||
DStaticEventHandler* E_LastEventHandler = nullptr;
|
||||
|
@ -506,6 +507,14 @@ bool E_CheckRequireMouse()
|
|||
return false;
|
||||
}
|
||||
|
||||
bool E_CheckReplacement( PClassActor *replacee, PClassActor **replacement )
|
||||
{
|
||||
bool final = false;
|
||||
for (DStaticEventHandler *handler = E_FirstEventHandler; handler; handler = handler->next)
|
||||
handler->CheckReplacement(replacee,replacement,&final);
|
||||
return final;
|
||||
}
|
||||
|
||||
// normal event loopers (non-special, argument-less)
|
||||
DEFINE_EVENT_LOOPER(RenderFrame)
|
||||
DEFINE_EVENT_LOOPER(WorldLightning)
|
||||
|
@ -571,6 +580,10 @@ DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name)
|
|||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Args)
|
||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, IsManual)
|
||||
|
||||
DEFINE_FIELD_X(ReplaceEvent, FReplaceEvent, Replacee)
|
||||
DEFINE_FIELD_X(ReplaceEvent, FReplaceEvent, Replacement)
|
||||
DEFINE_FIELD_X(ReplaceEvent, FReplaceEvent, IsFinal)
|
||||
|
||||
DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DStaticEventHandler);
|
||||
|
@ -653,6 +666,8 @@ DEFINE_EMPTY_HANDLER(DStaticEventHandler, PostUiTick);
|
|||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, ConsoleProcess);
|
||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, NetworkProcess);
|
||||
|
||||
DEFINE_EMPTY_HANDLER(DStaticEventHandler, CheckReplacement);
|
||||
|
||||
// ===========================================
|
||||
//
|
||||
// Event handlers
|
||||
|
@ -1123,6 +1138,22 @@ void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int
|
|||
}
|
||||
}
|
||||
|
||||
void DStaticEventHandler::CheckReplacement( PClassActor *replacee, PClassActor **replacement, bool *final )
|
||||
{
|
||||
IFVIRTUAL(DStaticEventHandler, CheckReplacement)
|
||||
{
|
||||
// don't create excessive DObjects if not going to be processed anyway
|
||||
if (func == DStaticEventHandler_CheckReplacement_VMPtr)
|
||||
return;
|
||||
FReplaceEvent e = { replacee, *replacement, *final };
|
||||
VMValue params[2] = { (DStaticEventHandler*)this, &e };
|
||||
VMCall(func, params, 2, nullptr, 0);
|
||||
if ( e.Replacement != replacee ) // prevent infinite recursion
|
||||
*replacement = e.Replacement;
|
||||
*final = e.IsFinal;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
void DStaticEventHandler::OnDestroy()
|
||||
{
|
||||
|
|
15
src/events.h
15
src/events.h
|
@ -69,6 +69,9 @@ bool E_Responder(const event_t* ev); // splits events into InputProcess and UiPr
|
|||
// this executes on console/net events.
|
||||
void E_Console(int player, FString name, int arg1, int arg2, int arg3, bool manual);
|
||||
|
||||
// called when looking up the replacement for an actor class
|
||||
bool E_CheckReplacement(PClassActor* replacee, PClassActor** replacement);
|
||||
|
||||
// send networked event. unified function.
|
||||
bool E_SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual);
|
||||
|
||||
|
@ -166,6 +169,9 @@ public:
|
|||
|
||||
//
|
||||
void ConsoleProcess(int player, FString name, int arg1, int arg2, int arg3, bool manual);
|
||||
|
||||
//
|
||||
void CheckReplacement(PClassActor* replacee, PClassActor** replacement, bool* final);
|
||||
};
|
||||
class DEventHandler : public DStaticEventHandler
|
||||
{
|
||||
|
@ -198,7 +204,7 @@ struct FWorldEvent
|
|||
AActor* Inflictor = nullptr; // can be null - for damagemobj
|
||||
AActor* DamageSource = nullptr; // can be null
|
||||
int Damage = 0;
|
||||
FName DamageType;
|
||||
FName DamageType = NAME_None;
|
||||
int DamageFlags = 0;
|
||||
DAngle DamageAngle;
|
||||
// for line(pre)activated
|
||||
|
@ -262,4 +268,11 @@ struct FConsoleEvent
|
|||
bool IsManual;
|
||||
};
|
||||
|
||||
struct FReplaceEvent
|
||||
{
|
||||
PClassActor* Replacee;
|
||||
PClassActor* Replacement;
|
||||
bool IsFinal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2885,44 +2885,64 @@ void FParser::SF_MoveCamera(void)
|
|||
}
|
||||
|
||||
double targetheight = floatvalue(t_argv[2]);
|
||||
double movespeed = floatvalue(t_argv[3]);
|
||||
DVector3 campos = cam->Pos();
|
||||
DVector3 targpos = DVector3(target->Pos(), targetheight);
|
||||
DVector3 movement = targpos - campos;
|
||||
double movelen = movement.Length();
|
||||
|
||||
bool finishedmove = false;
|
||||
bool finishedangle = false;
|
||||
|
||||
cam->radius = 1 / 8192.;
|
||||
cam->Height = 1 / 8192.;
|
||||
|
||||
if (campos != targpos)
|
||||
{
|
||||
DVector3 movement = targpos - campos;
|
||||
double movelen = movement.Length();
|
||||
double movespeed = floatvalue(t_argv[3]);
|
||||
DVector3 movepos;
|
||||
bool finished = (movespeed >= movelen);
|
||||
if (finished) movepos = targpos;
|
||||
finishedmove = (movespeed >= movelen);
|
||||
if (finishedmove) movepos = targpos;
|
||||
else movepos = campos + movement.Resized(movespeed);
|
||||
cam->SetOrigin(movepos, true);
|
||||
}
|
||||
else finishedmove = true;
|
||||
|
||||
DAngle targetangle = floatvalue(t_argv[4]);
|
||||
DAngle targetangle = DAngle(floatvalue(t_argv[4])).Normalized360();
|
||||
if (cam->Angles.Yaw != targetangle)
|
||||
{
|
||||
DAngle anglespeed = floatvalue(t_argv[5]);
|
||||
DAngle anglenow = targetangle;
|
||||
const DAngle diffangle = deltaangle(cam->Angles.Yaw, targetangle);
|
||||
|
||||
if (movespeed > 0 && anglespeed == 0.)
|
||||
{
|
||||
if (!finished)
|
||||
if (!finishedmove)
|
||||
{
|
||||
const DAngle diffangle = targetangle - cam->Angles.Yaw;
|
||||
targetangle = cam->Angles.Yaw + diffangle * movespeed / movelen;
|
||||
anglenow = cam->Angles.Yaw + diffangle * movespeed / movelen;
|
||||
}
|
||||
else finishedangle = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
targetangle = cam->Angles.Yaw + anglespeed;
|
||||
if (diffangle > 0)
|
||||
{
|
||||
anglenow = (cam->Angles.Yaw + anglespeed).Normalized360();
|
||||
}
|
||||
else
|
||||
{
|
||||
anglenow = (cam->Angles.Yaw - anglespeed).Normalized360();
|
||||
}
|
||||
const DAngle diffangle2 = deltaangle(anglenow, targetangle);
|
||||
if (diffangle.Degrees * diffangle2.Degrees <= 0)
|
||||
{
|
||||
anglenow = targetangle;
|
||||
finishedangle = true;
|
||||
}
|
||||
}
|
||||
|
||||
cam->radius = 1 / 8192.;
|
||||
cam->Height = 1 / 8192.;
|
||||
cam->SetOrigin(movepos, true);
|
||||
cam->SetAngle(targetangle, false);
|
||||
t_return.value.i = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
t_return.value.i = 0;
|
||||
cam->SetAngle(anglenow, false);
|
||||
}
|
||||
else finishedangle = true;
|
||||
t_return.value.i = !(finishedmove & finishedangle);
|
||||
t_return.type = svt_int;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2043,6 +2043,30 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, Vec3Diff)
|
|||
ACTION_RETURN_VEC3(VecDiff(DVector3(x1, y1, z1), DVector3(x2, y2, z2)));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(FLevelLocals, SphericalCoords)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_FLOAT(viewpointX);
|
||||
PARAM_FLOAT(viewpointY);
|
||||
PARAM_FLOAT(viewpointZ);
|
||||
PARAM_FLOAT(targetX);
|
||||
PARAM_FLOAT(targetY);
|
||||
PARAM_FLOAT(targetZ);
|
||||
PARAM_ANGLE_DEF(viewYaw);
|
||||
PARAM_ANGLE_DEF(viewPitch);
|
||||
PARAM_BOOL_DEF(absolute);
|
||||
|
||||
DVector3 viewpoint(viewpointX, viewpointY, viewpointZ);
|
||||
DVector3 target(targetX, targetY, targetZ);
|
||||
auto vecTo = absolute ? target - viewpoint : VecDiff(viewpoint, target);
|
||||
|
||||
ACTION_RETURN_VEC3(DVector3(
|
||||
deltaangle(vecTo.Angle(), viewYaw).Degrees,
|
||||
deltaangle(-vecTo.Pitch(), viewPitch).Degrees,
|
||||
vecTo.Length()
|
||||
));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(FLevelLocals, Vec2Offset)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
|
|
|
@ -264,9 +264,8 @@ struct level_info_t;
|
|||
|
||||
struct FOptionalMapinfoData
|
||||
{
|
||||
FOptionalMapinfoData *Next;
|
||||
FName identifier;
|
||||
FOptionalMapinfoData() { Next = NULL; identifier = NAME_None; }
|
||||
FOptionalMapinfoData *Next = nullptr;
|
||||
FName identifier = NAME_None;
|
||||
virtual ~FOptionalMapinfoData() {}
|
||||
virtual FOptionalMapinfoData *Clone() const = 0;
|
||||
};
|
||||
|
@ -572,7 +571,7 @@ typedef TMap<FName, FName> SkillActorReplacement;
|
|||
|
||||
struct FSkillInfo
|
||||
{
|
||||
FName Name;
|
||||
FName Name = NAME_None;
|
||||
double AmmoFactor, DoubleAmmoFactor, DropAmmoFactor;
|
||||
double DamageFactor;
|
||||
double ArmorFactor;
|
||||
|
|
|
@ -259,10 +259,13 @@ void level_info_t::Reset()
|
|||
compatflags = compatflags2 = 0;
|
||||
compatmask = compatmask2 = 0;
|
||||
Translator = "";
|
||||
RedirectType = 0;
|
||||
RedirectType = NAME_None;
|
||||
RedirectMapName = "";
|
||||
EnterPic = "";
|
||||
ExitPic = "";
|
||||
Intermission = NAME_None;
|
||||
deathsequence = NAME_None;
|
||||
slideshow = NAME_None;
|
||||
InterMusic = "";
|
||||
intermusicorder = 0;
|
||||
SoundInfo = "";
|
||||
|
|
|
@ -252,7 +252,7 @@ struct FMugShotState
|
|||
unsigned int Position;
|
||||
int Time;
|
||||
int Random;
|
||||
FName State;
|
||||
FName State = NAME_None;
|
||||
TArray<FMugShotFrame> Frames;
|
||||
|
||||
FMugShotState(FName name);
|
||||
|
|
|
@ -667,7 +667,7 @@ class CommandDrawSwitchableImage : public CommandDrawImage
|
|||
Operator conditionalOperator[2];
|
||||
FString inventoryItem[2];
|
||||
int armorType[2];
|
||||
FName keySpecies[2];
|
||||
FName keySpecies[2] = { NAME_None, NAME_None };
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -319,7 +319,7 @@ void ST_CreateStatusBar(bool bTitleLevel)
|
|||
}
|
||||
if (StatusBar == nullptr)
|
||||
{
|
||||
FName defname;
|
||||
FName defname = NAME_None;
|
||||
|
||||
if (gameinfo.gametype & GAME_DoomChex) defname = "DoomStatusBar";
|
||||
else if (gameinfo.gametype == GAME_Heretic) defname = "HereticStatusBar";
|
||||
|
|
|
@ -576,6 +576,7 @@ void FGLRenderBuffers::BindDitherTexture(int texunit)
|
|||
.8515625, .6015625, .9765625, .7265625, .8671875, .6171875, .9921875, .7421875,
|
||||
};
|
||||
|
||||
glActiveTexture(GL_TEXTURE0 + texunit);
|
||||
mDitherTexture = Create2DTexture("DitherTexture", GL_R32F, 8, 8, data);
|
||||
}
|
||||
mDitherTexture.Bind(1, GL_NEAREST, GL_REPEAT);
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include "gl/renderer/gl_renderbuffers.h"
|
||||
#include "gl/data/gl_vertexbuffer.h"
|
||||
#include "gl/scene/gl_drawinfo.h"
|
||||
#include "hwrenderer/utility/hw_vrmodes.h"
|
||||
#include "hwrenderer/postprocessing/hw_presentshader.h"
|
||||
#include "hwrenderer/postprocessing/hw_present3dRowshader.h"
|
||||
#include "hwrenderer/postprocessing/hw_shadowmapshader.h"
|
||||
|
@ -422,7 +423,8 @@ void FGLRenderer::Draw2D(F2DDrawer *drawer)
|
|||
{
|
||||
twoD.Clock();
|
||||
FGLDebug::PushGroup("Draw2D");
|
||||
mBuffers->BindCurrentFB();
|
||||
if (VRMode::GetVRMode(true)->mEyeCount == 1)
|
||||
mBuffers->BindCurrentFB();
|
||||
const auto &mScreenViewport = screen->mScreenViewport;
|
||||
glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height);
|
||||
|
||||
|
|
|
@ -204,6 +204,7 @@ void GLWall::PutWall(HWDrawInfo *di, bool translucent)
|
|||
// make sure that following parts of the same linedef do not get this one's vertex and lighting info.
|
||||
vertcount = 0;
|
||||
dynlightindex = -1;
|
||||
flags &= ~GLWF_TRANSLUCENT;
|
||||
}
|
||||
|
||||
void GLWall::PutPortal(HWDrawInfo *di, int ptype)
|
||||
|
|
12
src/info.cpp
12
src/info.cpp
|
@ -408,7 +408,7 @@ void PClassActor::RegisterIDs()
|
|||
|
||||
PClassActor *PClassActor::GetReplacement(bool lookskill)
|
||||
{
|
||||
FName skillrepname;
|
||||
FName skillrepname = NAME_None;
|
||||
|
||||
if (lookskill && AllSkills.Size() > (unsigned)gameskill)
|
||||
{
|
||||
|
@ -425,7 +425,13 @@ PClassActor *PClassActor::GetReplacement(bool lookskill)
|
|||
lookskill = false; skillrepname = NAME_None;
|
||||
}
|
||||
}
|
||||
auto Replacement = ActorInfo()->Replacement;
|
||||
// [MK] ZScript replacement through Event Handlers, has priority over others
|
||||
PClassActor *Replacement = ActorInfo()->Replacement;
|
||||
if ( E_CheckReplacement(this,&Replacement) )
|
||||
{
|
||||
// [MK] the replacement is final, so don't continue with the chain
|
||||
return Replacement ? Replacement : this;
|
||||
}
|
||||
if (Replacement == nullptr && (!lookskill || skillrepname == NAME_None))
|
||||
{
|
||||
return this;
|
||||
|
@ -464,7 +470,7 @@ DEFINE_ACTION_FUNCTION(AActor, GetReplacement)
|
|||
|
||||
PClassActor *PClassActor::GetReplacee(bool lookskill)
|
||||
{
|
||||
FName skillrepname;
|
||||
FName skillrepname = NAME_None;
|
||||
|
||||
if (lookskill && AllSkills.Size() > (unsigned)gameskill)
|
||||
{
|
||||
|
|
|
@ -122,7 +122,7 @@ struct FIntermissionActionCast : public FIntermissionAction
|
|||
typedef FIntermissionAction Super;
|
||||
|
||||
FString mName;
|
||||
FName mCastClass;
|
||||
FName mCastClass = NAME_None;
|
||||
TArray<FCastSound> mCastSounds;
|
||||
|
||||
FIntermissionActionCast();
|
||||
|
@ -144,7 +144,7 @@ struct FIntermissionActionScroller : public FIntermissionAction
|
|||
|
||||
struct FIntermissionDescriptor
|
||||
{
|
||||
FName mLink;
|
||||
FName mLink = NAME_None;
|
||||
TDeletingArray<FIntermissionAction *> mActions;
|
||||
};
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ class DMenuDescriptor : public DObject
|
|||
{
|
||||
DECLARE_CLASS(DMenuDescriptor, DObject)
|
||||
public:
|
||||
FName mMenuName;
|
||||
FName mMenuName = NAME_None;
|
||||
FString mNetgameMessage;
|
||||
PClass *mClass = nullptr;
|
||||
bool mProtected = false;
|
||||
|
@ -287,7 +287,7 @@ class DMenuItemBase : public DObject
|
|||
DECLARE_CLASS(DMenuItemBase, DObject)
|
||||
public:
|
||||
double mXpos, mYpos;
|
||||
FNameNoInit mAction;
|
||||
FName mAction;
|
||||
bool mEnabled;
|
||||
|
||||
bool Activate();
|
||||
|
|
|
@ -657,11 +657,9 @@ static void ParseListMenu(FScanner &sc)
|
|||
|
||||
static void ParseOptionValue(FScanner &sc)
|
||||
{
|
||||
FName optname;
|
||||
|
||||
FOptionValues *val = new FOptionValues;
|
||||
sc.MustGetString();
|
||||
optname = sc.String;
|
||||
FName optname = sc.String;
|
||||
sc.MustGetStringName("{");
|
||||
while (!sc.CheckString("}"))
|
||||
{
|
||||
|
@ -689,11 +687,9 @@ static void ParseOptionValue(FScanner &sc)
|
|||
|
||||
static void ParseOptionString(FScanner &sc)
|
||||
{
|
||||
FName optname;
|
||||
|
||||
FOptionValues *val = new FOptionValues;
|
||||
sc.MustGetString();
|
||||
optname = sc.String;
|
||||
FName optname = sc.String;
|
||||
sc.MustGetStringName("{");
|
||||
while (!sc.CheckString("}"))
|
||||
{
|
||||
|
|
16
src/name.h
16
src/name.h
|
@ -46,7 +46,7 @@ class FString;
|
|||
class FName
|
||||
{
|
||||
public:
|
||||
FName () : Index(0) {}
|
||||
FName() = default;// : Index(0) {}
|
||||
FName (const char *text) { Index = NameData.FindName (text, false); }
|
||||
FName (const char *text, bool noCreate) { Index = NameData.FindName (text, noCreate); }
|
||||
FName (const char *text, size_t textlen, bool noCreate) { Index = NameData.FindName (text, textlen, noCreate); }
|
||||
|
@ -120,20 +120,6 @@ protected:
|
|||
};
|
||||
|
||||
static NameManager NameData;
|
||||
|
||||
enum EDummy { NoInit };
|
||||
FName (EDummy) {}
|
||||
};
|
||||
|
||||
class FNameNoInit : public FName
|
||||
{
|
||||
public:
|
||||
FNameNoInit() : FName(NoInit) {}
|
||||
|
||||
FName &operator = (const char *text) { Index = NameData.FindName (text, false); return *this; }
|
||||
FName &operator = (const FString &text);
|
||||
FName &operator = (const FName &other) { Index = int(other); return *this; }
|
||||
FName &operator = (ENamedName index) { Index = index; return *this; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -33,7 +33,7 @@ struct FStrifeDialogueNode
|
|||
FString Goodbye; // must init to null for binary scripts to work as intended
|
||||
|
||||
FStrifeDialogueReply *Children = nullptr;
|
||||
FName MenuClassName;
|
||||
FName MenuClassName = NAME_None;
|
||||
FString UserData;
|
||||
};
|
||||
|
||||
|
|
|
@ -182,25 +182,22 @@ void SexMessage (const char *from, char *to, int gender, const char *victim, con
|
|||
//
|
||||
void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgflags, FName MeansOfDeath)
|
||||
{
|
||||
FName mod;
|
||||
FString ret;
|
||||
const char *message;
|
||||
const char *messagename;
|
||||
char gendermessage[1024];
|
||||
|
||||
// No obituaries for non-players, voodoo dolls or when not wanted
|
||||
if (self->player == NULL || self->player->mo != self || !show_obituaries)
|
||||
if (self->player == nullptr || self->player->mo != self || !show_obituaries)
|
||||
return;
|
||||
|
||||
// Treat voodoo dolls as unknown deaths
|
||||
if (inflictor && inflictor->player && inflictor->player->mo != inflictor)
|
||||
MeansOfDeath = NAME_None;
|
||||
|
||||
mod = MeansOfDeath;
|
||||
message = NULL;
|
||||
messagename = NULL;
|
||||
FName mod = MeansOfDeath;
|
||||
const char *message = nullptr;
|
||||
const char *messagename = nullptr;
|
||||
|
||||
if (attacker == NULL || attacker->player != NULL)
|
||||
if (attacker == nullptr || attacker->player != nullptr)
|
||||
{
|
||||
if (mod == NAME_Telefrag)
|
||||
{
|
||||
|
|
|
@ -1539,7 +1539,7 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch
|
|||
// MBF bouncer might have a non-0 damage value, but they must not deal damage on impact either.
|
||||
if ((tm.thing->BounceFlags & BOUNCE_Actors) && (tm.thing->IsZeroDamage() || !(tm.thing->flags & MF_MISSILE)))
|
||||
{
|
||||
return (tm.thing->target == thing || !(thing->flags & MF_SOLID));
|
||||
return ((tm.thing->target == thing && !(tm.thing->flags8 & MF8_HITOWNER)) || !(thing->flags & MF_SOLID));
|
||||
}
|
||||
|
||||
switch (tm.thing->SpecialMissileHit(thing))
|
||||
|
@ -1554,8 +1554,8 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch
|
|||
|
||||
if (tm.thing->target != NULL)
|
||||
{
|
||||
if (thing == tm.thing->target)
|
||||
{ // Don't missile self
|
||||
if (thing == tm.thing->target && !(tm.thing->flags8 & MF8_HITOWNER))
|
||||
{ // Don't missile self -- [MK] unless explicitly allowed
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4484,7 +4484,7 @@ DEFINE_ACTION_FUNCTION(AActor, AimLineAttack)
|
|||
struct Origin
|
||||
{
|
||||
AActor *Caller;
|
||||
FNameNoInit PuffSpecies;
|
||||
FName PuffSpecies;
|
||||
bool hitGhosts;
|
||||
bool MThruSpecies;
|
||||
bool ThruSpecies;
|
||||
|
@ -5092,6 +5092,7 @@ AActor *P_LinePickActor(AActor *t1, DAngle angle, double distance, DAngle pitch,
|
|||
TData.MThruSpecies = false;
|
||||
TData.ThruActors = false;
|
||||
TData.ThruSpecies = false;
|
||||
TData.PuffSpecies = NAME_None;
|
||||
|
||||
if (Trace(t1->PosAtZ(shootz), t1->Sector, direction, distance,
|
||||
actorMask, wallMask, t1, trace, TRACE_NoSky | TRACE_PortalRestrict, CheckForActor, &TData))
|
||||
|
@ -5309,7 +5310,7 @@ struct RailData
|
|||
AActor *Caller;
|
||||
TArray<SRailHit> RailHits;
|
||||
TArray<SPortalHit> PortalHits;
|
||||
FNameNoInit PuffSpecies;
|
||||
FName PuffSpecies;
|
||||
bool StopAtOne;
|
||||
bool StopAtInvul;
|
||||
bool ThruGhosts;
|
||||
|
|
|
@ -2171,13 +2171,9 @@ bool AActor::FloorBounceMissile (secplane_t &plane)
|
|||
// Set bounce state
|
||||
if (BounceFlags & BOUNCE_UseBounceState)
|
||||
{
|
||||
FName names[2];
|
||||
FState *bouncestate;
|
||||
|
||||
names[0] = NAME_Bounce;
|
||||
names[1] = plane.fC() < 0 ? NAME_Ceiling : NAME_Floor;
|
||||
bouncestate = FindState(2, names);
|
||||
if (bouncestate != NULL)
|
||||
FName names[2] = { NAME_Bounce, plane.fC() < 0 ? NAME_Ceiling : NAME_Floor };
|
||||
FState *bouncestate = FindState(2, names);
|
||||
if (bouncestate != nullptr)
|
||||
{
|
||||
SetState(bouncestate);
|
||||
}
|
||||
|
|
|
@ -196,7 +196,7 @@ bool AActor::HasSpecialDeathStates () const
|
|||
TArray<FName> &MakeStateNameList(const char * fname)
|
||||
{
|
||||
static TArray<FName> namelist(3);
|
||||
FName firstpart, secondpart;
|
||||
FName firstpart = NAME_None, secondpart = NAME_None;
|
||||
char *c;
|
||||
|
||||
// Handle the old names for the existing death states
|
||||
|
@ -256,21 +256,19 @@ TArray<FName> &MakeStateNameList(const char * fname)
|
|||
FState *PClassActor::FindState(int numnames, FName *names, bool exact) const
|
||||
{
|
||||
FStateLabels *labels = GetStateLabels();
|
||||
FState *best = NULL;
|
||||
FState *best = nullptr;
|
||||
|
||||
if (labels != NULL)
|
||||
if (labels != nullptr)
|
||||
{
|
||||
int count = 0;
|
||||
FStateLabel *slabel = NULL;
|
||||
FName label;
|
||||
|
||||
// Find the best-matching label for this class.
|
||||
while (labels != NULL && count < numnames)
|
||||
while (labels != nullptr && count < numnames)
|
||||
{
|
||||
label = *names++;
|
||||
slabel = labels->FindLabel(label);
|
||||
FName label = *names++;
|
||||
FStateLabel *slabel = labels->FindLabel(label);
|
||||
|
||||
if (slabel != NULL)
|
||||
if (slabel != nullptr)
|
||||
{
|
||||
count++;
|
||||
labels = slabel->Children;
|
||||
|
@ -283,7 +281,7 @@ FState *PClassActor::FindState(int numnames, FName *names, bool exact) const
|
|||
}
|
||||
if (count < numnames && exact)
|
||||
{
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return best;
|
||||
|
@ -411,7 +409,7 @@ FStateDefine *FStateDefinitions::FindStateLabelInList(TArray<FStateDefine> & lis
|
|||
{
|
||||
FStateDefine def;
|
||||
def.Label = name;
|
||||
def.State = NULL;
|
||||
def.State = nullptr;
|
||||
def.DefineFlags = SDF_NEXT;
|
||||
return &list[list.Push(def)];
|
||||
}
|
||||
|
|
|
@ -375,10 +375,9 @@ void ParseSplash (FScanner &sc)
|
|||
int splashnum;
|
||||
FSplashDef *splashdef;
|
||||
bool isnew = false;
|
||||
FName name;
|
||||
|
||||
sc.MustGetString ();
|
||||
name = sc.String;
|
||||
FName name = sc.String;
|
||||
splashnum = (int)FindSplash (name);
|
||||
if (splashnum < 0)
|
||||
{
|
||||
|
@ -422,10 +421,9 @@ void ParseSplash (FScanner &sc)
|
|||
void ParseTerrain (FScanner &sc)
|
||||
{
|
||||
int terrainnum;
|
||||
FName name;
|
||||
|
||||
sc.MustGetString ();
|
||||
name = sc.String;
|
||||
FName name = sc.String;
|
||||
terrainnum = (int)P_FindTerrain (name);
|
||||
if (terrainnum < 0)
|
||||
{
|
||||
|
|
|
@ -462,7 +462,7 @@ class UDMFParser : public UDMFParserBase
|
|||
TArray<vertex_t> ParsedVertices;
|
||||
TArray<UDMFScroll> UDMFScrollers;
|
||||
|
||||
FDynamicColormap *fogMap, *normMap;
|
||||
FDynamicColormap *fogMap = nullptr, *normMap = nullptr;
|
||||
FMissingTextureTracker &missingTex;
|
||||
|
||||
public:
|
||||
|
@ -470,7 +470,6 @@ public:
|
|||
: missingTex(missing)
|
||||
{
|
||||
linemap.Clear();
|
||||
fogMap = normMap = NULL;
|
||||
}
|
||||
|
||||
void ReadUserKey(FUDMFKey &ukey) {
|
||||
|
@ -1357,11 +1356,11 @@ public:
|
|||
// Brand new UDMF scroller properties
|
||||
double scroll_ceil_x = 0;
|
||||
double scroll_ceil_y = 0;
|
||||
FName scroll_ceil_type;
|
||||
FName scroll_ceil_type = NAME_None;
|
||||
|
||||
double scroll_floor_x = 0;
|
||||
double scroll_floor_y = 0;
|
||||
FName scroll_floor_type;
|
||||
FName scroll_floor_type = NAME_None;
|
||||
|
||||
|
||||
memset(sec, 0, sizeof(*sec));
|
||||
|
|
|
@ -8,7 +8,7 @@ class UDMFParserBase
|
|||
{
|
||||
protected:
|
||||
FScanner sc;
|
||||
FName namespc;
|
||||
FName namespc = NAME_None;
|
||||
int namespace_bits;
|
||||
FString parsedString;
|
||||
bool BadCoordinates = false;
|
||||
|
|
|
@ -400,9 +400,9 @@ class USDFParser : public UDMFParserBase
|
|||
|
||||
bool ParseConversation()
|
||||
{
|
||||
PClassActor *type = NULL;
|
||||
PClassActor *type = nullptr;
|
||||
int dlgid = -1;
|
||||
FName clsid;
|
||||
FName clsid = NAME_None;
|
||||
unsigned int startpos = StrifeDialogues.Size();
|
||||
|
||||
while (!sc.CheckToken('}'))
|
||||
|
|
|
@ -301,82 +301,6 @@ CCMD (playerclasses)
|
|||
// 16 pixels of bob
|
||||
#define MAXBOB 16.
|
||||
|
||||
// The player_t constructor. Since LogText is not a POD, we cannot just
|
||||
// memset it all to 0.
|
||||
player_t::player_t()
|
||||
: mo(0),
|
||||
playerstate(0),
|
||||
cls(0),
|
||||
DesiredFOV(0),
|
||||
FOV(0),
|
||||
viewz(0),
|
||||
viewheight(0),
|
||||
deltaviewheight(0),
|
||||
bob(0),
|
||||
Vel(0, 0),
|
||||
centering(0),
|
||||
turnticks(0),
|
||||
attackdown(0),
|
||||
usedown(0),
|
||||
oldbuttons(0),
|
||||
health(0),
|
||||
inventorytics(0),
|
||||
CurrentPlayerClass(0),
|
||||
fragcount(0),
|
||||
lastkilltime(0),
|
||||
multicount(0),
|
||||
spreecount(0),
|
||||
WeaponState(0),
|
||||
ReadyWeapon(0),
|
||||
PendingWeapon(0),
|
||||
psprites(0),
|
||||
cheats(0),
|
||||
timefreezer(0),
|
||||
refire(0),
|
||||
inconsistant(0),
|
||||
killcount(0),
|
||||
itemcount(0),
|
||||
secretcount(0),
|
||||
damagecount(0),
|
||||
bonuscount(0),
|
||||
hazardcount(0),
|
||||
poisoncount(0),
|
||||
poisoner(0),
|
||||
attacker(0),
|
||||
extralight(0),
|
||||
morphTics(0),
|
||||
MorphedPlayerClass(0),
|
||||
MorphStyle(0),
|
||||
MorphExitFlash(0),
|
||||
PremorphWeapon(0),
|
||||
chickenPeck(0),
|
||||
jumpTics(0),
|
||||
onground(0),
|
||||
respawn_time(0),
|
||||
camera(0),
|
||||
air_finished(0),
|
||||
MUSINFOactor(0),
|
||||
MUSINFOtics(-1),
|
||||
crouching(0),
|
||||
crouchdir(0),
|
||||
Bot(0),
|
||||
BlendR(0),
|
||||
BlendG(0),
|
||||
BlendB(0),
|
||||
BlendA(0),
|
||||
LogText(),
|
||||
crouchfactor(0),
|
||||
crouchoffset(0),
|
||||
crouchviewdelta(0),
|
||||
ConversationNPC(0),
|
||||
ConversationPC(0),
|
||||
ConversationNPCAngle(0.),
|
||||
ConversationFaceTalker(0)
|
||||
{
|
||||
memset (&cmd, 0, sizeof(cmd));
|
||||
memset (frags, 0, sizeof(frags));
|
||||
}
|
||||
|
||||
player_t::~player_t()
|
||||
{
|
||||
DestroyPSprites();
|
||||
|
|
|
@ -60,7 +60,7 @@ bool RenderPolyWall::RenderLine(PolyRenderThread *thread, seg_t *line, sector_t
|
|||
linePortals.push_back(std::unique_ptr<PolyDrawLinePortal>(new PolyDrawLinePortal(line->linedef)));
|
||||
polyportal = linePortals.back().get();
|
||||
}
|
||||
else if (line->linedef && line->linedef->isVisualPortal())
|
||||
else if (line->linedef && line->linedef->isVisualPortal() && line->sidedef == line->linedef->sidedef[0])
|
||||
{
|
||||
if (portalEnterLine == line->linedef)
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
** i_main.mm
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 2012-2015 Alexey Lysiuk
|
||||
** Copyright 2012-2018 Alexey Lysiuk
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
|
@ -405,23 +405,23 @@ extern bool AppActive;
|
|||
|
||||
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
while (true)
|
||||
{
|
||||
NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||
while (true)
|
||||
{
|
||||
NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||
untilDate:[NSDate dateWithTimeIntervalSinceNow:0]
|
||||
inMode:NSDefaultRunLoopMode
|
||||
dequeue:YES];
|
||||
if (nil == event)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (nil == event)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
I_ProcessEvent(event);
|
||||
|
||||
[NSApp sendEvent:event];
|
||||
}
|
||||
|
||||
[NSApp updateWindows];
|
||||
|
||||
[NSApp updateWindows];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
** i_system.mm
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 2012-2015 Alexey Lysiuk
|
||||
** Copyright 2012-2018 Alexey Lysiuk
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
|
@ -63,7 +63,7 @@ void I_Tactile(int /*on*/, int /*off*/, int /*total*/)
|
|||
ticcmd_t* I_BaseTiccmd()
|
||||
{
|
||||
static ticcmd_t emptycmd;
|
||||
return &emptycmd;
|
||||
return &emptycmd;
|
||||
}
|
||||
|
||||
|
||||
|
@ -109,16 +109,16 @@ void I_Init(void)
|
|||
DumpCPUInfo(&CPU);
|
||||
|
||||
atterm(I_ShutdownSound);
|
||||
I_InitSound();
|
||||
I_InitSound();
|
||||
}
|
||||
|
||||
static int has_exited;
|
||||
|
||||
void I_Quit()
|
||||
{
|
||||
has_exited = 1; // Prevent infinitely recursive exits -- killough
|
||||
has_exited = 1; // Prevent infinitely recursive exits -- killough
|
||||
|
||||
if (demorecording)
|
||||
if (demorecording)
|
||||
{
|
||||
G_CheckDemoStatus();
|
||||
}
|
||||
|
@ -132,11 +132,11 @@ bool gameisdead;
|
|||
|
||||
void I_FatalError(const char* const error, ...)
|
||||
{
|
||||
static bool alreadyThrown = false;
|
||||
gameisdead = true;
|
||||
static bool alreadyThrown = false;
|
||||
gameisdead = true;
|
||||
|
||||
if (!alreadyThrown) // ignore all but the first message -- killough
|
||||
{
|
||||
if (!alreadyThrown) // ignore all but the first message -- killough
|
||||
{
|
||||
alreadyThrown = true;
|
||||
|
||||
char errortext[MAX_ERRORTEXT];
|
||||
|
@ -158,25 +158,25 @@ void I_FatalError(const char* const error, ...)
|
|||
|
||||
fprintf(stderr, "%s\n", errortext);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!has_exited) // If it hasn't exited yet, exit now -- killough
|
||||
{
|
||||
if (!has_exited) // If it hasn't exited yet, exit now -- killough
|
||||
{
|
||||
has_exited = 1; // Prevent infinitely recursive exits -- killough
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void I_Error(const char* const error, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char errortext[MAX_ERRORTEXT];
|
||||
va_list argptr;
|
||||
char errortext[MAX_ERRORTEXT];
|
||||
|
||||
va_start(argptr, error);
|
||||
vsnprintf(errortext, MAX_ERRORTEXT, error, argptr);
|
||||
va_end(argptr);
|
||||
va_start(argptr, error);
|
||||
vsnprintf(errortext, MAX_ERRORTEXT, error, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
throw CRecoverableError(errortext);
|
||||
throw CRecoverableError(errortext);
|
||||
}
|
||||
|
||||
|
||||
|
@ -270,7 +270,7 @@ static int matchfile(struct dirent *ent)
|
|||
static int matchfile(const struct dirent *ent)
|
||||
#endif
|
||||
{
|
||||
return fnmatch(pattern, ent->d_name, FNM_NOESCAPE) == 0;
|
||||
return fnmatch(pattern, ent->d_name, FNM_NOESCAPE) == 0;
|
||||
}
|
||||
|
||||
void* I_FindFirst(const char* const filespec, findstate_t* const fileinfo)
|
||||
|
@ -290,24 +290,24 @@ void* I_FindFirst(const char* const filespec, findstate_t* const fileinfo)
|
|||
dir = ".";
|
||||
}
|
||||
|
||||
fileinfo->current = 0;
|
||||
fileinfo->count = scandir(dir.GetChars(), &fileinfo->namelist, matchfile, alphasort);
|
||||
fileinfo->current = 0;
|
||||
fileinfo->count = scandir(dir.GetChars(), &fileinfo->namelist, matchfile, alphasort);
|
||||
|
||||
if (fileinfo->count > 0)
|
||||
{
|
||||
if (fileinfo->count > 0)
|
||||
{
|
||||
return fileinfo;
|
||||
}
|
||||
}
|
||||
|
||||
return (void*)-1;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
int I_FindNext(void* const handle, findstate_t* const fileinfo)
|
||||
{
|
||||
findstate_t* const state = static_cast<findstate_t*>(handle);
|
||||
findstate_t* const state = static_cast<findstate_t*>(handle);
|
||||
|
||||
if (state->current < fileinfo->count)
|
||||
{
|
||||
return ++state->current < fileinfo->count ? 0 : -1;
|
||||
if (state->current < fileinfo->count)
|
||||
{
|
||||
return ++state->current < fileinfo->count ? 0 : -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
|
|
@ -31,6 +31,8 @@ public:
|
|||
SDL_Window *GetSDLWindow() { return Screen; }
|
||||
void GetWindowBordersSize(int &top, int &left);
|
||||
|
||||
bool m_fsswitch;
|
||||
|
||||
protected:
|
||||
void SetGammaTable(uint16_t *tbl);
|
||||
void ResetGammaTable();
|
||||
|
|
|
@ -175,6 +175,8 @@ IVideo *gl_CreateVideo()
|
|||
SystemGLFrameBuffer::SystemGLFrameBuffer (void *, bool fullscreen)
|
||||
: DFrameBuffer (vid_defwidth, vid_defheight)
|
||||
{
|
||||
m_fsswitch = false;
|
||||
|
||||
// SDL_GetWindowBorderSize() is only available since 2.0.5, but because
|
||||
// GZDoom supports platforms with older SDL2 versions, this function
|
||||
// has to be dynamically loaded
|
||||
|
@ -334,8 +336,16 @@ void SystemGLFrameBuffer::ToggleFullscreen(bool yes)
|
|||
SDL_SetWindowFullscreen(Screen, yes ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
|
||||
if ( !yes )
|
||||
{
|
||||
fullscreen = false;
|
||||
SetWindowSize(win_w, win_h);
|
||||
if ( !m_fsswitch )
|
||||
{
|
||||
m_fsswitch = true;
|
||||
fullscreen = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fsswitch = false;
|
||||
SetWindowSize(win_w, win_h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -414,7 +424,7 @@ void ProcessSDLWindowEvent(const SDL_WindowEvent &event)
|
|||
break;
|
||||
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
if (!fullscreen)
|
||||
if (!fullscreen && !(static_cast<SystemGLFrameBuffer *>(screen)->m_fsswitch))
|
||||
{
|
||||
win_w = event.data1;
|
||||
win_h = event.data2;
|
||||
|
|
|
@ -582,7 +582,7 @@ struct FTransform
|
|||
|
||||
struct secspecial_t
|
||||
{
|
||||
FNameNoInit damagetype; // [RH] Means-of-death for applied damage
|
||||
FName damagetype; // [RH] Means-of-death for applied damage
|
||||
int damageamount; // [RH] Damage to do while standing on floor
|
||||
short special;
|
||||
short damageinterval; // Interval for damage application
|
||||
|
@ -997,7 +997,7 @@ public:
|
|||
short seqType; // this sector's sound sequence
|
||||
|
||||
int sky;
|
||||
FNameNoInit SeqName; // Sound sequence name. Setting seqType non-negative will override this.
|
||||
FName SeqName; // Sound sequence name. Setting seqType non-negative will override this.
|
||||
|
||||
DVector2 centerspot; // origin for any sounds played by the sector
|
||||
int validcount; // if == validcount, already checked
|
||||
|
@ -1047,7 +1047,7 @@ public:
|
|||
struct msecnode_t *touching_renderthings; // this is used to allow wide things to be rendered not only from their main sector.
|
||||
|
||||
double gravity; // [RH] Sector gravity (1.0 is normal)
|
||||
FNameNoInit damagetype; // [RH] Means-of-death for applied damage
|
||||
FName damagetype; // [RH] Means-of-death for applied damage
|
||||
int damageamount; // [RH] Damage to do while standing on floor
|
||||
short damageinterval; // Interval for damage application
|
||||
short leakydamage; // chance of leaking through radiation suit
|
||||
|
|
|
@ -314,7 +314,7 @@ void DSeqNode::Serialize(FSerializer &arc)
|
|||
{
|
||||
int seqOffset;
|
||||
unsigned int i;
|
||||
FName seqName;
|
||||
FName seqName = NAME_None;
|
||||
int delayTics = 0;
|
||||
FSoundID id;
|
||||
float volume;
|
||||
|
@ -571,8 +571,8 @@ void S_ParseSndSeq (int levellump)
|
|||
TArray<uint32_t> ScriptTemp;
|
||||
int lastlump, lump;
|
||||
char seqtype = ':';
|
||||
FName seqname;
|
||||
FName slot;
|
||||
FName seqname = NAME_None;
|
||||
FName slot = NAME_None;
|
||||
int stopsound;
|
||||
int delaybase;
|
||||
float volumebase;
|
||||
|
|
|
@ -211,7 +211,6 @@ FScanner &FScanner::operator=(const FScanner &other)
|
|||
TokenType = other.TokenType;
|
||||
Number = other.Number;
|
||||
Float = other.Float;
|
||||
Name = other.Name;
|
||||
Line = other.Line;
|
||||
End = other.End;
|
||||
Crossed = other.Crossed;
|
||||
|
@ -619,11 +618,7 @@ bool FScanner::GetToken ()
|
|||
{
|
||||
if (ScanString (true))
|
||||
{
|
||||
if (TokenType == TK_NameConst)
|
||||
{
|
||||
Name = FName(String);
|
||||
}
|
||||
else if (TokenType == TK_IntConst)
|
||||
if (TokenType == TK_IntConst)
|
||||
{
|
||||
char *stopper;
|
||||
// Check for unsigned
|
||||
|
|
|
@ -82,7 +82,6 @@ public:
|
|||
int TokenType;
|
||||
int Number;
|
||||
double Float;
|
||||
FName Name;
|
||||
int Line;
|
||||
bool End;
|
||||
bool Crossed;
|
||||
|
|
|
@ -2480,6 +2480,12 @@ FxExpression *FxAssign::Resolve(FCompileContext &ctx)
|
|||
delete this;
|
||||
return nullptr;
|
||||
}
|
||||
else if (Base->IsDynamicArray())
|
||||
{
|
||||
ScriptPosition.Message(MSG_ERROR, "Cannot assign dynamic arrays, use Copy() or Move() function instead");
|
||||
delete this;
|
||||
return nullptr;
|
||||
}
|
||||
if (!Base->IsVector() && Base->ValueType->isStruct())
|
||||
{
|
||||
ScriptPosition.Message(MSG_ERROR, "Struct assignment not implemented yet");
|
||||
|
@ -9330,10 +9336,8 @@ ExpEmit FxFlopFunctionCall::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxVectorBuiltin::FxVectorBuiltin(FxExpression *self, FName name)
|
||||
:FxExpression(EFX_VectorBuiltin, self->ScriptPosition)
|
||||
:FxExpression(EFX_VectorBuiltin, self->ScriptPosition), Function(name), Self(self)
|
||||
{
|
||||
Self = self;
|
||||
Function = name;
|
||||
}
|
||||
|
||||
FxVectorBuiltin::~FxVectorBuiltin()
|
||||
|
@ -11130,7 +11134,7 @@ ExpEmit FxRuntimeStateIndex::Emit(VMFunctionBuilder *build)
|
|||
FxMultiNameState::FxMultiNameState(const char *_statestring, const FScriptPosition &pos, PClassActor *checkclass)
|
||||
:FxExpression(EFX_MultiNameState, pos)
|
||||
{
|
||||
FName scopename;
|
||||
FName scopename = NAME_None;
|
||||
FString statestring = _statestring;
|
||||
int scopeindex = statestring.IndexOf("::");
|
||||
|
||||
|
@ -11139,10 +11143,6 @@ FxMultiNameState::FxMultiNameState(const char *_statestring, const FScriptPositi
|
|||
scopename = FName(statestring, scopeindex, false);
|
||||
statestring = statestring.Right(statestring.Len() - scopeindex - 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
scopename = NAME_None;
|
||||
}
|
||||
names = MakeStateNameList(statestring);
|
||||
names.Insert(0, scopename);
|
||||
scope = checkclass;
|
||||
|
|
|
@ -369,7 +369,7 @@ public:
|
|||
class FxIdentifier : public FxExpression
|
||||
{
|
||||
public:
|
||||
FName Identifier;
|
||||
FName Identifier = NAME_None;
|
||||
bool noglobal = false;
|
||||
|
||||
FxIdentifier(FName i, const FScriptPosition &p);
|
||||
|
|
|
@ -101,12 +101,11 @@ void ParseOldDecoration(FScanner &sc, EDefinitionType def, PNamespace *ns)
|
|||
FExtraInfo extra;
|
||||
PClassActor *type;
|
||||
PClassActor *parent;
|
||||
FName typeName;
|
||||
|
||||
parent = (def == DEF_Pickup) ? PClass::FindActor("FakeInventory") : RUNTIME_CLASS(AActor);
|
||||
|
||||
sc.MustGetString();
|
||||
typeName = FName(sc.String);
|
||||
FName typeName = FName(sc.String);
|
||||
type = DecoDerivedClass(FScriptPosition(sc), parent, typeName);
|
||||
ResetBaggage(&bag, parent);
|
||||
bag.Namespace = ns;
|
||||
|
|
|
@ -421,7 +421,7 @@ static FxExpression *ParseExpression0 (FScanner &sc, PClassActor *cls)
|
|||
}
|
||||
else if (sc.CheckToken(TK_NameConst))
|
||||
{
|
||||
return new FxConstant(sc.Name, scpos);
|
||||
return new FxConstant(FName(sc.String), scpos);
|
||||
}
|
||||
else if (sc.CheckToken(TK_StringConst))
|
||||
{
|
||||
|
|
|
@ -1029,9 +1029,7 @@ PClassActor *CreateNewActor(const FScriptPosition &sc, FName typeName, FName par
|
|||
//==========================================================================
|
||||
static PClassActor *ParseActorHeader(FScanner &sc, Baggage *bag)
|
||||
{
|
||||
FName typeName;
|
||||
FName parentName;
|
||||
FName replaceName;
|
||||
FName replaceName = NAME_None;
|
||||
bool native = false;
|
||||
int DoomEdNum = -1;
|
||||
|
||||
|
@ -1044,7 +1042,7 @@ static PClassActor *ParseActorHeader(FScanner &sc, Baggage *bag)
|
|||
*colon++ = 0;
|
||||
}
|
||||
|
||||
typeName = sc.String;
|
||||
FName typeName = sc.String;
|
||||
|
||||
// Do some tweaking so that a definition like 'Actor:Parent' which is read as a single token is recognized as well
|
||||
// without having resort to C-mode (which disallows periods in actor names.)
|
||||
|
@ -1071,7 +1069,7 @@ static PClassActor *ParseActorHeader(FScanner &sc, Baggage *bag)
|
|||
sc.UnGet();
|
||||
}
|
||||
|
||||
parentName = colon;
|
||||
FName parentName = colon;
|
||||
|
||||
// Check for "replaces"
|
||||
if (sc.CheckString ("replaces"))
|
||||
|
|
|
@ -318,6 +318,7 @@ static FFlagDef ActorFlagDefs[]=
|
|||
DEFINE_FLAG(MF8, FRIGHTENING, AActor, flags8),
|
||||
DEFINE_FLAG(MF8, BLOCKASPLAYER, AActor, flags8),
|
||||
DEFINE_FLAG(MF8, DONTFACETALKER, AActor, flags8),
|
||||
DEFINE_FLAG(MF8, HITOWNER, AActor, flags8),
|
||||
|
||||
// Effect flags
|
||||
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),
|
||||
|
|
|
@ -569,9 +569,8 @@ DEFINE_PROPERTY(painchance, ZI, Actor)
|
|||
}
|
||||
else
|
||||
{
|
||||
FName painType;
|
||||
if (!stricmp(str, "Normal")) painType = NAME_None;
|
||||
else painType=str;
|
||||
FName painType = NAME_None;
|
||||
if (stricmp(str, "Normal")) painType = str;
|
||||
|
||||
info->SetPainChance(painType, id);
|
||||
}
|
||||
|
@ -897,15 +896,14 @@ DEFINE_PROPERTY(damagefactor, ZF, Actor)
|
|||
PROP_STRING_PARM(str, 0);
|
||||
PROP_DOUBLE_PARM(id, 1);
|
||||
|
||||
if (str == NULL)
|
||||
if (str == nullptr)
|
||||
{
|
||||
defaults->DamageFactor = id;
|
||||
}
|
||||
else
|
||||
{
|
||||
FName dmgType;
|
||||
if (!stricmp(str, "Normal")) dmgType = NAME_None;
|
||||
else dmgType=str;
|
||||
FName dmgType = NAME_None;
|
||||
if (stricmp(str, "Normal")) dmgType = str;
|
||||
|
||||
info->SetDamageFactor(dmgType, id);
|
||||
}
|
||||
|
|
|
@ -1593,10 +1593,8 @@ PClassPointer *NewClassPointer(PClass *restrict)
|
|||
//==========================================================================
|
||||
|
||||
PEnum::PEnum(FName name, PTypeBase *outer)
|
||||
: PInt(4, false)
|
||||
: PInt(4, false), Outer(outer), EnumName(name)
|
||||
{
|
||||
EnumName = name;
|
||||
Outer = outer;
|
||||
Flags |= TYPE_IntNotInt;
|
||||
mDescriptiveName.Format("Enum<%s>", name.GetChars());
|
||||
}
|
||||
|
|
|
@ -238,10 +238,10 @@ protected:
|
|||
class PContainerType : public PCompoundType
|
||||
{
|
||||
public:
|
||||
PTypeBase *Outer; // object this type is contained within
|
||||
FName TypeName; // this type's name
|
||||
PTypeBase *Outer = nullptr; // object this type is contained within
|
||||
FName TypeName = NAME_None; // this type's name
|
||||
|
||||
PContainerType() : Outer(NULL)
|
||||
PContainerType()
|
||||
{
|
||||
mDescriptiveName = "ContainerType";
|
||||
Flags |= TYPE_Container;
|
||||
|
|
|
@ -390,6 +390,7 @@ struct_body(X) ::= struct_body(A) struct_member(B). { X = A; /*X-overwrites-A*/
|
|||
struct_member(X) ::= declarator(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= enum_def(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= const_def(A). { X = A; /*X-overwrites-A*/ }
|
||||
struct_member(X) ::= staticarray_statement(A). { X = A; /*X-overwrites-A*/ }
|
||||
|
||||
/*----- Constant Definition ------*/
|
||||
/* Like UnrealScript, a constant's type is implied by its value's type. */
|
||||
|
|
|
@ -274,7 +274,7 @@ static void ParseSingleFile(FScanner *pSC, const char *filename, int lump, void
|
|||
break;
|
||||
|
||||
case TK_NameConst:
|
||||
value.Int = sc.Name;
|
||||
value.Int = FName(sc.String).GetIndex();
|
||||
tokentype = ZCC_NAMECONST;
|
||||
break;
|
||||
|
||||
|
|
|
@ -2147,7 +2147,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FFont *&fon
|
|||
}
|
||||
else
|
||||
{
|
||||
FName n;
|
||||
FName n = NAME_None;
|
||||
arc(key, n);
|
||||
font = V_GetFont(n);
|
||||
if (font == nullptr)
|
||||
|
|
|
@ -789,6 +789,7 @@ void FTextureManager::ParseAnimatedDoor(FScanner &sc)
|
|||
|
||||
sc.MustGetString();
|
||||
anim.BaseTexture = CheckForTexture (sc.String, ETextureType::Wall, texflags);
|
||||
anim.OpenSound = anim.CloseSound = NAME_None;
|
||||
|
||||
if (!anim.BaseTexture.Exists())
|
||||
{
|
||||
|
|
|
@ -403,7 +403,7 @@ void CommitUMapinfo(level_info_t *defaultinfo)
|
|||
if (map.nextmap[0]) levelinfo->NextMap = map.nextmap;
|
||||
else if (map.endpic[0])
|
||||
{
|
||||
FName name;
|
||||
FName name = NAME_None;
|
||||
|
||||
if (!stricmp(map.endpic, "$CAST"))
|
||||
{
|
||||
|
|
|
@ -130,7 +130,7 @@ protected:
|
|||
uint8_t *PatchRemap;
|
||||
|
||||
int Lump;
|
||||
FName FontName;
|
||||
FName FontName = NAME_None;
|
||||
FFont *Next;
|
||||
|
||||
static FFont *FirstFont;
|
||||
|
|
|
@ -55,9 +55,9 @@ const char *GetVersionString();
|
|||
#define RC_FILEVERSION 3,5,9999,0
|
||||
#define RC_PRODUCTVERSION 3,5,9999,0
|
||||
#define RC_PRODUCTVERSION2 VERSIONSTR
|
||||
// These are for content versioning. The current state is '3.3'.
|
||||
// These are for content versioning. The current state is '3.5'.
|
||||
#define VER_MAJOR 3
|
||||
#define VER_MINOR 4
|
||||
#define VER_MINOR 5
|
||||
#define VER_REVISION 0
|
||||
|
||||
// Version identifier for network games.
|
||||
|
|
|
@ -454,7 +454,6 @@ namespace StringFormat
|
|||
inline FName::FName(const FString &text) { Index = NameData.FindName (text.GetChars(), text.Len(), false); }
|
||||
inline FName::FName(const FString &text, bool noCreate) { Index = NameData.FindName (text.GetChars(), text.Len(), noCreate); }
|
||||
inline FName &FName::operator = (const FString &text) { Index = NameData.FindName (text.GetChars(), text.Len(), false); return *this; }
|
||||
inline FName &FNameNoInit::operator = (const FString &text) { Index = NameData.FindName (text.GetChars(), text.Len(), false); return *this; }
|
||||
|
||||
// Hash FStrings on their contents. (used by TMap)
|
||||
extern unsigned int SuperFastHash (const char *data, size_t len);
|
||||
|
|
|
@ -2275,6 +2275,7 @@ VIDMNU_RESPRESET = "Choose Resolution Preset";
|
|||
VIDMNU_RESPRESETTTL = "Custom Resolution Presets";
|
||||
VIDMNU_RESPRESETHEAD = "Preset Resolution Modes";
|
||||
VIDMNU_ASPECT43 = "4:3 Aspect";
|
||||
VIDMNU_ASPECT54 = "5:4 Aspect";
|
||||
VIDMNU_ASPECT169 = "16:9 Aspect";
|
||||
VIDMNU_ASPECT1610 = "16:10 Aspect";
|
||||
|
||||
|
|
|
@ -1954,6 +1954,9 @@ OptionMenu CustomResolutionMenu protected
|
|||
Command "1280x960", "menu_resolution_set_custom 1280 960"
|
||||
Command "1600x1200", "menu_resolution_set_custom 1600 1200"
|
||||
StaticText ""
|
||||
StaticText "$VIDMNU_ASPECT54"
|
||||
Command "1280x1024", "menu_resolution_set_custom 1280 1024"
|
||||
StaticText ""
|
||||
StaticText "$VIDMNU_ASPECT169"
|
||||
Command "960x540", "menu_resolution_set_custom 960 540"
|
||||
Command "(720p HD) 1280x720", "menu_resolution_set_custom 1280 720"
|
||||
|
|
|
@ -407,11 +407,11 @@ class Actor : Thinker native
|
|||
// Functions
|
||||
|
||||
// 'parked' global functions.
|
||||
native static double deltaangle(double ang1, double ang2);
|
||||
native static double absangle(double ang1, double ang2);
|
||||
native static Vector2 AngleToVector(double angle, double length = 1);
|
||||
native static Vector2 RotateVector(Vector2 vec, double angle);
|
||||
native static double Normalize180(double ang);
|
||||
native clearscope static double deltaangle(double ang1, double ang2);
|
||||
native clearscope static double absangle(double ang1, double ang2);
|
||||
native clearscope static Vector2 AngleToVector(double angle, double length = 1);
|
||||
native clearscope static Vector2 RotateVector(Vector2 vec, double angle);
|
||||
native clearscope static double Normalize180(double ang);
|
||||
|
||||
|
||||
bool IsPointerEqual(int ptr_select1, int ptr_select2)
|
||||
|
@ -419,7 +419,7 @@ class Actor : Thinker native
|
|||
return GetPointer(ptr_select1) == GetPointer(ptr_select2);
|
||||
}
|
||||
|
||||
static double BobSin(double fb)
|
||||
clearscope static double BobSin(double fb)
|
||||
{
|
||||
return sin(fb * (180./32)) * 8;
|
||||
}
|
||||
|
@ -547,7 +547,7 @@ class Actor : Thinker native
|
|||
native static class<Actor> GetReplacement(class<Actor> cls);
|
||||
native static class<Actor> GetReplacee(class<Actor> cls);
|
||||
native static int GetSpriteIndex(name sprt);
|
||||
native static double GetDefaultSpeed(class<Actor> type);
|
||||
native clearscope static double GetDefaultSpeed(class<Actor> type);
|
||||
native static class<Actor> GetSpawnableType(int spawnnum);
|
||||
native static int ApplyDamageFactors(class<Inventory> itemcls, Name damagetype, int damage, int defdamage);
|
||||
native void RemoveFromHash();
|
||||
|
@ -667,7 +667,7 @@ class Actor : Thinker native
|
|||
native void RandomChaseDir();
|
||||
native bool CheckMissileRange();
|
||||
native bool SetState(state st, bool nofunction = false);
|
||||
native state FindState(statelabel st, bool exact = false);
|
||||
clearscope native state FindState(statelabel st, bool exact = false) const;
|
||||
bool SetStateLabel(statelabel st, bool nofunction = false) { return SetState(FindState(st), nofunction); }
|
||||
native action state ResolveState(statelabel st); // this one, unlike FindState, is context aware.
|
||||
native void LinkToWorld(LinkContext ctx = null);
|
||||
|
@ -689,7 +689,7 @@ class Actor : Thinker native
|
|||
native clearscope bool isFriend(Actor other) const;
|
||||
native clearscope bool isHostile(Actor other) const;
|
||||
native void AdjustFloorClip();
|
||||
native DropItem GetDropItems();
|
||||
native clearscope DropItem GetDropItems() const;
|
||||
native void CopyFriendliness (Actor other, bool changeTarget, bool resetHealth = true);
|
||||
native bool LookForMonsters();
|
||||
native bool LookForTid(bool allaround, LookExParams params = null);
|
||||
|
|
|
@ -668,6 +668,7 @@ struct LevelLocals native
|
|||
|
||||
native static clearscope vector2 Vec2Diff(vector2 v1, vector2 v2);
|
||||
native static clearscope vector3 Vec3Diff(vector3 v1, vector3 v2);
|
||||
native static clearscope vector3 SphericalCoords(vector3 viewpoint, vector3 targetPos, vector2 viewAngles = (0, 0), bool absolute = false);
|
||||
|
||||
native static clearscope vector2 Vec2Offset(vector2 pos, vector2 dir, bool absolute = false);
|
||||
native static clearscope vector3 Vec2OffsetZ(vector2 pos, vector2 dir, double atz, bool absolute = false);
|
||||
|
|
|
@ -285,6 +285,13 @@ struct ConsoleEvent native version("2.4")
|
|||
native readonly bool IsManual;
|
||||
}
|
||||
|
||||
struct ReplaceEvent native version("2.4")
|
||||
{
|
||||
native readonly Class<Actor> Replacee;
|
||||
native Class<Actor> Replacement;
|
||||
native bool IsFinal;
|
||||
}
|
||||
|
||||
class StaticEventHandler : Object native play version("2.4")
|
||||
{
|
||||
// static event handlers CAN register other static event handlers.
|
||||
|
@ -329,6 +336,9 @@ class StaticEventHandler : Object native play version("2.4")
|
|||
virtual native ui void ConsoleProcess(ConsoleEvent e);
|
||||
virtual native void NetworkProcess(ConsoleEvent e);
|
||||
|
||||
//
|
||||
virtual native void CheckReplacement(ReplaceEvent e);
|
||||
|
||||
// this value will be queried on Register() to decide the relative order of this handler to every other.
|
||||
// this is most useful in UI systems.
|
||||
// default is 0.
|
||||
|
|
Loading…
Reference in a new issue