Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- External movies: Always enable external_movies by default ( https://github.com/julianxhokaxhiu/FFNx/pull/854 )
- External music: Fix music stopping too soon if the music is not looped ( https://github.com/julianxhokaxhiu/FFNx/pull/889 )
- External textures: Convert RGB png to RGBA and RGBA64 to RGBA32 ( https://github.com/julianxhokaxhiu/FFNx/pull/896 )
- Renderer: Skip rendering frame if no draw commands have been submitted previously

## FF7
Expand All @@ -17,7 +18,7 @@

## FF8

- Core: Fix crashes happening in Non-US versions ( https://github.com/julianxhokaxhiu/FFNx/pull/848 )
- Core: Fix crashes happening in Non-US versions ( https://github.com/julianxhokaxhiu/FFNx/pull/848 https://github.com/julianxhokaxhiu/FFNx/pull/896 )
- Core: Fix the game engine to show up to 16 high res field models without crashes or texture glitches ( https://github.com/julianxhokaxhiu/FFNx/pull/860 )
- Core: Fix sudden black frame between New Game movie and Infirmary intro scene
- Core: Fix missing polygons on field 3D models ( https://github.com/julianxhokaxhiu/FFNx/pull/868 )
Expand Down
20 changes: 13 additions & 7 deletions src/audio.cpp
Comment thread
julianxhokaxhiu marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,15 @@ void NxAudioEngine::loadConfig()
}
catch (const toml::parse_error &err)
{
ffnx_warning("Parse error while opening the file %s. Will continue with the default settings.\n", _fullpath);
ffnx_warning("%s (Line %u Column %u)\n", err.what(), err.source().begin.line, err.source().begin.column);
if (!fileExists(_fullpath))
{
ffnx_warning("File %s not found. Will continue with the default settings.\n", _fullpath);
}
else
{
ffnx_warning("Parse error while opening the file %s. Will continue with the default settings.\n", _fullpath);
ffnx_warning("%s (Line %u Column %u)\n", err.what(), err.source().begin.line, err.source().begin.column);
}
Comment thread
myst6re marked this conversation as resolved.

nxAudioEngineConfig[type] = toml::parse("");
}
Expand Down Expand Up @@ -565,19 +572,18 @@ void NxAudioEngine::cleanOldAudioSources()
if (trace_all || trace_music) ffnx_trace("NxAudioEngine::%s: %d elements in the list after cleaning\n", __func__, _audioSourcesToDeleteLater.size());
}

SoLoud::AudioSource* NxAudioEngine::loadMusic(const char* name, bool isFullPath, const char* format, bool suppressOpeningSilence)
SoLoud::AudioSource* NxAudioEngine::loadMusic(const char* name, bool useNameAsFullPath, const char* format, bool suppressOpeningSilence)
{
SoLoud::AudioSource* music = nullptr;
char filename[MAX_PATH];
bool exists = false;

if (isFullPath)
if (useNameAsFullPath)
{
exists = fileExists(name);
exists = true;
strcpy(filename, name);
}

if (!exists)
Comment thread
julianxhokaxhiu marked this conversation as resolved.
else
{
exists = getFilenameFullPath(filename, name, NxAudioEngineLayer::NXAUDIOENGINE_MUSIC);
}
Expand Down
2 changes: 1 addition & 1 deletion src/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ class NxAudioEngine
SoLoud::time _lastVolumeFadeEndTime = 0.0;

void cleanOldAudioSources();
SoLoud::AudioSource* loadMusic(const char* name, bool isFullPath = false, const char* format = nullptr, bool suppressOpeningSilence = false);
SoLoud::AudioSource* loadMusic(const char* name, bool useNameAsFullPath = false, const char* format = nullptr, bool suppressOpeningSilence = false);
void overloadPlayArgumentsFromConfig(char* name, uint32_t *id, MusicOptions *MusicOptions);
void backupMusic(int channelSource);
void restoreMusic(int channelDest, double stopTime = 0);
Expand Down
2 changes: 1 addition & 1 deletion src/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2988,7 +2988,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
return FALSE;
}

bool is_genuine_steam_api = isFileSigned(L"steam_api.dll");
bool is_genuine_steam_api = isFileSigned("steam_api.dll");
if (!is_genuine_steam_api) is_genuine_steam_api = sha1_file("steam_api.dll") == "03bd9f3e352553a0af41f5fe006f6249a168c243";
if (!is_genuine_steam_api)
{
Expand Down
29 changes: 27 additions & 2 deletions src/ff8.h
Original file line number Diff line number Diff line change
Expand Up @@ -1008,7 +1008,7 @@ struct ff8_gfx_driver

struct ff8_field_state_common {
uint8_t stack_data[0x140];
uint32_t field_140;
uint32_t return_value;
uint32_t field_144;
uint32_t field_148;
uint32_t field_14c;
Expand Down Expand Up @@ -1066,6 +1066,30 @@ struct ff8_field_state_background {
uint8_t field_1b3;
};

struct ff8_field_state_other {
ff8_field_state_common common;
uint8_t gap1[114];
uint16_t current_triangle_id;
uint8_t gap1b[28];
int16_t model_id;
uint8_t gap2[47];
uint8_t pushonoff;
uint8_t gap3;
uint8_t talkonoff;
uint8_t throughonoff;
uint8_t gap4[2];
uint8_t baseanim1;
uint8_t baseanim2;
uint8_t baseanim3;
uint8_t ladderanim1;
uint8_t ladderanim2;
uint8_t ladderanim3;
uint8_t setpc;
uint8_t gap5;
uint8_t setgeta;
uint8_t gap6[12];
};

struct ff8_char_computed_stats {
uint8_t unk1[370];
uint16_t curr_hp;
Expand Down Expand Up @@ -1276,6 +1300,8 @@ struct ff8_externals
int (*field_scripts_init)(int, int, int, int);
uint8_t *field_state_background_count;
ff8_field_state_background **field_state_backgrounds;
uint8_t *field_state_other_count;
ff8_field_state_other **field_state_others;
uint32_t load_field_models;
uint32_t chara_one_read_file;
uint32_t chara_one_seek_file;
Expand Down Expand Up @@ -1691,7 +1717,6 @@ struct ff8_externals
uint32_t scan_text_positions;
uint32_t fps_limiter;
double *time_volume_change_related_1A78BE0;
uint32_t* game_mode_obj_1D9CF88;
uint32_t field_vars_stack_1CFE9B8;
uint32_t get_card_name;
uint32_t card_name_positions;
Expand Down
14 changes: 4 additions & 10 deletions src/ff8/mod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,8 @@ bool TextureImage::createImage(const char *filename, int originalTexturePixelWid
const char *extension = strrchr(filename, '.');
if (extension != nullptr && stricmp(extension + 1, "png") == 0) {
// Load PNG using libPNG
bimg::ImageMip mip;
if (loadPng(filename, mip, targetFormat) && Renderer::doesItFitInMemory(mip.m_size + 1))
{
_image = bimg::imageAlloc(&defaultAllocator, mip.m_format, mip.m_width, mip.m_height, mip.m_depth, 1, false, false, mip.m_data);
setLod(0);

driver_free((void *)mip.m_data);
}
_image = loadPng(&defaultAllocator, filename, targetFormat);
setLod(0);
} else if (extension != nullptr && stricmp(extension + 1, "dds") == 0) {
// Load DDS using DirectXTex
DirectX::TexMetadata metadata;
Expand All @@ -68,7 +62,7 @@ bool TextureImage::createImage(const char *filename, int originalTexturePixelWid
setLod(0);
}
} else {
_image = loadImageContainer(&defaultAllocator, filename, bimg::TextureFormat::BGRA8);
_image = loadImageContainer(&defaultAllocator, filename, targetFormat);

if (_image != nullptr)
{
Expand Down Expand Up @@ -541,7 +535,7 @@ TexturePacker::TextureTypes TextureBackground::drawToImage(
const bimg::ImageMip &mip = _texture.mip();
const uint32_t *imgData = reinterpret_cast<const uint32_t *>(mip.m_data);
const uint8_t imgScale = _texture.scale();
const uint32_t imgWidth = mip.m_width / imgScale, imgHeight = mip.m_height / imgScale;
const uint32_t imgWidth = mip.m_width / imgScale;

const uint8_t cols = targetW / TILE_SIZE, rows = targetH / TILE_SIZE;
const uint8_t colsBpp = TILE_SIZE / (1 << uint16_t(targetBpp));
Expand Down
9 changes: 5 additions & 4 deletions src/ff8_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,8 @@ void ff8_find_externals()
ff8_externals.field_scripts_init = (int(*)(int,int,int,int))(get_relative_call(ff8_externals.read_field_data, JP_VERSION ? 0xEDC : 0xE49));
ff8_externals.field_state_background_count = (uint8_t *)get_absolute_value(uint32_t(ff8_externals.field_scripts_init), 0x2CD + 0x1);
ff8_externals.field_state_backgrounds = (ff8_field_state_background **)get_absolute_value(uint32_t(ff8_externals.field_scripts_init), 0x50B + 0x2);
ff8_externals.field_state_other_count = (uint8_t *)get_absolute_value(uint32_t(ff8_externals.field_scripts_init), 0x2C3 + 0x1);
ff8_externals.field_state_others = (ff8_field_state_other **)get_absolute_value(uint32_t(ff8_externals.field_scripts_init), 0x62C + 0x2);
ff8_externals.load_field_models = get_relative_call(ff8_externals.read_field_data, JP_VERSION ? 0xFA2 : 0xF0F);
ff8_externals.chara_one_read_file = get_relative_call(ff8_externals.load_field_models, 0x15F);
ff8_externals.chara_one_seek_file = get_relative_call(ff8_externals.load_field_models, 0x582);
Expand Down Expand Up @@ -813,7 +815,7 @@ void ff8_find_externals()
ff8_externals.sub_54A230 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, 0x5D1);
ff8_externals.sub_543CB0 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, JP_VERSION ? 0xA3C : 0xA47);
ff8_externals.worldmap_update_steps_sub_6519D0 = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, JP_VERSION ? 0x8C4 : 0x8CD);
ff8_externals.set_drawpoint_state_521D90 = (void(*)(uint8_t, char))get_relative_call(ff8_externals.sub_54E9B0, 0x85F);
ff8_externals.set_drawpoint_state_521D90 = (void(*)(uint8_t, char))get_relative_call(ff8_externals.sub_54E9B0, FF8_SP_VERSION ? 0x89A : 0x85F);
ff8_externals.set_render_to_vram_current_screen_flag_before_battle = get_relative_call(ff8_externals.worldmap_with_fog_sub_53FAC0, JP_VERSION ? 0xB24 : 0xB2F);

ff8_externals.sub_545F10 = get_relative_call(ff8_externals.sub_545EA0, 0x1C);
Expand Down Expand Up @@ -875,7 +877,7 @@ void ff8_find_externals()
ff8_externals.battle_sub_4877F0 = get_relative_call(ff8_externals.sub_485610, 0x6F);
ff8_externals.battle_sub_48D200 = get_relative_call(ff8_externals.sub_485610, 0x323);
ff8_externals.battle_ai_opcode_sub_487DF0 = get_relative_call(ff8_externals.battle_sub_4877F0, 0x82);
ff8_externals.update_tutorial_info_4AD170 = (void(*)(int))get_relative_call(ff8_externals.battle_ai_opcode_sub_487DF0, FF8_US_VERSION ? 0x216C : (JP_VERSION ? 0x2148 : 0x2176));
ff8_externals.update_tutorial_info_4AD170 = (void(*)(int))get_relative_call(ff8_externals.battle_ai_opcode_sub_487DF0, FF8_US_VERSION ? 0x216C : (JP_VERSION ? 0x2148 : (FF8_SP_VERSION ? 0x21A0 : 0x2176)));
ff8_externals.battle_get_draw_magic_amount_48FD20 = (int(*)(int, int, int))get_relative_call(ff8_externals.battle_sub_48D200, FF8_US_VERSION ? 0x354 : (JP_VERSION ? 0x36F : 0x355));
ff8_externals.sub_48B7E0 = get_relative_call(ff8_externals.sub_47CCB0, 0x8F0);
ff8_externals.compute_char_stats_sub_495960 = get_relative_call(ff8_externals.sub_48B7E0, 0xA3);
Expand Down Expand Up @@ -963,7 +965,7 @@ void ff8_find_externals()
ff8_externals.character_data_1CFE74C = (byte*)get_absolute_value((uint32_t)ff8_externals.battle_menu_add_exp_and_stat_bonus_496CB0, 0xD);
ff8_externals.battle_sub_485160 = get_relative_call(ff8_externals.sub_47CCB0, 0xB18);
ff8_externals.battle_sub_48FE20 = get_relative_call(ff8_externals.battle_sub_485160, 0x91);
ff8_externals.battle_sub_494410 = get_relative_call(ff8_externals.battle_sub_48FE20, FF8_US_VERSION ? 0x139C : (JP_VERSION ? 0x1300 : 0x1301));
ff8_externals.battle_sub_494410 = get_relative_call(ff8_externals.battle_sub_48FE20, FF8_US_VERSION ? 0x139C : (JP_VERSION ? 0x1300 : (FF8_SP_VERSION ? 0x130B : 0x1301)));
ff8_externals.battle_sub_494AF0 = (void(*)(int, int, int, int))get_relative_call(ff8_externals.battle_sub_494410, 0x525);

ff8_externals.fps_limiter = get_relative_call(ff8_externals.field_main_loop, 0x261);
Expand All @@ -973,7 +975,6 @@ void ff8_find_externals()
}
ff8_externals.time_volume_change_related_1A78BE0 = (double *)get_absolute_value(ff8_externals.fps_limiter, 0x3F);

ff8_externals.game_mode_obj_1D9CF88 = (uint32_t*)get_absolute_value(uint32_t(ff8_externals.sub_47CA90), 0xCD);
ff8_externals.field_vars_stack_1CFE9B8 = get_absolute_value(ff8_externals.opcode_pshm_w, 0x1E);

common_externals.current_triangle_id = 0x0;
Expand Down
4 changes: 2 additions & 2 deletions src/ff8_opengl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1837,7 +1837,7 @@ void ff8_init_hooks(struct game_obj *_game_object)

// draw magic from draw points
replace_call(ff8_externals.opcode_drawpoint + 0x6B7, (void*)ff8_opcode_drawpoint_sub_4A0850);
replace_call(ff8_externals.sub_54E9B0 + (FF8_US_VERSION ? 0x845 : 0x85F), (void*)ff8_set_drawpoint_state_52D190);
replace_call(ff8_externals.sub_54E9B0 + (FF8_US_VERSION ? 0x845 : (FF8_SP_VERSION ? 0x89A : 0x85F)), (void*)ff8_set_drawpoint_state_52D190);

// draw magic via stock in battle
replace_call(ff8_externals.battle_sub_48D200 + (FF8_US_VERSION ? 0x354 : (JP_VERSION ? 0x36F : 0x355)), (void*)ff8_battle_get_magic_draw_amount_48FD20);
Expand All @@ -1854,7 +1854,7 @@ void ff8_init_hooks(struct game_obj *_game_object)
replace_call(ff8_externals.worldmap_update_steps_sub_6519D0 + 0x225, (void*)ff8_play_sfx_at_unlock_rinoa_limit_break);

// omega destroyed
replace_call(ff8_externals.battle_ai_opcode_sub_487DF0 + (FF8_US_VERSION ? 0x216C : (JP_VERSION ? 0x2148 : 0x2176)), (void*)ff8_obtain_proof_of_omega);
replace_call(ff8_externals.battle_ai_opcode_sub_487DF0 + (FF8_US_VERSION ? 0x216C : (JP_VERSION ? 0x2148 : (FF8_SP_VERSION ? 0x21A0 : 0x2176))), (void*)ff8_obtain_proof_of_omega);

// pupu side quest
replace_call(ff8_externals.battle_check_won_sub_486500 + 0x66, (void*)ff8_battle_after_set_result_to_won_sub_494D40);
Expand Down
2 changes: 1 addition & 1 deletion src/field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ int ff8_field_init_from_file(int unk1, int unk2, int unk3, int unk4)
// Loop through objects until we find the one that has a valid triangle ID
for(int i = 0; i < MAXBYTE; i++)
{
common_externals.current_triangle_id = (int16_t*)(*ff8_externals.game_mode_obj_1D9CF88 + 0x264 * i + 0x1FA);
common_externals.current_triangle_id = (int16_t*)(*(uint32_t *)ff8_externals.field_state_others + 0x264 * i + 0x1FA);
if (*common_externals.current_triangle_id != 0) break;
}

Expand Down
Loading