OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
directmemory.h
Go to the documentation of this file.
1#pragma once
2
3#include <zenkit/DaedalusScript.hh>
4
5#include "game/gamescript.h"
6
7#include "cpu32.h"
8#include "mem32.h"
9
11 public:
12 DirectMemory(GameScript& owner, zenkit::DaedalusVm& vm);
13
14 static bool isRequired(zenkit::DaedalusScript& vm);
15
16 auto demangleAddress(uint32_t addr) -> std::string_view;
17
18 //
19 auto menuMain() const -> std::string_view;
20
21 // hooks
22 void tick(uint64_t dt);
23 void eventPlayAni(std::string_view ani);
24
25 private:
26 using ptr32_t = Mem32::ptr32_t;
32
33 struct memory_instance : public zenkit::DaedalusTransientInstance {
34 explicit memory_instance(DirectMemory &owner, ptr32_t address) : owner(owner), address(address) {}
35
36 void set_int(zenkit::DaedalusSymbol const& sym, uint16_t index, std::int32_t value) override;
37 std::int32_t get_int(zenkit::DaedalusSymbol const& sym, uint16_t index) const override;
38
39 void set_float(zenkit::DaedalusSymbol const& sym, uint16_t index, float value) override;
40 float get_float(zenkit::DaedalusSymbol const& sym, uint16_t index) const override;
41
42 void set_string(zenkit::DaedalusSymbol const& sym, uint16_t index, std::string_view value) override;
43 const std::string& get_string(zenkit::DaedalusSymbol const& sym, uint16_t index) const override;
44
45 DirectMemory& owner;
46 ptr32_t address = 0;
47 };
48
49 struct ScriptVar {
50 zString data = {};
51 };
52
53 GameScript& gameScript;
54 zenkit::DaedalusVm& vm;
55 Mem32 mem32;
56 Cpu32 cpu;
57
58 uint32_t versionHint = 504628679; // G2
59 //int32_t invMaxItems = 9;
60 zCTimer zTimer = {};
61 oGame memGame = {};
62 char menuName[17] = {}; // 16 bytes for script + null-charater, invisible to the script
63 float spawnRange = 1000; // 10 meters, for now
64
65 ptr32_t oGame_Pointer = 0;
66 ptr32_t gameman_Ptr = 0;
67 ptr32_t zFactory_Ptr = 0;
68 ptr32_t fontMan_Ptr = 0;
69 ptr32_t focusList[6] = {};
70
71 ptr32_t scriptVariables = 0;
72 ptr32_t scriptSymbols = 0;
73
74 void setupFunctionTable();
75 void setupIkarusLoops();
76 void setupEngineMemory();
77 void setupEngineText();
78
79 auto repeat(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
80 auto while_(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
81 auto mem_goto(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
82 void loop_trap(zenkit::DaedalusSymbol* i);
83
84 uint32_t traceBackExpression(zenkit::DaedalusVm& vm, uint32_t pc);
85 auto findSymbolByAddress(uint32_t addr) -> const zenkit::DaedalusSymbol*;
86
87 struct LPayload {
88 zenkit::DaedalusSymbol* i = nullptr;
89 int32_t len = 0;
90 };
91 std::unordered_map<uint32_t,LPayload> loopPayload;
92 std::unordered_map<uint32_t,uint32_t> loopBacktrack;
93 std::vector<const zenkit::DaedalusSymbol*> symbolsByAddress;
94
95 // memory mappings
96 void memoryCallback(zCParser& p, std::memory_order ord);
97 void memoryCallback(ScriptVar& v, uint32_t index, std::memory_order ord);
98 void memoryCallback(zCPar_Symbol& s, uint32_t index, std::memory_order ord);
99 void memAssignString(zString& str, std::string_view cstr);
100 void memFromString(std::string& dst, const zString& str);
101
102 // stacktrace & logs
103 void memPrintstacktraceImplementation();
104 void memSendToSpy(int cat, std::string_view msg);
105 void memReplaceFunc(zenkit::DaedalusFunction dest, zenkit::DaedalusFunction func);
106
107 ptr32_t ASMINT_InternalStack = 0;
108 ptr32_t ASMINT_CallTarget = 0;
109 void ASMINT_Init();
110 void ASMINT_CallMyExternal();
111
112 // pointers
113 void setupMemoryFunctions();
114 auto mem_ptrtoinst(ptr32_t address) -> std::shared_ptr<zenkit::DaedalusInstance>;
115 int mem_insttoptr(int index);
116 auto _takeref(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
117 int mem_readint (int address);
118 void mem_writeint (int address, int val);
119 void mem_copybytes (int src, int dst, int size);
120 std::string mem_readstring (int address);
121 auto mem_readstatarr (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
122 auto mem_writestatarr (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
123 // pointers: MEM_Alloc and MEM_Free ##
124 int mem_alloc (int amount);
125 int mem_alloc (int amount, const char* comment);
126 void mem_free (int address);
127 int mem_realloc(int address, int oldsz, int size);
128
129 // mem-func
130 void setupDirectFunctions();
131 int mem_getfuncidbyoffset(int off);
132 void mem_assigninst (int index, int ptr);
133
134 void directCall(zenkit::DaedalusVm& vm, zenkit::DaedalusSymbol& func);
135 auto mem_callbyid (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
136 auto mem_callbyptr(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
137 // ## Direct calls by id/ptr
138 auto memint_stackpushint (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
139 //TODO: MEMINT_StackPushString
140 auto memint_stackpushinst(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
141 auto memint_stackpushvar (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
142 //
143 auto memint_popstring (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
144 //---
145 auto mem_popintresult (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
146 auto mem_popstringresult(zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
147 auto mem_popinstresult (zenkit::DaedalusVm& vm) -> zenkit::DaedalusNakedCall;
148
149 // math
150 void setupMathFunctions();
151 static int mkf(int v);
152 static int truncf(int v);
153 static int roundf(int v);
154 static int addf(int a, int b);
155 static int subf(int a, int b);
156 static int mulf(int a, int b);
157 static int divf(int a, int b);
158
159 // strings
160 void setupStringsFunctions();
161 // winapi
162 void setupWinapiFunctions();
163 void setupUtilityFunctions();
164 void setupHookEngine();
165 void setupzCParserFunctions();
166 void setupInitFileFunctions();
167 // gothic-ui
168 void setupUiFunctions();
169 void setupFontFunctions();
170 void tickUi(uint64_t dt);
171 //
172 void setupNpcFunctions();
173 void setupWorldFunctions();
174 };
Definition cpu32.h:14
static bool isRequired(zenkit::DaedalusScript &vm)
void eventPlayAni(std::string_view ani)
void tick(uint64_t dt)
auto demangleAddress(uint32_t addr) -> std::string_view
auto menuMain() const -> std::string_view
Definition mem32.h:12
Compatibility::ptr32_t ptr32_t
Definition mem32.h:27