OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
gothic.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <memory>
5#include <thread>
6
7#include <Tempest/Signal>
8#include <Tempest/Dir>
9
10#include <zenkit/DaedalusVm.hh>
11
12#include "game/gamesession.h"
13#include "world/world.h"
14#include "ui/documentmenu.h"
15#include "ui/chapterscreen.h"
16#include "utils/versioninfo.h"
17#include "sound/soundfx.h"
18
19class VersionInfo;
25class FightAi;
26class IniFile;
27
28class Gothic final {
29 public:
30 Gothic();
31 ~Gothic();
32
33 static Gothic& inst();
34
35 enum class LoadState:int {
36 Idle = 0,
37 Loading = 1,
38 Saving = 2,
39 Finalize = 3,
40 FailedLoad = 4,
41 FailedSave = 5
42 };
43
44 struct Options {
45 bool doRayQuery = false;
46 bool doRtGi = false;
47 bool doMeshShading = false;
48 bool doBindless = false;
49 bool doVirtualShadow = false;
50 bool doSoftwareShadow = false;
51 bool doSoftwareRT = false;
52 uint32_t swRenderingPreset = 0;
53
54 uint32_t aaPreset = 0;
55
56 bool hideFocus = false;
57 float cameraFov = 67.5f;
58 int fpsLimit = 0;
59 float interfaceScale = 1;
61
62 Tempest::Size newChapterSize = {800, 600};
63
64 Tempest::Size saveGameImageSize = {0, 0};
65
66 bool showHealthBar = true;
67 uint8_t showManaBar = 2;
68 uint8_t showSwimBar = 1;
69 };
70
71 auto version() const -> const VersionInfo&;
72
73 bool isInGame() const;
74 bool isInGameAndAlive() const;
75
76 std::string_view defaultWorld() const;
77 std::string_view defaultPlayer() const;
78 std::string_view defaultSave() const;
79 std::string_view defaultGameDatFile() const;
80 std::string_view defaultOutputUnits() const;
81
82 std::string_view menuMain() const;
83
84 void setGame(std::unique_ptr<GameSession> &&w);
85 auto clearGame() -> std::unique_ptr<GameSession>;
86
87 auto gameSession() const -> const GameSession*;
88 auto gameSession() -> GameSession*;
89 const World* world() const;
90 World* world();
91 WorldView* worldView() const;
92 Npc* player();
93 Camera* camera();
94 auto questLog() const -> const QuestLog*;
95
96 void setupGlobalScripts();
97
98 auto loadingBanner() const -> const Tempest::Texture2d*;
99 int loadingProgress() const;
100 void setLoadingProgress(int v);
101
102 SoundFx* loadSoundFx (std::string_view name);
103 SoundFx* loadSoundWavFx(std::string_view name);
104
105 auto loadParticleFx(std::string_view name, bool relaxed=false) -> const ParticleFx*;
106 auto loadParticleFx(const ParticleFx* base, const VisualFx::Key* key) -> const ParticleFx*;
107 auto loadVisualFx (std::string_view name) -> const VisualFx*;
108
109 void emitGlobalSound(std::string_view sfx);
110 void emitGlobalSound(const SoundFx* sfx);
111 void emitGlobalSound(const Tempest::Sound& sfx);
112
113 void emitGlobalSoundWav(std::string_view wav);
114
115 static auto invCatOrder() -> const std::vector<ItmFlags>&;
116
117 void pushPause();
118 void popPause();
119 bool isPause() const;
120
121 bool isMarvinEnabled() const;
122 void setMarvinEnabled(bool m);
123
124 static auto options() -> const Options&;
125 static float interfaceScale(const Tempest::Widget* w);
126
127 bool isGodMode() const { return godMode; }
128 void setGodMode(bool g) { godMode = g; }
129
130 void toggleDesktop() { desktop = !desktop; }
131 bool isDesktop() { return desktop; }
132
133 bool doFrate() const { return showFpsCounter; }
134 void setFRate(bool f) { showFpsCounter = f; }
135
136 bool doClock() const { return showTime; }
137 void setClock(bool t) { showTime = t; }
138
139 bool isBenchmarkMode() const;
140 bool isBenchmarkModeCi() const;
142
143 Tempest::Signal<void()> toggleGi, toggleVsm, toggleRtsm;
144
145 LoadState checkLoading() const;
146 bool finishLoading();
147 void startLoad(std::string_view banner, const std::function<std::unique_ptr<GameSession>(std::unique_ptr<GameSession>&&)> f);
148 void startSave(Tempest::Texture2d&& tex, const std::function<std::unique_ptr<GameSession>(std::unique_ptr<GameSession>&&)> f);
149 void cancelLoading();
150
151 void tick(uint64_t dt);
152
153 void updateAnimation(uint64_t dt);
154 void quickSave();
155 void quickLoad();
156 void save(std::string_view slot, std::string_view usrName);
157 void load(std::string_view slot);
158
159 auto updateDialog(const GameScript::DlgChoice& dlg, Npc& player, Npc& npc) -> std::vector<GameScript::DlgChoice>;
160 void dialogExec (const GameScript::DlgChoice& dlg, Npc& player, Npc& npc);
161
162 void openDialogPipe (Npc& player, Npc& npc, AiOuputPipe*& pipe);
163 bool isNpcInDialog(const Npc& npc) const;
164 bool isInDialog() const;
165
166 Tempest::Signal<void(std::string_view)> onStartGame;
167 Tempest::Signal<void(std::string_view)> onLoadGame;
168 Tempest::Signal<void(std::string_view,std::string_view)> onSaveGame;
169
170 Tempest::Signal<void(Npc&,Npc&,AiOuputPipe*&)> onDialogPipe;
171 std::function<bool(const Npc*)> isNpcInDialogFn;
172
173 Tempest::Signal<void(std::string_view,int,int,int,const GthFont&)> onPrintScreen;
174 Tempest::Signal<void(std::string_view)> onPrint;
175 Tempest::Signal<void(std::string_view)> onVideo;
176
177 Tempest::Signal<void(const ChapterScreen::Show&)> onIntroChapter;
178 Tempest::Signal<void(const DocumentMenu::Show&)> onShowDocument;
179 Tempest::Signal<void()> onWorldLoaded;
180 Tempest::Signal<void()> onStartLoading;
181 Tempest::Signal<void()> onSessionExit;
182 Tempest::Signal<void()> onSettingsChanged;
183
184 Tempest::Signal<void()> onBenchmarkFinished;
185
186 std::string_view messageFromSvm(std::string_view id, int voice) const;
187 std::string_view messageByName (std::string_view id) const;
188 uint32_t messageTime (std::string_view id) const;
189
190 static std::u16string nestedPath(const std::initializer_list<const char16_t*> &name, Tempest::Dir::FileType type);
191 std::unique_ptr<zenkit::DaedalusVm> createPhoenixVm(std::string_view datFile, const ScriptLang lang = ScriptLang::NONE);
192 zenkit::DaedalusScript loadScript(std::string_view datFile, const ScriptLang lang);
193 void setupCommonScriptClasses(zenkit::DaedalusScript &sc);
194 void setupVmCommonApi(zenkit::DaedalusVm &vm);
195
196 static const FightAi& fai();
197 static const SoundDefinitions& sfx();
198 static const MusicDefinitions& musicDef();
199 static const CameraDefinitions& cameraDef();
200
201 static bool settingsHasSection(std::string_view sec);
202 static int settingsGetI(std::string_view sec, std::string_view name);
203 static void settingsSetI(std::string_view sec, std::string_view name, int val);
204 static std::string_view settingsGetS(std::string_view sec, std::string_view name);
205 static void settingsSetS(std::string_view sec, std::string_view name, std::string_view val);
206 static float settingsGetF(std::string_view sec, std::string_view name);
207 static void settingsSetF(std::string_view sec, std::string_view name, float val);
208 static void flushSettings();
209
210 private:
211 VersionInfo vinfo;
212 Options opts;
213 std::mt19937 randGen;
214 uint16_t pauseSum=0;
215 bool isMarvin = false;
216 bool godMode = false;
217 bool desktop = false;
218 bool showFpsCounter = false;
219 bool showTime = false;
220 Benchmark isBenchmark = Benchmark::None;
221
222 std::string wrldDef, plDef, gameDatDef, ouDef;
223
224 std::unique_ptr<IniFile> defaults;
225 std::unique_ptr<IniFile> baseIniFile;
226 std::unique_ptr<IniFile> iniFile;
227 std::unique_ptr<IniFile> modFile;
228 std::unique_ptr<IniFile> systemPackIniFile;
229
230 Tempest::Texture2d loadTex;
231 Tempest::Texture2d saveTex;
232 std::atomic_int loadProgress{0};
233 std::thread loaderTh;
234 std::atomic<LoadState> loadingFlag{LoadState::Idle};
235
236 std::unique_ptr<GameSession> game, pendingGame;
237 std::unique_ptr<FightAi> fight;
238 std::unique_ptr<CameraDefinitions> camDef;
239 std::unique_ptr<SoundDefinitions> soundDef;
240 std::unique_ptr<VisualFxDefinitions> vfxDef;
241 std::unique_ptr<ParticlesDefinitions> particleDef;
242 std::unique_ptr<MusicDefinitions> music;
243
244 std::mutex syncSnd;
245 Tempest::SoundDevice sndDev;
246 std::unordered_map<std::string,SoundFx> sndFxCache;
247 std::unordered_map<std::string,SoundFx> sndWavCache;
248 std::vector<Tempest::SoundEffect> sndStorage;
249
250 std::vector<std::unique_ptr<DocumentMenu::Show>> documents;
251 ChapterScreen::Show chapter;
252 bool pendingChapter=false;
253
254 std::vector<ItmFlags> inventoryOrder;
255
256 static Gothic* instance;
257
258 void implStartLoadSave(std::string_view banner,
259 bool load,
260 const std::function<std::unique_ptr<GameSession>(std::unique_ptr<GameSession>&&)> f);
261
262 void detectGothicVersion();
263 void setupSettings();
264
265 auto getDocument(int id) -> std::unique_ptr<DocumentMenu::Show>&;
266
267 static void notImplementedRoutine(std::string_view fn);
268
269 static std::string concatstrings (std::string_view a, std::string_view b);
270 static std::string inttostring (int i);
271 static std::string floattostring (float f);
272 static int floattoint (float f);
273 static float inttofloat (int i);
274
275 static bool hlp_strcmp (std::string_view a, std::string_view b);
276 int hlp_random (int max);
277
278 void introducechapter (std::string_view title, std::string_view subtitle, std::string_view img, std::string_view sound, int time);
279 bool playvideo (std::string_view name);
280 bool playvideoex (std::string_view name, bool screenBlend, bool exitSession);
281 bool printscreen (std::string_view msg, int posx, int posy, std::string_view font, int timesec);
282 bool printdialog (int dialognr, std::string_view msg, int posx, int posy, std::string_view font, int timesec);
283 void print (std::string_view msg);
284
285 int doc_create ();
286 int doc_createmap ();
287 void doc_setpage (int handle, int page, std::string_view img, int scale);
288 void doc_setpages (int handle, int count);
289 void doc_printline (int handle, int page, std::string_view text);
290 void doc_printlines (int handle, int page, std::string_view text);
291 void doc_setmargins (int handle, int page, int left, int top, int right, int bottom, int mul);
292 void doc_setfont (int handle, int page, std::string_view font);
293 void doc_setlevel (int handle, std::string_view level);
294 void doc_setlevelcoords(int handle, int left, int top, int right, int bottom);
295 void doc_show (int handle);
296
297 void exitgame ();
298
299 void printdebug (std::string_view msg);
300 void printdebugch (int ch, std::string_view msg);
301 void printdebuginst (std::string_view msg);
302 void printdebuginstch (int ch, std::string_view msg);
303 };
void pushPause()
Definition gothic.cpp:451
Camera * camera()
Definition gothic.cpp:319
void toggleDesktop()
Definition gothic.h:130
void dialogExec(const GameScript::DlgChoice &dlg, Npc &player, Npc &npc)
Definition gothic.cpp:635
static std::u16string nestedPath(const std::initializer_list< const char16_t * > &name, Tempest::Dir::FileType type)
Definition gothic.cpp:949
static void settingsSetI(std::string_view sec, std::string_view name, int val)
Definition gothic.cpp:819
Tempest::Signal< void()> onSettingsChanged
Definition gothic.h:182
bool isBenchmarkModeCi() const
Definition gothic.cpp:488
auto loadParticleFx(std::string_view name, bool relaxed=false) -> const ParticleFx *
Definition gothic.cpp:387
bool finishLoading()
Definition gothic.cpp:504
void setupGlobalScripts()
Definition gothic.cpp:254
~Gothic()
Definition gothic.cpp:245
std::string_view defaultPlayer() const
Definition gothic.cpp:689
static auto options() -> const Options &
Definition gothic.cpp:496
Tempest::Signal< void(std::string_view, int, int, int, const GthFont &)> onPrintScreen
Definition gothic.h:173
void openDialogPipe(Npc &player, Npc &npc, AiOuputPipe *&pipe)
Definition gothic.cpp:639
Gothic()
Definition gothic.cpp:47
Tempest::Signal< void(std::string_view)> onLoadGame
Definition gothic.h:167
void updateAnimation(uint64_t dt)
Definition gothic.cpp:610
bool isDesktop()
Definition gothic.h:131
static float interfaceScale(const Tempest::Widget *w)
Definition gothic.cpp:471
const World * world() const
Definition gothic.cpp:278
void popPause()
Definition gothic.cpp:455
LoadState checkLoading() const
Definition gothic.cpp:500
Tempest::Signal< void(std::string_view)> onStartGame
Definition gothic.h:166
void load(std::string_view slot)
Definition gothic.cpp:627
static void settingsSetS(std::string_view sec, std::string_view name, std::string_view val)
Definition gothic.cpp:836
bool isBenchmarkMode() const
Definition gothic.cpp:484
void setFRate(bool f)
Definition gothic.h:134
static Gothic & inst()
Definition gothic.cpp:249
Tempest::Signal< void(Npc &, Npc &, AiOuputPipe *&)> onDialogPipe
Definition gothic.h:170
auto updateDialog(const GameScript::DlgChoice &dlg, Npc &player, Npc &npc) -> std::vector< GameScript::DlgChoice >
Definition gothic.cpp:631
std::string_view defaultSave() const
Definition gothic.cpp:693
std::string_view defaultWorld() const
Definition gothic.cpp:685
static const CameraDefinitions & cameraDef()
Definition gothic.cpp:663
zenkit::DaedalusScript loadScript(std::string_view datFile, const ScriptLang lang)
Definition gothic.cpp:720
auto questLog() const -> const QuestLog *
Definition gothic.cpp:325
bool doClock() const
Definition gothic.h:136
static const FightAi & fai()
Definition gothic.cpp:651
std::string_view menuMain() const
Definition gothic.cpp:705
auto version() const -> const VersionInfo &
Definition gothic.cpp:263
auto clearGame() -> std::unique_ptr< GameSession >
Definition gothic.cpp:295
bool doFrate() const
Definition gothic.h:133
void startLoad(std::string_view banner, const std::function< std::unique_ptr< GameSession >(std::unique_ptr< GameSession > &&)> f)
Definition gothic.cpp:526
bool isNpcInDialog(const Npc &npc) const
Definition gothic.cpp:643
Tempest::Signal< void()> onStartLoading
Definition gothic.h:180
SoundFx * loadSoundFx(std::string_view name)
Definition gothic.cpp:343
std::unique_ptr< zenkit::DaedalusVm > createPhoenixVm(std::string_view datFile, const ScriptLang lang=ScriptLang::NONE)
Definition gothic.cpp:711
auto gameSession() const -> const GameSession *
Definition gothic.cpp:299
static int settingsGetI(std::string_view sec, std::string_view name)
Definition gothic.cpp:807
void setGodMode(bool g)
Definition gothic.h:128
Tempest::Signal< void(std::string_view)> onVideo
Definition gothic.h:175
void setClock(bool t)
Definition gothic.h:137
void save(std::string_view slot, std::string_view usrName)
Definition gothic.cpp:623
static const MusicDefinitions & musicDef()
Definition gothic.cpp:659
LoadState
Definition gothic.h:35
void cancelLoading()
Definition gothic.cpp:591
WorldView * worldView() const
Definition gothic.cpp:307
bool isInDialog() const
Definition gothic.cpp:647
std::string_view defaultGameDatFile() const
Definition gothic.cpp:697
int loadingProgress() const
Definition gothic.cpp:331
bool isGodMode() const
Definition gothic.h:127
Tempest::Signal< void(const DocumentMenu::Show &)> onShowDocument
Definition gothic.h:178
static void flushSettings()
Definition gothic.cpp:858
uint32_t messageTime(std::string_view id) const
Definition gothic.cpp:679
static std::string_view settingsGetS(std::string_view sec, std::string_view name)
Definition gothic.cpp:824
Tempest::Signal< void()> onBenchmarkFinished
Definition gothic.h:184
void setupVmCommonApi(zenkit::DaedalusVm &vm)
Definition gothic.cpp:953
bool isInGameAndAlive() const
Definition gothic.cpp:271
bool isMarvinEnabled() const
Definition gothic.cpp:463
Tempest::Signal< void()> toggleGi
Definition gothic.h:143
static bool settingsHasSection(std::string_view sec)
Definition gothic.cpp:798
static const SoundDefinitions & sfx()
Definition gothic.cpp:655
static void settingsSetF(std::string_view sec, std::string_view name, float val)
Definition gothic.cpp:853
std::string_view defaultOutputUnits() const
Definition gothic.cpp:701
static float settingsGetF(std::string_view sec, std::string_view name)
Definition gothic.cpp:841
bool isInGame() const
Definition gothic.cpp:267
Tempest::Signal< void()> toggleVsm
Definition gothic.h:143
Npc * player()
Definition gothic.cpp:313
auto loadingBanner() const -> const Tempest::Texture2d *
Definition gothic.cpp:339
void setBenchmarkMode(Benchmark b)
Definition gothic.cpp:492
void setLoadingProgress(int v)
Definition gothic.cpp:335
bool isPause() const
Definition gothic.cpp:459
std::function< bool(const Npc *)> isNpcInDialogFn
Definition gothic.h:171
void setGame(std::unique_ptr< GameSession > &&w)
Definition gothic.cpp:290
void emitGlobalSound(std::string_view sfx)
Definition gothic.cpp:395
Tempest::Signal< void(const ChapterScreen::Show &)> onIntroChapter
Definition gothic.h:177
void emitGlobalSoundWav(std::string_view wav)
Definition gothic.cpp:432
Tempest::Signal< void()> toggleRtsm
Definition gothic.h:143
SoundFx * loadSoundWavFx(std::string_view name)
Definition gothic.cpp:364
Tempest::Signal< void(std::string_view)> onPrint
Definition gothic.h:174
void setMarvinEnabled(bool m)
Definition gothic.cpp:467
void quickLoad()
Definition gothic.cpp:619
Tempest::Signal< void(std::string_view, std::string_view)> onSaveGame
Definition gothic.h:168
void startSave(Tempest::Texture2d &&tex, const std::function< std::unique_ptr< GameSession >(std::unique_ptr< GameSession > &&)> f)
Definition gothic.cpp:520
Tempest::Signal< void()> onSessionExit
Definition gothic.h:181
std::string_view messageFromSvm(std::string_view id, int voice) const
Definition gothic.cpp:667
void setupCommonScriptClasses(zenkit::DaedalusScript &sc)
Definition gothic.cpp:761
void tick(uint64_t dt)
Definition gothic.cpp:598
std::string_view messageByName(std::string_view id) const
Definition gothic.cpp:673
static auto invCatOrder() -> const std::vector< ItmFlags > &
Definition gothic.cpp:447
auto loadVisualFx(std::string_view name) -> const VisualFx *
Definition gothic.cpp:383
void quickSave()
Definition gothic.cpp:615
Tempest::Signal< void()> onWorldLoaded
Definition gothic.h:179
Definition npc.h:25
Definition sound.h:5
Definition world.h:31
ItmFlags
Definition constants.h:312
Benchmark
Definition constants.h:537
ScriptLang
Definition constants.h:518
bool doVirtualShadow
Definition gothic.h:49
uint8_t showManaBar
Definition gothic.h:67
bool doMeshShading
Definition gothic.h:47
float interfaceScale
Definition gothic.h:59
Tempest::Size saveGameImageSize
Definition gothic.h:64
bool showHealthBar
Definition gothic.h:66
float cameraFov
Definition gothic.h:57
bool doSoftwareRT
Definition gothic.h:51
uint32_t aaPreset
Definition gothic.h:54
int inventoryCellSize
Definition gothic.h:60
bool hideFocus
Definition gothic.h:56
bool doSoftwareShadow
Definition gothic.h:50
uint8_t showSwimBar
Definition gothic.h:68
Tempest::Size newChapterSize
Definition gothic.h:62
bool doBindless
Definition gothic.h:48
uint32_t swRenderingPreset
Definition gothic.h:52
bool doRayQuery
Definition gothic.h:45