-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGameAPI.h
392 lines (327 loc) · 10 KB
/
GameAPI.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
#pragma once
#include "GameTypes.h"
#include "Utilities.h"
class TESObjectREFR;
class Script;
class TESForm;
class SceneGraph;
class Tile;
class DataHandler;
class ChangesMap;
class InteriorCellNewReferencesMap;
class ExteriorCellNewReferencesMap;
class NumericIDBufferMap;
// only records individual objects if there's a block that matches it
// ### how can it tell?
struct ScriptEventList
{
struct Event
{
TESForm * object;
UInt32 eventMask;
};
struct VarEntry;
struct Var
{
UInt32 id;
VarEntry * nextEntry;
double data;
};
struct VarEntry
{
Var * var;
VarEntry * next;
};
Script * m_script;
UInt32 m_unk1;
tList<Event> * m_eventList;
VarEntry * m_vars;
void Dump(void);
};
#if RUNTIME
const UInt32 _ConsoleManager_Print = 0x0062B190;
#else
const UInt32 _ConsoleManager_Print = 0;
#endif
void Console_Print(const char * fmt, ...);
typedef void * (* _FormHeap_Allocate)(UInt32 size);
extern const _FormHeap_Allocate FormHeap_Allocate;
typedef void (* _FormHeap_Free)(void * ptr);
extern const _FormHeap_Free FormHeap_Free;
typedef TESForm * (* _LookupFormByID)(UInt32 id);
extern const _LookupFormByID LookupFormByID;
typedef TESForm* (*_LookupFormByEDID)(const char* id);
extern const _LookupFormByEDID LookupFormByEDID;
typedef TESForm * (* _CreateFormInstance)(UInt8 type);
extern const _CreateFormInstance CreateFormInstance;
const char * GetFullName(TESForm * baseForm);
const char* GetActorValueString(UInt32 actorValue); // not working yet
typedef char* (* _GetActorValueName)(UInt32 actorValueCode);
extern const _GetActorValueName GetActorValueName;
UInt32 AddFormToDataHandler(TESForm * form);
extern DataHandler ** g_dataHandler;
#if RUNTIME
const UInt32 _TESSaveLoadGame_AddCreatedForm = 0x006DD260;
const UInt32 _SaveGameManager_ConstructSavegameFilename = 0x006D47A0;
const UInt32 _SaveGameManager_ConstructSavegamePath = 0x006D46E0;
#else
const UInt32 _TESSaveLoadGame_AddCreatedForm = 0;
const UInt32 _SaveGameManager_ConstructSavegameFilename = 0;
const UInt32 _SaveGameManager_ConstructSavegamePath = 0;
#endif
// 1C8
class TESSaveLoadGame
{
public:
TESSaveLoadGame();
~TESSaveLoadGame();
MEMBER_FN_PREFIX(TESSaveLoadGame);
DEFINE_MEMBER_FN(AddCreatedForm, UInt32, _TESSaveLoadGame_AddCreatedForm, TESForm* pForm);
static TESSaveLoadGame* GetSingleton();
struct CreatedObject {
UInt32 refID;
CreatedObject * next;
};
ChangesMap * changesMap; // 000
UInt32 unk004; // 004
InteriorCellNewReferencesMap * intRefMap; // 008
ExteriorCellNewReferencesMap * extRefMap00C; // 00C
ExteriorCellNewReferencesMap * extRefMap010; // 010
void * saveLoadBuffer; // 014
UInt32 unk018; // 018
UInt8 unk01C; // 01C
UInt8 pad01D[3];
UInt32 unk020; // 020
UInt32 unk024; // 024
UInt32 unk028; // 028
CreatedObject createdObjectList; // 02C data is formID
UInt32 unk034[(0x58-0x34) >> 2]; // 034
NumericIDBufferMap * idMap058; // 058
NumericIDBufferMap * idMap05C; // 05C
NumericIDBufferMap * idMap060; // 060
NumericIDBufferMap * idMap064; // 064
UInt32 unk068; // 068
UInt32 unk06C; // 06C
UInt32 unk070; // 070
UInt8 unk074; // 074
UInt8 unk075; // init to 0x7D
UInt8 pad076[2];
NiTArray<UInt32> * array078; // 078 NiTLargePrimitiveArray<?>
NiTArray<UInt32> * array07C; // 07C NiTLargePrimitiveArray<?>
UInt8 unk080; // 080 version of save?
UInt8 unk081;
UInt8 pad082[2];
UInt32 unk084[(0xAC-0x84) >> 2]; // 084
UInt8 unk0AC; // 0AC
UInt8 unk0AD; // 0AD
UInt8 unk0AE; // 0AE
UInt8 unk0AF; // 0AF
UInt32 unk0B0[(0x1C8-0x0B0) >> 2]; // 0B0
};
STATIC_ASSERT(sizeof(TESSaveLoadGame) == 0x1C8);
UInt32 AddFormToCreatedBaseObjectsList(TESForm * form);
//extern TESSaveLoadGame ** g_saveLoadGame;
// 2C
class SaveGameManager
{
public:
SaveGameManager();
~SaveGameManager();
static SaveGameManager* GetSingleton();
MEMBER_FN_PREFIX(SaveGameManager);
DEFINE_MEMBER_FN(ConstructSavegameFilename, void, _SaveGameManager_ConstructSavegameFilename,
const char* filename, char* outputBuf, bool bTempFile);
DEFINE_MEMBER_FN(ConstructSavegamePath, void, _SaveGameManager_ConstructSavegamePath, char* outputBuf);
// size unknown
struct SaveGameData
{
const char * name; // 00
UInt32 unk04; // 04
UInt32 unk08; // 08 index?
const char * pcName; // 0C
const char * pcTitle; // 10
const char * location; // 14
const char * time; // 18
};
tList<SaveGameData> * saveList; // 00
UInt32 numSaves; // 04
UInt32 unk08; // 08
UInt8 unk0C; // 0C
UInt8 unk0D;
UInt8 unk0E;
UInt8 unk0F;
const char * unk10; // 10 name of most recently loaded/saved game?
UInt32 unk14; // 14 init to -1
UInt8 unk18; // 18
UInt8 pad19[3];
UInt8 unk20; // 20 init to 1
UInt8 unk21;
UInt8 pad22[2];
UInt32 unk24; // 24
UInt32 unk28; // 28
};
std::string GetSavegamePath();
class ConsoleManager
{
public:
MEMBER_FN_PREFIX(ConsoleManager);
DEFINE_MEMBER_FN(Print, void, _ConsoleManager_Print, const char * fmt, va_list args);
ConsoleManager();
~ConsoleManager();
static ConsoleManager * GetSingleton(void);
};
bool IsConsoleMode();
void DumpTLSData();
const UInt32 kMaxMessageLength = 0x4000;
enum EActorVals {
eActorVal_Aggression = 0,
eActorVal_Confidence = 1,
eActorVal_Energy = 2,
eActorVal_Responsibility = 3,
eActorVal_Mood = 4,
eActorVal_Strength = 5,
eActorVal_Perception = 6,
eActorVal_Endurance = 7,
eActorVal_Charisma = 8,
eActorVal_Intelligence = 9,
eActorVal_Agility = 10,
eActorVal_Luck = 11,
eActorVal_SpecialStart = eActorVal_Strength,
eActorVal_SpecialEnd = eActorVal_Luck,
eActorVal_ActionPoints = 12,
eActorVal_CarryWeight = 13,
eActorVal_CritChance = 14,
eActorVal_HealRate = 15,
eActorVal_Health = 16,
eActorVal_MeleeDamage = 17,
eActorVal_DamageResistance = 18,
eActorVal_PoisonResistance = 19,
eActorVal_RadResistance = 20,
eActorVal_SpeedMultiplier = 21,
eActorVal_Fatigue = 22,
eActorVal_Karma = 23,
eActorVal_XP = 24,
eActorVal_Head = 25,
eActorVal_Torso = 26,
eActorVal_LeftArm = 27,
eActorVal_RightArm = 28,
eActorVal_LeftLeg = 29,
eActorVal_RightLeg = 30,
eActorVal_Brain = 31,
eActorVal_BodyPartStart = eActorVal_Head,
eActorVal_BodyPartEnd = eActorVal_Brain,
eActorVal_Barter = 32,
eActorVal_BigGuns = 33,
eActorVal_EnergyWeapons = 34,
eActorVal_Explosives = 35,
eActorVal_Lockpick = 36,
eActorVal_Medicine = 37,
eActorVal_MeleeWeapons = 38,
eActorVal_Repair = 39,
eActorVal_Science = 40,
eActorVal_SmallGuns = 41,
eActorVal_Sneak = 42,
eActorVal_Speech = 43,
eActorVal_Throwing = 44,
eActorVal_Unarmed = 45,
eActorVal_SkillsStart = eActorVal_Barter,
eActorVal_SkillsEnd = eActorVal_Unarmed,
eActorVal_InventoryWeight = 46,
eActorVal_Paralysis = 47,
eActorVal_Invisibility = 48,
eActorVal_Chameleon = 49,
eActorVal_NightEye = 50,
eActorVal_DetectLifeRange = 51,
eActorVal_FireResistance = 52,
eActorVal_WaterBreathing = 53,
eActorVal_RadLevel = 54,
eActorVal_BloodyMess = 55,
eActorVal_UnarmedDamage = 56,
eActorVal_Assistance = 57,
eActorVal_ElectricResistance = 58,
eActorVal_FrostResistance = 59,
eActorVal_EnergyResistance = 60,
eActorVal_EMPResistance = 61,
eActorVal_Var1Medical = 62,
eActorVal_Var2 = 63,
eActorVal_Var3 = 64,
eActorVal_Var4 = 65,
eActorVal_Var5 = 66,
eActorVal_Var6 = 67,
eActorVal_Var7 = 68,
eActorVal_Var8 = 69,
eActorVal_Var9 = 70,
eActorVal_Var10 = 71,
eActorVal_IgnoreCrippledLimbs = 72,
eActorVal_FalloutMax = eActorVal_IgnoreCrippledLimbs,
};
class BGSSaveLoadGame // 0x011DDF38
{
public:
BGSSaveLoadGame();
~BGSSaveLoadGame();
typedef UInt32 RefID;
typedef UInt32 IndexRefID;
struct SaveChapters // 06E chapter table in save
{
struct RefIDArray // List of all refID referenced in save for tranlation in BGSSaveLoadFormIDMap
{
UInt32 count; // 000
RefID IDs[1]; // 004
};
RefIDArray* arr000; // 000
RefIDArray* arr004; // 004
};
struct BGSSaveLoadReferencesMap
{
NiTPointerMap<UInt32>* map000; // 000
void* map010; // 010
NiTPointerMap<void*>* map020; // 020
};
void* changesMap; // 000
void* previousChangeMap; // 004
void* refIDmapping; // 008
void* visitedWorldspaces; // 00C
BGSSaveLoadReferencesMap* referencesMap; // 010
void* QueuedSubBuffersMap; // 014
void* ChangedFormIDMap; // 018
char** saveGameHistory; // 01C
void* rfiafMap; // 020
BSSimpleArray<void*> changedForms; // 024
NiTPointerMap<void*> QueuedInitPackageLocationsActorMap; // 034
UInt8 saveMods[255]; // 044
UInt8 loadedMods[255]; // 143
UInt16 pad242; // 242
UInt32 iGlobalFlags; // 244 bit 6 block updating player position/rotation from save, bit 2 set during save
UInt8 formVersion; // 248
UInt8 pad249[3]; // 249
static BGSSaveLoadGame* GetSingleton() { return *(BGSSaveLoadGame**)0x1079858; };
bool IsLoading() { return (iGlobalFlags & 2) != 0; };
};
STATIC_ASSERT(sizeof(BGSSaveLoadGame) == 0x24C);
struct ProcessManager
{
struct ProcessLists
{
NiTArray<void*> objects; // 000
UInt32 beginOffsets[4]; // 010 0: High, 1: Mid-High, 2: Mid-Low, 3: Low
UInt32 endOffsets[4]; // 020
UInt32 unk034[4]; // 030
};
float time000; // 000
ProcessLists processLists; // 004
tList<void>* crimes[5]; // 044
tList<void> list058; // 058
tList<void> tempEffects; // 060
UInt32 unk068[6]; // 068
tList<void> highActors; // 080
void* nearbyActorsArray[50]; // 088
UInt32 numNearbyActors; // 150
float fCommentOnPlayerActionsTimer; // 154
float fCommentOnPlayerKnockingThingsTimer; // 158
UInt8 playerInRadiation1; // 15C
UInt8 playerInRadiation2; // 15D
UInt8 gap15E[2]; // 15E
static ProcessManager* GetSingleton() { return (ProcessManager*)0x107C0A0; };
};
STATIC_ASSERT(sizeof(ProcessManager) == 0x160);