Skip to content

Commit

Permalink
FF7: Allow to load custom eyes based on current model name
Browse files Browse the repository at this point in the history
  • Loading branch information
julianxhokaxhiu committed Dec 17, 2023
1 parent f6c2c9d commit 25fbdf7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
1 change: 1 addition & 0 deletions src/ff7.h
Original file line number Diff line number Diff line change
Expand Up @@ -2753,6 +2753,7 @@ struct ff7_externals
uint32_t field_load_models;
uint32_t field_models_eye_to_model;
ff7_model_eye_texture_data* field_models_eye_blink_buffer;
DWORD* field_models_data;
int (*field_load_model_eye_tex)(ff7_model_eye_texture_data *eye_data, field_animation_data *anim_data);
void (*field_unload_model_eye_tex)(void* eye_tex);
uint32_t field_sub_60DCED;
Expand Down
1 change: 1 addition & 0 deletions src/ff7_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ void ff7_find_externals(struct ff7_game_obj* game_object)
ff7_externals.destroy_animation = (void (*)(anim_header*))get_relative_call(ff7_externals.load_animation, 0x162);

ff7_externals.field_models_eye_blink_buffer = (ff7_model_eye_texture_data*)get_absolute_value(ff7_externals.field_load_models, 0xB8C);
ff7_externals.field_models_data = (DWORD*)get_absolute_value(ff7_externals.field_load_models, 0xE);

ff7_externals.load_lgp = get_relative_call(main_loop, 0x450);
ff7_externals.open_lgp_file = get_relative_call(ff7_externals.load_lgp, 0x1C);
Expand Down
41 changes: 32 additions & 9 deletions src/field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,15 @@ int opcode_kawai_eye_texture() {
field_animation_data* animation_data = *ff7_externals.field_animation_data_ptr;
byte curr_model_id = ff7_externals.field_model_id_array[*ff7_externals.current_entity_id];
byte eye_index = animation_data[curr_model_id].eye_texture_idx;
char curr_model_name[10];

_splitpath((const char*)(*ff7_externals.field_models_data + (10380 * curr_model_id) + 512), NULL, NULL, curr_model_name, NULL);

if (trace_all || trace_opcodes)
ffnx_trace("opcode[KAWAI]: num_params:%u,subcode:0x%x,left_eye_index:%u,right_eye_index:%u,mouth_index:%u\n", num_params, subcode, left_eye_index, right_eye_index, mouth_index);
{
ffnx_trace("opcode[KAWAI]: num_params=%u,subcode=0x%x,left_eye_index=%u,right_eye_index=%u,mouth_index=%u\n", num_params, subcode, left_eye_index, right_eye_index, mouth_index);
ffnx_trace("subcode[EYETX]: curr_model_id=%d,curr_model_name=%s\n", curr_model_id, curr_model_name);
}

// Skip custom eye replacement for NPCs
if (eye_index < 9)
Expand All @@ -88,26 +94,43 @@ int opcode_kawai_eye_texture() {

// LEFT EYE
_splitpath(ff7_eyes[eye_index].static_left_eye_filename, NULL, NULL, filename, ext);
_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/%s_%d.TEX", basedir, direct_mode_path.c_str(), filename, left_eye_index);
memset(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 0, 1024);

_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/eye_%s_%d.TEX", basedir, direct_mode_path.c_str(), curr_model_name, left_eye_index);
if (fileExists(directpath))
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 1024, "%s_%d%s", filename, left_eye_index, ext);
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 1024, "eye_%s_%d%s", curr_model_name, left_eye_index, ext);
else
{
if (left_eye_index > 2 && (trace_all || trace_direct || trace_opcodes)) ffnx_trace("opcode[KAWAI]: Custom left eye texture not found: %s\n", directpath);
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 1024, "%s%s", filename, ext);

_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/%s_%d.TEX", basedir, direct_mode_path.c_str(), filename, left_eye_index);
if (fileExists(directpath))
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 1024, "%s_%d%s", filename, left_eye_index, ext);
else
{
if (left_eye_index > 2 && (trace_all || trace_direct || trace_opcodes)) ffnx_trace("opcode[KAWAI]: Custom left eye texture not found: %s\n", directpath);

_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_left_eye_filename, 1024, "%s%s", filename, ext);
}
}

// RIGHT EYE
_splitpath(ff7_eyes[eye_index].static_right_eye_filename, NULL, NULL, filename, ext);
_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/%s_%d.TEX", basedir, direct_mode_path.c_str(), filename, right_eye_index);
memset(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 0, 1024);

_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/eye_%sr_%d.TEX", basedir, direct_mode_path.c_str(), curr_model_name, right_eye_index);
if (fileExists(directpath))
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 1024, "%s_%d%s", filename, right_eye_index, ext);
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 1024, "eye_%sr_%d%s", curr_model_name, right_eye_index, ext);
else
{
if (right_eye_index > 2 && (trace_all || trace_direct || trace_opcodes)) ffnx_trace("opcode[KAWAI]: Custom right eye texture not found: %s\n", directpath);
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 1024, "%s%s", filename, ext);

_snprintf(directpath, sizeof(directpath), "%s/%s/flevel/%s_%d.TEX", basedir, direct_mode_path.c_str(), filename, right_eye_index);
if (fileExists(directpath))
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 1024, "%s_%d%s", filename, right_eye_index, ext);
else
{
if (right_eye_index > 2 && (trace_all || trace_direct || trace_opcodes)) ffnx_trace("opcode[KAWAI]: Custom right eye texture not found: %s\n", directpath);
_snprintf(ff7_externals.field_models_eye_blink_buffer[eye_index].static_right_eye_filename, 1024, "%s%s", filename, ext);
}
}

// Reload TEX data in memory
Expand Down

0 comments on commit 25fbdf7

Please sign in to comment.