diff --git a/src/common/engine/serializer.cpp b/src/common/engine/serializer.cpp index 1b56bba2c7b..505bd044db8 100644 --- a/src/common/engine/serializer.cpp +++ b/src/common/engine/serializer.cpp @@ -1051,8 +1051,8 @@ FSerializer &Serialize(FSerializer &arc, const char *key, double &value, double auto val = arc.r->FindKey(key); if (val != nullptr) { - assert(val->IsDouble()); - if (val->IsDouble()) + assert(val->IsNumber()); + if (val->IsNumber()) { value = val->GetDouble(); } diff --git a/src/common/filesystem/filesystem.cpp b/src/common/filesystem/filesystem.cpp index 5a709726f6f..47932334d8d 100644 --- a/src/common/filesystem/filesystem.cpp +++ b/src/common/filesystem/filesystem.cpp @@ -912,6 +912,12 @@ LumpShortName& FileSystem::GetShortName(int i) return FileInfo[i].shortName; } +FString& FileSystem::GetLongName(int i) +{ + if ((unsigned)i >= NumEntries) I_Error("GetLongName: Invalid index"); + return FileInfo[i].longName; +} + void FileSystem::RenameFile(int num, const char* newfn) { if ((unsigned)num >= NumEntries) I_Error("RenameFile: Invalid index"); diff --git a/src/common/filesystem/filesystem.h b/src/common/filesystem/filesystem.h index 89cc288d349..5924e86c158 100644 --- a/src/common/filesystem/filesystem.h +++ b/src/common/filesystem/filesystem.h @@ -117,6 +117,7 @@ class FileSystem } LumpShortName& GetShortName(int i); // may only be called before the hash chains are set up. + FString& GetLongName(int i); // may only be called before the hash chains are set up. void RenameFile(int num, const char* fn); bool CreatePathlessCopy(const char* name, int id, int flags); diff --git a/src/common/utility/i_time.cpp b/src/common/utility/i_time.cpp index 0a717966013..cc8f5f1de48 100644 --- a/src/common/utility/i_time.cpp +++ b/src/common/utility/i_time.cpp @@ -67,22 +67,14 @@ static uint64_t NSToMS(uint64_t ns) return static_cast(ns / 1'000'000); } -static int NSToTic(uint64_t ns) +static int NSToTic(uint64_t ns, double const ticrate) { - return static_cast(ns * GameTicRate / 1'000'000'000); + return static_cast(ns * ticrate / 1'000'000'000); } -static int NSToBuildTic(uint64_t ns) +static uint64_t TicToNS(double tic, double const ticrate) { - return static_cast(ns * 120 / 1'000'000'000); -} -static uint64_t TicToNS(int tic) -{ - return static_cast(tic) * 1'000'000'000 / GameTicRate; -} -static uint64_t BuildTicToNS(int tic) -{ - return static_cast(tic) * 1'000'000'000 / 120; + return static_cast(tic * 1'000'000'000 / ticrate); } void I_SetFrameTime() @@ -111,18 +103,18 @@ void I_WaitVBL(int count) I_SetFrameTime(); } -int I_WaitForTic(int prevtic) +int I_WaitForTic(int prevtic, double const ticrate) { // Waits until the current tic is greater than prevtic. Time must not be frozen. int time; - while ((time = I_GetTime()) <= prevtic) + while ((time = I_GetTime(ticrate)) <= prevtic) { // Windows-specific note: // The minimum amount of time a thread can sleep is controlled by timeBeginPeriod. // We set this to 1 ms in DoMain. - const uint64_t next = FirstFrameStartTime + TicToNS(prevtic + 1); + const uint64_t next = FirstFrameStartTime + TicToNS(prevtic + 1, ticrate); const uint64_t now = I_nsTime(); if (next > now) @@ -166,21 +158,16 @@ uint64_t I_GetTimeNS() return CurrentFrameStartTime - FirstFrameStartTime; } -int I_GetTime() -{ - return NSToTic(CurrentFrameStartTime - FirstFrameStartTime); -} - -int I_GetBuildTime() +int I_GetTime(double const ticrate) { - return NSToBuildTic(CurrentFrameStartTime - FirstFrameStartTime); + return NSToTic(CurrentFrameStartTime - FirstFrameStartTime, ticrate); } -double I_GetTimeFrac() +double I_GetTimeFrac(double const ticrate) { - int currentTic = NSToTic(CurrentFrameStartTime - FirstFrameStartTime); - uint64_t ticStartTime = FirstFrameStartTime + TicToNS(currentTic); - uint64_t ticNextTime = FirstFrameStartTime + TicToNS(currentTic + 1); + int currentTic = NSToTic(CurrentFrameStartTime - FirstFrameStartTime, ticrate); + uint64_t ticStartTime = FirstFrameStartTime + TicToNS(currentTic, ticrate); + uint64_t ticNextTime = FirstFrameStartTime + TicToNS(currentTic + 1, ticrate); return (CurrentFrameStartTime - ticStartTime) / (double)(ticNextTime - ticStartTime); } diff --git a/src/common/utility/i_time.h b/src/common/utility/i_time.h index 8b4eff05c38..27ebdae2aa9 100644 --- a/src/common/utility/i_time.h +++ b/src/common/utility/i_time.h @@ -9,17 +9,14 @@ extern double TimeScale; void I_SetFrameTime(); // Called by D_DoomLoop, returns current time in tics. -int I_GetTime(); +int I_GetTime(double const ticrate = GameTicRate); // same, but using nanoseconds uint64_t I_GetTimeNS(); -// Called by Build games in lieu of totalclock, returns current time in tics at ticrate of 120. -int I_GetBuildTime(); - -double I_GetTimeFrac(); +double I_GetTimeFrac(double const ticrate = GameTicRate); // like I_GetTime, except it waits for a new tic before returning -int I_WaitForTic(int); +int I_WaitForTic(int prevtic, double const ticrate = GameTicRate); // Freezes tic counting temporarily. While frozen, calls to I_GetTime() // will always return the same value. diff --git a/src/common/utility/tarray.h b/src/common/utility/tarray.h index 635f1cc7506..4a9e7388b74 100644 --- a/src/common/utility/tarray.h +++ b/src/common/utility/tarray.h @@ -292,6 +292,17 @@ class TArray return i; } + bool Contains(const T& item) const + { + unsigned int i; + for(i = 0;i < Count;++i) + { + if(Array[i] == item) + return true; + } + return false; + } + template unsigned int FindEx(Func compare) const { @@ -826,6 +837,18 @@ class TMap CopyNodes(o.Nodes, o.Size); } + TMap(TMap &&o) + { + Nodes = o.Nodes; + LastFree = o.LastFree; /* any free position is before this position */ + Size = o.Size; /* must be a power of 2 */ + NumUsed = o.NumUsed; + + o.Size = 0; + o.NumUsed = 0; + o.SetNodeVector(1); + } + TMap &operator= (const TMap &o) { NumUsed = 0; @@ -835,6 +858,12 @@ class TMap return *this; } + TMap &operator= (TMap &&o) + { + TransferFrom(o); + return *this; + } + //======================================================================= // // TransferFrom