Skip to content

Commit 45cc15d

Browse files
FF7: Replace field load model built-in atoi
Instead of blindly converting all the buffer, as the model size can't be bigger than 4096, use always only the first 4 bytes. Fixes #295
1 parent dae2b8a commit 45cc15d

File tree

5 files changed

+21
-5
lines changed

5 files changed

+21
-5
lines changed

src/ff7.h

+1
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,7 @@ struct ff7_externals
19331933
uint32_t menu_sub_6CDC09;
19341934
uint32_t menu_sub_7212FB;
19351935
uint32_t load_save_file;
1936+
uint32_t field_load_models_atoi;
19361937
};
19371938

19381939
uint32_t ff7gl_load_group(uint32_t group_num, struct matrix_set *matrix_set, struct p_hundred *hundred_data, struct p_group *group_data, struct polygon_data *polygon_data, struct ff7_polygon_set *polygon_set, struct ff7_game_obj *game_object);

src/ff7/defs.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void ff7_limit_fps();
5858
void ff7_handle_ambient_playback();
5959
BOOL ff7_write_save_file(char slot);
6060
DWORD ff7_sub_404D80();
61-
61+
int ff7_field_load_models_atoi(const char* str);
6262

6363
// field
6464
void field_load_textures(struct ff7_game_obj *game_object, struct struc_3 *struc_3);

src/ff7/misc.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -543,16 +543,26 @@ BOOL ff7_write_save_file(char slot)
543543
return ret;
544544
}
545545

546+
// The function that load the model size sometimes gets a buffer that is non-null terminated, returning weird values.
547+
// Replace the native `atoi` call with a custom function that always uses the first 4 bytes to convert the buffer to int
548+
int ff7_field_load_models_atoi(const char* str)
549+
{
550+
std::string buf(str, 4);
551+
552+
return std::stol(buf);
553+
}
554+
546555
//#########################
547556
// steam achievement hooks
548557
//#########################
549558

550559
// Replaced this function only in credits main loop
551-
DWORD ff7_sub_404D80(){ // NOT TESTED
560+
DWORD ff7_sub_404D80() // NOT TESTED
561+
{
552562
if (trace_all || trace_achievement)
553563
ffnx_trace("%s - unlock end of game progress\n", __func__);
554564

555565
g_FF7SteamAchievements.unlockGameProgressAchievement(END_OF_GAME);
556566

557-
return ((DWORD(*)()) ff7_externals.sub_404D80)();
567+
return ((DWORD(*)()) ff7_externals.sub_404D80)();
558568
}

src/ff7_data.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ void ff7_find_externals(struct ff7_game_obj* game_object)
551551
ff7_externals.menu_shop_loop = get_relative_call(ff7_externals.menu_sub_71FF95, 0x84);
552552
ff7_externals.get_materia_gil = get_relative_call(ff7_externals.menu_shop_loop, 0x327B);
553553
ff7_externals.menu_sub_6CBCB9 = get_relative_call(ff7_externals.menu_shop_loop, 0x353B);
554-
554+
555555
ff7_externals.credits_main_loop = credits_main_loop;
556556
ff7_externals.sub_404D80 = get_relative_call(ff7_externals.credits_main_loop, 0x211);
557557

@@ -567,6 +567,8 @@ void ff7_find_externals(struct ff7_game_obj* game_object)
567567
uint32_t menu_sub_722393 = get_relative_call(menu_sub_6CBD65, 0x4);
568568
ff7_externals.menu_sub_7212FB = get_relative_call(menu_sub_722393, 0x8B);
569569
ff7_externals.load_save_file = get_relative_call(ff7_externals.menu_sub_7212FB, 0xE9D);
570+
571+
ff7_externals.field_load_models_atoi = ff7_externals.field_load_models + 0x262;
570572
}
571573

572574
void ff7_data(struct ff7_game_obj* game_object)

src/ff7_opengl.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ void ff7_init_hooks(struct game_obj *_game_object)
5757
game_object->d3d2_flag = 1;
5858
game_object->nvidia_fix = 0;
5959

60+
// Load Models atoi function
61+
replace_call_function(ff7_externals.field_load_models_atoi, ff7_field_load_models_atoi);
62+
6063
// DirectInput hack, try to reacquire on any error
6164
memset_code(ff7_externals.dinput_getdata2 + 0x65, 0x90, 9);
6265
memset_code((uint32_t)common_externals.dinput_acquire_keyboard + 0x31, 0x90, 5);
@@ -190,7 +193,6 @@ void ff7_init_hooks(struct game_obj *_game_object)
190193
// #####################
191194
// battle toggle
192195
// #####################
193-
194196
replace_call_function(ff7_externals.field_battle_toggle, ff7_toggle_battle_field);
195197
replace_call_function(ff7_externals.worldmap_battle_toggle, ff7_toggle_battle_worldmap);
196198

@@ -225,6 +227,7 @@ void ff7_init_hooks(struct game_obj *_game_object)
225227
break;
226228
}
227229
}
230+
228231
//###############################
229232
// steam achievement unlock calls
230233
//###############################

0 commit comments

Comments
 (0)