Skip to content

Commit 6c03e4e

Browse files
committed
Fix storing pointers in map global variables
1 parent 3f25c92 commit 6c03e4e

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

src/interpreter_extra.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,16 +1220,20 @@ static void opGetMapVar(Program* program)
12201220
{
12211221
int data = programStackPopInteger(program);
12221222

1223-
int value = mapGetGlobalVar(data);
1223+
ProgramValue value;
1224+
if (mapGetGlobalVar(data, value) == -1) {
1225+
value.opcode = VALUE_TYPE_INT;
1226+
value.integerValue = -1;
1227+
}
12241228

1225-
programStackPushInteger(program, value);
1229+
programStackPushValue(program, value);
12261230
}
12271231

12281232
// set_map_var
12291233
// 0x4558C8
12301234
static void opSetMapVar(Program* program)
12311235
{
1232-
int value = programStackPopInteger(program);
1236+
ProgramValue value = programStackPopValue(program);
12331237
int variable = programStackPopInteger(program);
12341238

12351239
mapSetGlobalVar(variable, value);

src/map.cc

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ static char _scratchStr[40];
164164
// 0x631E78
165165
static char _map_path[COMPAT_MAX_PATH];
166166

167+
// CE: Basically the same problem described in |gMapLocalPointers|, but this
168+
// time Olympus folks use global map variables to store objects (looks like
169+
// only `self_obj`).
170+
static std::vector<void*> gMapGlobalPointers;
171+
167172
// CE: There is a bug in the user-space scripting where they want to store
168173
// pointers to |Object| instances in local vars. This is obviously wrong as it's
169174
// meaningless to save these pointers in file. As a workaround use second array
@@ -390,27 +395,41 @@ int mapSetElevation(int elevation)
390395
}
391396

392397
// 0x482220
393-
int mapSetGlobalVar(int var, int value)
398+
int mapSetGlobalVar(int var, ProgramValue& value)
394399
{
395400
if (var < 0 || var >= gMapGlobalVarsLength) {
396401
debugPrint("ERROR: attempt to reference map var out of range: %d", var);
397402
return -1;
398403
}
399404

400-
gMapGlobalVars[var] = value;
405+
if (value.opcode == VALUE_TYPE_PTR) {
406+
gMapGlobalVars[var] = 0;
407+
gMapGlobalPointers[var] = value.pointerValue;
408+
} else {
409+
gMapGlobalVars[var] = value.integerValue;
410+
gMapGlobalPointers[var] = nullptr;
411+
}
401412

402413
return 0;
403414
}
404415

405416
// 0x482250
406-
int mapGetGlobalVar(int var)
417+
int mapGetGlobalVar(int var, ProgramValue& value)
407418
{
408419
if (var < 0 || var >= gMapGlobalVarsLength) {
409420
debugPrint("ERROR: attempt to reference map var out of range: %d", var);
410-
return 0;
421+
return -1;
422+
}
423+
424+
if (gMapGlobalPointers[var] != nullptr) {
425+
value.opcode = VALUE_TYPE_PTR;
426+
value.pointerValue = gMapGlobalPointers[var];
427+
} else {
428+
value.opcode = VALUE_TYPE_INT;
429+
value.integerValue = gMapGlobalVars[var];
411430
}
412431

413-
return gMapGlobalVars[var];
432+
return 0;
414433
}
415434

416435
// 0x482280
@@ -1521,6 +1540,8 @@ static int mapGlobalVariablesInit(int count)
15211540
if (gMapGlobalVars == NULL) {
15221541
return -1;
15231542
}
1543+
1544+
gMapGlobalPointers.resize(count);
15241545
}
15251546

15261547
gMapGlobalVarsLength = count;
@@ -1536,6 +1557,8 @@ static void mapGlobalVariablesFree()
15361557
gMapGlobalVars = NULL;
15371558
gMapGlobalVarsLength = 0;
15381559
}
1560+
1561+
gMapGlobalPointers.clear();
15391562
}
15401563

15411564
// NOTE: Inlined.

src/map.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ void isoEnable();
8686
bool isoDisable();
8787
bool isoIsDisabled();
8888
int mapSetElevation(int elevation);
89-
int mapSetGlobalVar(int var, int value);
90-
int mapGetGlobalVar(int var);
89+
int mapSetGlobalVar(int var, ProgramValue& value);
90+
int mapGetGlobalVar(int var, ProgramValue& value);
9191
int mapSetLocalVar(int var, ProgramValue& value);
9292
int mapGetLocalVar(int var, ProgramValue& value);
9393
int _map_malloc_local_var(int a1);

0 commit comments

Comments
 (0)