Skip to content

Commit

Permalink
FF8: Worldmap dialog VA
Browse files Browse the repository at this point in the history
  • Loading branch information
julianxhokaxhiu committed Sep 11, 2023
1 parent c848b0b commit cf568bd
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 9 deletions.
6 changes: 6 additions & 0 deletions src/ff8.h
Original file line number Diff line number Diff line change
Expand Up @@ -1125,6 +1125,12 @@ struct ff8_externals
uint32_t sub_54D7E0;
uint32_t sub_54FDA0;
uint32_t worldmap_with_fog_sub_53FAC0;
char* worldmap_windows_idx_map;
int (*world_dialog_assign_text_sub_543790)(int,int,char*);
uint32_t sub_543CB0;
uint32_t sub_5484B0;
uint32_t sub_54A230;
uint32_t sub_54E9B0;
uint32_t sub_550070;
int (*sub_541C80)(int);
uint32_t sub_54B460;
Expand Down
4 changes: 4 additions & 0 deletions src/ff8/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ std::string ff8_decode_text(const char* encoded_text)
if (last_char != char(NULL) && last_char < 0x20)
{
switch (last_char){
case 0x2:
ret.append(" ");
ret.append(ff8_table[current_char - 0x20]);
break;
case 0x3:
if(current_char>=0x30 && current_char<=0x3a)
ret.append(ff8_names[index-0x30]);
Expand Down
7 changes: 7 additions & 0 deletions src/ff8_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,13 @@ void ff8_find_externals()
ff8_externals.battle_trigger_worldmap = ff8_externals.worldmap_with_fog_sub_53FAC0 + 0x4EA;
}

ff8_externals.world_dialog_assign_text_sub_543790 = (int (*)(int,int,char*))get_relative_call(ff8_externals.sub_54D7E0, 0x72);
ff8_externals.worldmap_windows_idx_map = (char*)get_absolute_value((uint32_t)ff8_externals.world_dialog_assign_text_sub_543790, 0x3B);
ff8_externals.sub_543CB0 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, 0xA55);
ff8_externals.sub_5484B0 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, 0x5C9);
ff8_externals.sub_54A230 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, 0x5CF);
ff8_externals.sub_54E9B0 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, 0x369);

ff8_externals.sub_548080 = get_relative_call(ff8_externals.worldmap_sub_53F310_loc_53F7EE, 0x9B);
ff8_externals.sub_541C80 = (int (*)(int))get_relative_call(ff8_externals.battle_trigger_worldmap, 0);

Expand Down
74 changes: 65 additions & 9 deletions src/voice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ struct opcode_message_status
bool is_voice_acting = false;
WORD message_last_transition = 0;
byte message_last_option = UCHAR_MAX;
byte message_dialog_id = 0;
int message_dialog_id = 0;
byte char_id = 0;
message_kind message_kind = message_kind::NONE;
std::string field_name = "";
Expand All @@ -98,7 +98,7 @@ int (*ff8_opcode_old_ask)(int);
int (*ff8_opcode_old_aask)(int);
int (*ff8_opcode_old_drawpoint)(int);

int ff8_get_field_dialog_string_id = -1;
int ff8_current_window_dialog_id = -1;
std::map<int, int> ff8_field_window_stack_count;
std::map<int, char*> ff8_battle_actor_name;

Expand Down Expand Up @@ -872,11 +872,20 @@ char* ff8_battle_get_actor_name(int idx)

char *ff8_field_get_dialog_string(char *msg, int dialog_id)
{
ff8_get_field_dialog_string_id = dialog_id;
ff8_current_window_dialog_id = dialog_id;

return msg + *(uint32_t *)(msg + 4 * dialog_id);
}

int ff8_world_dialog_assign_text(int idx, int dialog_id, char *text)
{
int window_id = *(ff8_externals.worldmap_windows_idx_map + 0x10 * idx);

current_opcode_message_status[window_id].message_dialog_id = dialog_id;

return ff8_externals.world_dialog_assign_text_sub_543790(idx, dialog_id, text);
}

int ff8_opcode_voice_drawpoint(int unk)
{
byte idx = *(byte *)(unk + 388);
Expand All @@ -889,11 +898,11 @@ int ff8_opcode_voice_drawpoint(int unk)
int ret = ff8_opcode_old_drawpoint(unk);

current_opcode_message_status[window_id].message_page_count = magic_id;
current_opcode_message_status[window_id].message_dialog_id = ff8_get_field_dialog_string_id;
current_opcode_message_status[window_id].message_dialog_id = ff8_current_window_dialog_id;
current_opcode_message_status[window_id].message_kind = message_kind::DRAWPOINT;
current_opcode_message_status[window_id].field_name = "_drawpoint";

if (ff8_get_field_dialog_string_id == 4)
if (ff8_current_window_dialog_id == 4)
{
if (opcode_ask_current_option == UCHAR_MAX)
current_opcode_message_status[window_id].message_last_option = opcode_ask_current_option = default_option;
Expand Down Expand Up @@ -1047,6 +1056,7 @@ int ff8_show_dialog(int window_id, int state, int a3)
bool _is_dialog_starting = is_dialog_starting(current_opcode_message_status[window_id].message_last_transition, win->open_close_transition);
bool _is_dialog_paging = is_dialog_paging(current_opcode_message_status[window_id].message_last_opcode, message_current_opcode);
bool _is_dialog_option_changed = (current_opcode_message_status[window_id].message_last_option != opcode_ask_current_option);
bool _is_dialog_closing = is_dialog_closing(current_opcode_message_status[window_id].message_last_transition, win->open_close_transition);
bool _is_dialog_closed = is_dialog_closed(current_opcode_message_status[window_id].message_last_transition, win->open_close_transition);
bool _is_dialog_ask = (message_kind == message_kind::ASK) || (message_kind == message_kind::DRAWPOINT);

Expand All @@ -1055,8 +1065,6 @@ int ff8_show_dialog(int window_id, int state, int a3)
// Skip voice over on Tutorials
if (mode->driver_mode == MODE_FIELD)
{
bool _is_dialog_closing = is_dialog_closing(current_opcode_message_status[window_id].message_last_transition, win->open_close_transition);

if (_is_dialog_opening)
{
opcode_ask_current_option = UCHAR_MAX;
Expand Down Expand Up @@ -1093,7 +1101,7 @@ int ff8_show_dialog(int window_id, int state, int a3)
simulate_OK_disabled[window_id] = false;
current_opcode_message_status[window_id].is_voice_acting = false;
opcode_ask_current_option = UCHAR_MAX;
ff8_get_field_dialog_string_id = -1;
ff8_current_window_dialog_id = -1;
if (message_kind == message_kind::MESSAGE)
{
if (ff8_field_window_stack_count[*common_externals.current_field_id] > 0)
Expand Down Expand Up @@ -1127,7 +1135,7 @@ int ff8_show_dialog(int window_id, int state, int a3)
std::string actor_name = ff8_decode_text(ff8_battle_actor_name[LOBYTE(*ff8_externals.battle_current_actor_talking)]);
std::string tokenized_actor = tokenize_text(actor_name);

if (trace_all || trace_opcodes) ffnx_trace("[BATTLE]: Scene ID: %u, Actor: %s, Text: %s\n", *ff8_externals.battle_encounter_id, actor_name.c_str(), decoded_text.c_str());
if (trace_all || trace_opcodes) ffnx_trace("[BATTLE]: scene_id=%u,actor=%s,text=%s\n", *ff8_externals.battle_encounter_id, actor_name.c_str(), decoded_text.c_str());

char voice_file[MAX_PATH];
sprintf(voice_file, "_battle/%s/%s", tokenized_actor.c_str(), tokenized_dialogue.c_str());
Expand All @@ -1141,6 +1149,37 @@ int ff8_show_dialog(int window_id, int state, int a3)

current_opcode_message_status[window_id].message_dialog_id = win->field_30;
}
else if (mode->driver_mode == MODE_WORLDMAP)
{
if (_is_dialog_opening)
{
begin_voice(window_id);
current_opcode_message_status[window_id].message_dialog_id = dialog_id;
}
else if (_is_dialog_starting)
{
if (dialog_id < 0)
{
std::string decoded_text = ff8_decode_text(win->text_data1);
std::string tokenized_dialogue = tokenize_text(decoded_text);
if (trace_all || trace_opcodes) ffnx_trace("[WORLD]: window_id=%u,text=%s\n", window_id, decoded_text.c_str());

char voice_file[MAX_PATH];
sprintf(voice_file, "_world/text/%s", tokenized_dialogue.c_str());
current_opcode_message_status[window_id].is_voice_acting = nxAudioEngine.playVoice(voice_file, 0, voice_volume);
}
else
{
if (trace_all || trace_opcodes) ffnx_trace("[WORLD]: window_id=%u,dialog_id=%d\n", window_id, current_opcode_message_status[window_id].message_dialog_id);
current_opcode_message_status[window_id].is_voice_acting = play_voice("_world", window_id, current_opcode_message_status[window_id].message_dialog_id, current_opcode_message_status[window_id].message_page_count);
}
}
else if (_is_dialog_closing)
{
end_voice(window_id);
current_opcode_message_status[window_id].is_voice_acting = false;
}
}

current_opcode_message_status[window_id].message_last_opcode = message_current_opcode;
current_opcode_message_status[window_id].message_last_transition = win->open_close_transition;
Expand Down Expand Up @@ -1185,6 +1224,7 @@ void voice_init()
}
else
{
// == Field ==
// All possible message and ask windows
ff8_opcode_old_mes = (int (*)(int))ff8_externals.opcode_mes;
patch_code_dword((uint32_t)&common_externals.execute_opcode_table[0x47], (DWORD)&ff8_opcode_voice_mes);
Expand All @@ -1209,7 +1249,23 @@ void voice_init()

replace_function(ff8_externals.field_get_dialog_string, ff8_field_get_dialog_string);
replace_call(ff8_externals.sub_4A0C00 + 0x5F, ff8_show_dialog);

// == Battle ==
replace_function(ff8_externals.battle_get_monster_name_sub_495100, ff8_battle_get_monster_name);
replace_function(ff8_externals.battle_get_actor_name_sub_47EAF0, ff8_battle_get_actor_name);

// == World Map ==
replace_call_function(ff8_externals.sub_543CB0 + 0x638, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_5484B0 + 0x524, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54A230 + 0xF, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54D7E0 + 0x72, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0x206, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0x396, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0x3D2, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0x67D, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0x6A6, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54E9B0 + 0xEED, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54FDA0 + 0xAE, ff8_world_dialog_assign_text);
replace_call_function(ff8_externals.sub_54FDA0 + 0x178, ff8_world_dialog_assign_text);
}
}

0 comments on commit cf568bd

Please sign in to comment.