Browse Source

Deterministic timer simulation for shrine messages in demo mode (#6516)

pull/6529/head
Stephen C. Wills 3 years ago committed by GitHub
parent
commit
5e778431c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      Source/CMakeLists.txt
  2. 19
      Source/engine/demomode.cpp
  3. 6
      Source/engine/demomode.h
  4. 5
      Source/error.cpp
  5. 5
      Source/minitext.cpp
  6. 10
      Source/utils/timer.cpp
  7. 7
      Source/utils/timer.hpp

1
Source/CMakeLists.txt

@ -166,6 +166,7 @@ set(libdevilutionx_SRCS
utils/str_cat.cpp utils/str_cat.cpp
utils/str_case.cpp utils/str_case.cpp
utils/surface_to_clx.cpp utils/surface_to_clx.cpp
utils/timer.cpp
utils/utf8.cpp) utils/utf8.cpp)
if(SUPPORTS_MPQ) if(SUPPORTS_MPQ)

19
Source/engine/demomode.cpp

@ -715,6 +715,9 @@ bool FetchMessage(SDL_Event *event, uint16_t *modState)
void RecordGameLoopResult(bool runGameLoop) void RecordGameLoopResult(bool runGameLoop)
{ {
WriteDemoMsgHeader(runGameLoop ? DemoMsg::GameTick : DemoMsg::Rendering); WriteDemoMsgHeader(runGameLoop ? DemoMsg::GameTick : DemoMsg::Rendering);
if (runGameLoop && !IsRunning())
LogicTick++;
} }
void RecordMessage(const SDL_Event &event, uint16_t modState) void RecordMessage(const SDL_Event &event, uint16_t modState)
@ -790,6 +793,12 @@ void RecordMessage(const SDL_Event &event, uint16_t modState)
void NotifyGameLoopStart() void NotifyGameLoopStart()
{ {
LogicTick = 0;
if (IsRunning()) {
StartTime = SDL_GetTicks();
}
if (IsRecording()) { if (IsRecording()) {
const std::string path = StrCat(paths::PrefPath(), "demo_", RecordNumber, ".dmo"); const std::string path = StrCat(paths::PrefPath(), "demo_", RecordNumber, ".dmo");
DemoRecording = OpenFile(path.c_str(), "wb"); DemoRecording = OpenFile(path.c_str(), "wb");
@ -803,11 +812,6 @@ void NotifyGameLoopStart()
WriteLE32(DemoRecording, gSaveNumber); WriteLE32(DemoRecording, gSaveNumber);
WriteSettings(DemoRecording); WriteSettings(DemoRecording);
} }
if (IsRunning()) {
StartTime = SDL_GetTicks();
LogicTick = 0;
}
} }
void NotifyGameLoopEnd() void NotifyGameLoopEnd()
@ -843,6 +847,11 @@ void NotifyGameLoopEnd()
} }
} }
uint32_t SimulateMillisecondsSinceStartup()
{
return LogicTick * 50;
}
} // namespace demo } // namespace demo
} // namespace devilution } // namespace devilution

6
Source/engine/demomode.h

@ -28,6 +28,8 @@ void RecordMessage(const SDL_Event &event, uint16_t modState);
void NotifyGameLoopStart(); void NotifyGameLoopStart();
void NotifyGameLoopEnd(); void NotifyGameLoopEnd();
uint32_t SimulateMillisecondsSinceStartup();
#else #else
inline void OverrideOptions() inline void OverrideOptions()
{ {
@ -60,6 +62,10 @@ inline void NotifyGameLoopStart()
inline void NotifyGameLoopEnd() inline void NotifyGameLoopEnd()
{ {
} }
inline uint32_t SimulateMillisecondsSinceStartup()
{
return 0;
}
#endif #endif
} // namespace demo } // namespace demo

5
Source/error.cpp

@ -16,6 +16,7 @@
#include "stores.h" #include "stores.h"
#include "utils/algorithm/container.hpp" #include "utils/algorithm/container.hpp"
#include "utils/language.h" #include "utils/language.h"
#include "utils/timer.hpp"
namespace devilution { namespace devilution {
@ -30,7 +31,7 @@ const int LineWidth = 418;
void InitNextLines() void InitNextLines()
{ {
msgdelay = SDL_GetTicks(); msgdelay = GetMillisecondsSinceStartup();
TextLines.clear(); TextLines.clear();
const std::string paragraphs = WordWrapString(DiabloMessages.front(), LineWidth, GameFont12, 1); const std::string paragraphs = WordWrapString(DiabloMessages.front(), LineWidth, GameFont12, 1);
@ -172,7 +173,7 @@ void DrawDiabloMsg(const Surface &out)
lineNumber += 1; lineNumber += 1;
} }
if (msgdelay > 0 && msgdelay <= SDL_GetTicks() - 3500) { if (msgdelay > 0 && msgdelay <= GetMillisecondsSinceStartup() - 3500) {
msgdelay = 0; msgdelay = 0;
} }
if (msgdelay == 0) { if (msgdelay == 0) {

5
Source/minitext.cpp

@ -20,6 +20,7 @@
#include "playerdat.hpp" #include "playerdat.hpp"
#include "textdat.h" #include "textdat.h"
#include "utils/language.h" #include "utils/language.h"
#include "utils/timer.hpp"
namespace devilution { namespace devilution {
@ -81,7 +82,7 @@ uint32_t CalculateTextSpeed(int nSFX)
int CalculateTextPosition() int CalculateTextPosition()
{ {
uint32_t currTime = SDL_GetTicks(); uint32_t currTime = GetMillisecondsSinceStartup();
int y = (currTime - ScrollStart) / qtextSpd - 260; int y = (currTime - ScrollStart) / qtextSpd - 260;
@ -165,7 +166,7 @@ void InitQTextMsg(_speech_id m)
LoadText(_(Speeches[m].txtstr)); LoadText(_(Speeches[m].txtstr));
qtextflag = true; qtextflag = true;
qtextSpd = CalculateTextSpeed(sfxnr); qtextSpd = CalculateTextSpeed(sfxnr);
ScrollStart = SDL_GetTicks(); ScrollStart = GetMillisecondsSinceStartup();
} }
PlaySFX(sfxnr); PlaySFX(sfxnr);
} }

10
Source/utils/timer.cpp

@ -0,0 +1,10 @@
#include "engine/demomode.h"
namespace devilution {
uint32_t GetMillisecondsSinceStartup()
{
return (demo::IsRunning() || demo::IsRecording()) ? demo::SimulateMillisecondsSinceStartup() : SDL_GetTicks();
}
} // namespace devilution

7
Source/utils/timer.hpp

@ -0,0 +1,7 @@
#pragma once
namespace devilution {
uint32_t GetMillisecondsSinceStartup();
}
Loading…
Cancel
Save