This commit is contained in:
Rachael Alexanderson 2017-01-31 23:04:56 -05:00
commit 4e45ea2300
19 changed files with 107 additions and 123 deletions

View file

@ -1617,8 +1617,16 @@ void C_ArchiveCVars (FConfigFile *f, uint32 filter)
} }
} }
EXTERN_CVAR(Bool, sv_cheats);
void FBaseCVar::CmdSet (const char *newval) void FBaseCVar::CmdSet (const char *newval)
{ {
if ((GetFlags() & CVAR_CHEAT) && !sv_cheats)
{
Printf("sv_cheats must be true to set this console variable.\n");
return;
}
UCVarValue val; UCVarValue val;
// Casting away the const is safe in this case. // Casting away the const is safe in this case.

View file

@ -63,6 +63,7 @@ enum
CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame CVAR_NOSAVE = 4096, // when used with CVAR_SERVERINFO, do not save var to savegame
CVAR_MOD = 8192, // cvar was defined by a mod CVAR_MOD = 8192, // cvar was defined by a mod
CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar) CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
CVAR_CHEAT = 32768,// can be set only when sv_cheats is enabled
}; };
union UCVarValue union UCVarValue

View file

@ -1395,6 +1395,10 @@ void ParseCVarInfo()
{ {
cvarflags &= ~CVAR_ARCHIVE; cvarflags &= ~CVAR_ARCHIVE;
} }
else if (stricmp(sc.String, "cheat") == 0)
{
cvarflags |= CVAR_CHEAT;
}
else else
{ {
sc.ScriptError("Unknown cvar attribute '%s'", sc.String); sc.ScriptError("Unknown cvar attribute '%s'", sc.String);
@ -2704,6 +2708,7 @@ void D_DoomMain (void)
S_Shutdown(); // free all channels and delete playlist S_Shutdown(); // free all channels and delete playlist
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
FS_Close(); // destroy the global FraggleScript.
GC::FullGC(); // clean up before taking down the object list. GC::FullGC(); // clean up before taking down the object list.

View file

@ -69,6 +69,7 @@ FNamespaceManager Namespaces;
FTypeTable TypeTable; FTypeTable TypeTable;
TArray<PClass *> PClass::AllClasses; TArray<PClass *> PClass::AllClasses;
TArray<VMFunction**> PClass::FunctionPtrList;
bool PClass::bShutdown; bool PClass::bShutdown;
bool PClass::bVMOperational; bool PClass::bVMOperational;
@ -2840,6 +2841,12 @@ void PClass::StaticShutdown ()
TArray<size_t *> uniqueFPs(64); TArray<size_t *> uniqueFPs(64);
unsigned int i, j; unsigned int i, j;
// delete all variables containing pointers to script functions.
for (auto p : FunctionPtrList)
{
*p = nullptr;
}
FunctionPtrList.Clear();
// Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down. // Make a full garbage collection here so that all destroyed but uncollected higher level objects that still exist can be properly taken down.
GC::FullGC(); GC::FullGC();
@ -3547,6 +3554,16 @@ VMFunction *PClass::FindFunction(FName clsname, FName funcname)
return func->Variants[0].Implementation; return func->Variants[0].Implementation;
} }
void PClass::FindFunction(VMFunction **pptr, FName clsname, FName funcname)
{
auto cls = PClass::FindActor(clsname);
if (!cls) return;
auto func = dyn_cast<PFunction>(cls->Symbols.FindSymbol(funcname, true));
if (!func) return;
*pptr = func->Variants[0].Implementation;
FunctionPtrList.Push(pptr);
}
/* FTypeTable **************************************************************/ /* FTypeTable **************************************************************/

View file

@ -848,9 +848,11 @@ public:
static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); } static PClassActor *FindActor(ENamedName name) { return FindActor(FName(name)); }
static PClassActor *FindActor(FName name); static PClassActor *FindActor(FName name);
static VMFunction *FindFunction(FName cls, FName func); static VMFunction *FindFunction(FName cls, FName func);
static void FindFunction(VMFunction **pptr, FName cls, FName func);
PClass *FindClassTentative(FName name); PClass *FindClassTentative(FName name);
static TArray<PClass *> AllClasses; static TArray<PClass *> AllClasses;
static TArray<VMFunction**> FunctionPtrList;
static bool bShutdown; static bool bShutdown;
static bool bVMOperational; static bool bVMOperational;

View file

@ -522,7 +522,7 @@ DEFINE_ACTION_FUNCTION(AInventory, DoRespawn)
bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return) bool AInventory::CallTryPickup(AActor *toucher, AActor **toucher_return)
{ {
static VMFunction *func = nullptr; static VMFunction *func = nullptr;
if (func == nullptr) func = PClass::FindFunction(NAME_Inventory, NAME_CallTryPickup); if (func == nullptr) PClass::FindFunction(&func, NAME_Inventory, NAME_CallTryPickup);
VMValue params[2] = { (DObject*)this, toucher }; VMValue params[2] = { (DObject*)this, toucher };
VMReturn ret[2]; VMReturn ret[2];
int res; int res;

View file

@ -1437,7 +1437,7 @@ class CommandDrawNumber : public CommandDrawString
{ {
// num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1; // num = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem) / TICRATE + 1;
static VMFunction *func = nullptr; static VMFunction *func = nullptr;
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem"); if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
VMValue params[] = { statusBar->CPlayer->mo, inventoryItem }; VMValue params[] = { statusBar->CPlayer->mo, inventoryItem };
int retv; int retv;
VMReturn ret(&retv); VMReturn ret(&retv);
@ -2830,7 +2830,7 @@ class CommandDrawBar : public SBarInfoCommand
// [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem); // [value, max] = statusBar.CPlayer.mo.GetEffectTicsForItem(inventoryItem);
// value++; max++; // value++; max++;
static VMFunction *func = nullptr; static VMFunction *func = nullptr;
if (func == nullptr) func = PClass::FindFunction(NAME_PlayerPawn, "GetEffectTicsForItem"); if (func == nullptr) PClass::FindFunction(&func, NAME_PlayerPawn, "GetEffectTicsForItem");
VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem }; VMValue params[] = { statusBar->CPlayer->mo, data.inventoryItem };
VMReturn ret[2]; VMReturn ret[2];
int ival; int ival;

View file

@ -40,6 +40,8 @@
#include <intrin.h> #include <intrin.h>
#define USE_WINDOWS_DWORD #define USE_WINDOWS_DWORD
#elif defined __APPLE__
#include <sys/sysctl.h>
#endif #endif
#include "i_system.h" #include "i_system.h"
@ -114,6 +116,15 @@ void gl_CalculateCPUSpeed ()
gl_SecondsPerCycle = 1.0 / CyclesPerSecond; gl_SecondsPerCycle = 1.0 / CyclesPerSecond;
gl_MillisecPerCycle = 1000.0 / CyclesPerSecond; gl_MillisecPerCycle = 1000.0 / CyclesPerSecond;
} }
#elif defined __APPLE__
long long frequency;
size_t size = sizeof frequency;
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
{
gl_SecondsPerCycle = 1.0 / frequency;
gl_MillisecPerCycle = 1000.0 / frequency;
}
#endif #endif
} }

View file

@ -7,11 +7,11 @@
extern bool gl_benching; extern bool gl_benching;
#ifdef _MSC_VER
extern double gl_SecondsPerCycle; extern double gl_SecondsPerCycle;
extern double gl_MillisecPerCycle; extern double gl_MillisecPerCycle;
#ifdef _MSC_VER
__forceinline long long GetClockCycle () __forceinline long long GetClockCycle ()
{ {
#if _M_X64 #if _M_X64
@ -21,10 +21,14 @@ __forceinline long long GetClockCycle ()
#endif #endif
} }
#elif defined(__GNUG__) && defined(__i386__) #elif defined __APPLE__ && (defined __i386__ || defined __x86_64__)
extern double gl_SecondsPerCycle; inline long long GetClockCycle()
extern double gl_MillisecPerCycle; {
return __builtin_ia32_rdtsc();
}
#elif defined(__GNUG__) && defined(__i386__)
inline long long GetClockCycle() inline long long GetClockCycle()
{ {
@ -42,21 +46,12 @@ inline long long GetClockCycle()
#else #else
extern double gl_SecondsPerCycle;
extern double gl_MillisecPerCycle;
inline long long GetClockCycle () inline long long GetClockCycle ()
{ {
return 0; return 0;
} }
#endif #endif
#if defined (__APPLE__)
typedef cycle_t glcycle_t;
#else // !__APPLE__
class glcycle_t class glcycle_t
{ {
public: public:
@ -100,8 +95,6 @@ private:
long long Counter; long long Counter;
}; };
#endif // __APPLE__
extern glcycle_t RenderWall,SetupWall,ClipWall; extern glcycle_t RenderWall,SetupWall,ClipWall;
extern glcycle_t RenderFlat,SetupFlat; extern glcycle_t RenderFlat,SetupFlat;
extern glcycle_t RenderSprite,SetupSprite; extern glcycle_t RenderSprite,SetupSprite;

View file

@ -478,7 +478,7 @@ void cht_DoCheat (player_t *player, int cheat)
if (player->mo != NULL && player->health >= 0) if (player->mo != NULL && player->health >= 0)
{ {
static VMFunction *gsp = nullptr; static VMFunction *gsp = nullptr;
if (gsp == nullptr) gsp = PClass::FindFunction(NAME_Sigil, NAME_GiveSigilPiece); if (gsp == nullptr) PClass::FindFunction(&gsp, NAME_Sigil, NAME_GiveSigilPiece);
if (gsp) if (gsp)
{ {
VMValue params[1] = { player->mo }; VMValue params[1] = { player->mo };

View file

@ -6203,7 +6203,7 @@ static bool CharArrayParms(int &capacity, int &offset, int &a, int *Stack, int &
static void SetMarineWeapon(AActor *marine, int weapon) static void SetMarineWeapon(AActor *marine, int weapon)
{ {
static VMFunction *smw = nullptr; static VMFunction *smw = nullptr;
if (smw == nullptr) smw = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetWeapon); if (smw == nullptr) PClass::FindFunction(&smw, NAME_ScriptedMarine, NAME_SetWeapon);
if (smw) if (smw)
{ {
VMValue params[2] = { marine, weapon }; VMValue params[2] = { marine, weapon };
@ -6214,7 +6214,7 @@ static void SetMarineWeapon(AActor *marine, int weapon)
static void SetMarineSprite(AActor *marine, PClassActor *source) static void SetMarineSprite(AActor *marine, PClassActor *source)
{ {
static VMFunction *sms = nullptr; static VMFunction *sms = nullptr;
if (sms == nullptr) sms = PClass::FindFunction(NAME_ScriptedMarine, NAME_SetSprite); if (sms == nullptr) PClass::FindFunction(&sms, NAME_ScriptedMarine, NAME_SetSprite);
if (sms) if (sms)
{ {
VMValue params[2] = { marine, source }; VMValue params[2] = { marine, source };

View file

@ -2049,7 +2049,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
} }
} }
if (self->target) if (self->target && self->SeeState)
{ {
self->SetState (self->SeeState); self->SetState (self->SeeState);
} }

View file

@ -3423,6 +3423,17 @@ extern polyblock_t **PolyBlockMap;
void P_FreeLevelData () void P_FreeLevelData ()
{ {
MapThingsConverted.Clear();
MapThingsUserDataIndex.Clear();
MapThingsUserData.Clear();
linemap.Clear();
FCanvasTextureInfo::EmptyList();
R_FreePastViewers();
P_ClearUDMFKeys();
// [RH] Clear all ThingID hash chains.
AActor::ClearTIDHashes();
P_FreeMapDataBackup(); P_FreeMapDataBackup();
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
Renderer->CleanLevelData(); Renderer->CleanLevelData();
@ -3575,14 +3586,6 @@ void P_SetupLevel (const char *lumpname, int position)
level.maptype = MAPTYPE_UNKNOWN; level.maptype = MAPTYPE_UNKNOWN;
wminfo.partime = 180; wminfo.partime = 180;
MapThingsConverted.Clear();
MapThingsUserDataIndex.Clear();
MapThingsUserData.Clear();
linemap.Clear();
FCanvasTextureInfo::EmptyList ();
R_FreePastViewers ();
P_ClearUDMFKeys();
if (!savegamerestore) if (!savegamerestore)
{ {
for (i = 0; i < MAXPLAYERS; ++i) for (i = 0; i < MAXPLAYERS; ++i)
@ -3612,8 +3615,6 @@ void P_SetupLevel (const char *lumpname, int position)
// Make sure all sounds are stopped before Z_FreeTags. // Make sure all sounds are stopped before Z_FreeTags.
S_Start (); S_Start ();
// [RH] Clear all ThingID hash chains.
AActor::ClearTIDHashes ();
// [RH] clear out the mid-screen message // [RH] clear out the mid-screen message
C_MidPrint (NULL, NULL); C_MidPrint (NULL, NULL);

View file

@ -36,6 +36,7 @@
#include <fnmatch.h> #include <fnmatch.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/sysctl.h>
#include "d_ticcmd.h" #include "d_ticcmd.h"
#include "doomdef.h" #include "doomdef.h"
@ -98,9 +99,29 @@ void SetLanguageIDs()
void I_InitTimer(); void I_InitTimer();
void I_ShutdownTimer(); void I_ShutdownTimer();
double PerfToSec, PerfToMillisec;
static void CalculateCPUSpeed()
{
long long frequency;
size_t size = sizeof frequency;
if (0 == sysctlbyname("machdep.tsc.frequency", &frequency, &size, nullptr, 0) && 0 != frequency)
{
PerfToSec = 1.0 / frequency;
PerfToMillisec = 1000.0 / frequency;
if (!batchrun)
{
Printf("CPU speed: %.0f MHz\n", 0.001 / PerfToMillisec);
}
}
}
void I_Init(void) void I_Init(void)
{ {
CheckCPUID(&CPU); CheckCPUID(&CPU);
CalculateCPUSpeed();
DumpCPUInfo(&CPU); DumpCPUInfo(&CPU);
atterm(I_ShutdownSound); atterm(I_ShutdownSound);

View file

@ -546,6 +546,9 @@ CocoaVideo::CocoaVideo()
{ {
memset(&m_modeIterator, 0, sizeof m_modeIterator); memset(&m_modeIterator, 0, sizeof m_modeIterator);
extern void gl_CalculateCPUSpeed();
gl_CalculateCPUSpeed();
// Create OpenGL pixel format // Create OpenGL pixel format
NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core); NSOpenGLPixelFormat* pixelFormat = CreatePixelFormat(OpenGLProfile::Core);

View file

@ -42,15 +42,6 @@
#include "m_swap.h" #include "m_swap.h"
#include "sbar.h" #include "sbar.h"
#if defined (__APPLE__)
mach_timebase_info_data_t cycle_t::s_info;
bool cycle_t::s_initialized;
#endif // __APPLE__
FStat *FStat::FirstStat; FStat *FStat::FirstStat;
FStat::FStat (const char *name) FStat::FStat (const char *name)

View file

@ -36,78 +36,7 @@
#include "zstring.h" #include "zstring.h"
#ifndef _WIN32 #if !defined _WIN32 && !defined __APPLE__
#if defined (__APPLE__)
#include <mach/mach_time.h>
class cycle_t
{
public:
cycle_t()
{
if ( !s_initialized )
{
mach_timebase_info( &s_info );
s_initialized = true;
}
Reset();
}
cycle_t &operator=( const cycle_t &other )
{
if ( &other != this )
{
m_seconds = other.m_seconds;
}
return *this;
}
void Reset()
{
m_seconds = 0;
}
void Clock()
{
m_seconds -= Nanoseconds() * 1e-9;
}
void Unclock()
{
m_seconds += Nanoseconds() * 1e-9;
}
double Time()
{
return m_seconds;
}
double TimeMS()
{
return m_seconds * 1e3;
}
private:
double m_seconds;
static mach_timebase_info_data_t s_info;
static bool s_initialized;
uint64_t Nanoseconds() const
{
return mach_absolute_time() * s_info.numer / s_info.denom;
}
};
#else // !__APPLE__
#ifdef NO_CLOCK_GETTIME #ifdef NO_CLOCK_GETTIME
class cycle_t class cycle_t
@ -171,11 +100,9 @@ private:
#endif #endif
#endif // __APPLE__
#else #else
// Windows // Windows and macOS
#include "x86.h" #include "x86.h"
extern double PerfToSec, PerfToMillisec; extern double PerfToSec, PerfToMillisec;
@ -199,15 +126,19 @@ inline unsigned __int64 rdtsc()
#else #else
inline unsigned long long rdtsc() inline unsigned long long rdtsc()
{ {
#ifndef __amd64__ #ifdef __amd64__
unsigned long long tsc;
asm volatile ("rdtsc; shlq $32, %%rdx; orq %%rdx, %%rax" : "=a" (tsc) :: "%rdx");
return tsc;
#else // i386
if (CPU.bRDTSC) if (CPU.bRDTSC)
#endif
{ {
register unsigned long long tsc; unsigned long long tsc;
asm volatile ("\trdtsc\n" : "=A" (tsc)); asm volatile ("\trdtsc\n" : "=A" (tsc));
return tsc; return tsc;
} }
return 0; return 0;
#endif // __amd64__
} }
#endif #endif

View file

@ -287,7 +287,7 @@ class PathFollower : Actor
if (Interpolate ()) if (Interpolate ())
{ {
Time += (8. / (CurrNode.args[1] * TICRATE)); Time += (8. / (max(1, CurrNode.args[1]) * TICRATE));
if (Time > 1.) if (Time > 1.)
{ {
Time -= 1.; Time -= 1.;

View file

@ -1345,7 +1345,7 @@ flickerlight2 FIREBULL
attenuate 1 attenuate 1
color 1.0 0.7 0.0 color 1.0 0.7 0.0
size 96 size 96
secondarysize - 105 secondarysize 130
interval 0.1 interval 0.1
offset 0 40 0 offset 0 40 0
} }