diff --git a/include/dusk/frame_interpolation.h b/include/dusk/frame_interpolation.h index 8c19e7e59b..0fa8c208bd 100644 --- a/include/dusk/frame_interpolation.h +++ b/include/dusk/frame_interpolation.h @@ -17,6 +17,7 @@ void ensure_initialized(); void begin_record(); void end_record(); void begin_sim_tick(); +uint64_t sim_tick_seq(); void begin_frame(bool enabled, bool is_sim_frame, float step); void interpolate(); float get_interpolation_step(); diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index 498d3de173..8c82b5dc6c 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -7562,12 +7562,7 @@ void daAlink_c::setBlendMoveAnime(f32 i_morf) { f32 sp2C; f32 sp28 = mpHIO->mMove.m.mFootPositionRatio; BOOL sp24 = checkEventRun(); - BOOL sp20 = checkBootsMoveAnime(1); -#if TARGET_PC - if (dusk::getSettings().game.enableFastIronBoots) { - sp20 = FALSE; - } -#endif + BOOL sp20 = checkBootsMoveAnime(1) IF_DUSK(&& !dusk::getSettings().game.enableFastIronBoots); f32 var_f29; @@ -8080,7 +8075,7 @@ void daAlink_c::setBlendAtnBackMoveAnime(f32 i_morf) { daAlink_ANM var_r27; daAlink_ANM var_r29; - if (checkBootsMoveAnime(1)) { + if (checkBootsMoveAnime(1) IF_DUSK(&& !dusk::getSettings().game.enableFastIronBoots)) { mMaxSpeed = mpHIO->mAtnMove.m.mMaxBackwardsSpeed; var_f27 = mpHIO->mAtnMove.m.mMinBackWalkFrame; var_f31 = mpHIO->mAtnMove.m.mBackWalkChangeRate; diff --git a/src/d/actor/d_a_e_mk.cpp b/src/d/actor/d_a_e_mk.cpp index c3a684ea8e..8099419410 100644 --- a/src/d/actor/d_a_e_mk.cpp +++ b/src/d/actor/d_a_e_mk.cpp @@ -157,6 +157,21 @@ static void* s_h_sub(void* i_actor, void* i_data) { return NULL; } +#if TARGET_PC +static void sort_target_info_by_id() { + for (int i = 1; i < target_info_count; i++) { + void* key = target_info[i]; + fpc_ProcID key_id = fopAcM_GetID(key); + int j = i - 1; + while (j >= 0 && fopAcM_GetID(target_info[j]) > key_id) { + target_info[j + 1] = target_info[j]; + j--; + } + target_info[j + 1] = key; + } +} +#endif + static daPillar_c* search_hasira(e_mk_class* i_this) { fopEn_enemy_c* actor = (fopEn_enemy_c*)&i_this->actor; daPillar_c* pillar_p; @@ -170,6 +185,9 @@ static daPillar_c* search_hasira(e_mk_class* i_this) { if (i_this->firstHasiraFlag == 0) { i_this->firstHasiraFlag++; +#if TARGET_PC + sort_target_info_by_id(); +#endif return (daPillar_c*)target_info[TREG_S(7) + 5]; } diff --git a/src/d/actor/d_a_horse.cpp b/src/d/actor/d_a_horse.cpp index 68112eba47..16790d42ff 100644 --- a/src/d/actor/d_a_horse.cpp +++ b/src/d/actor/d_a_horse.cpp @@ -22,6 +22,7 @@ #if TARGET_PC #include "dusk/dusk.h" +#include "dusk/frame_interpolation.h" namespace { // FRAME INTERP NOTE: Sim tick control point snapshots for interpolation @@ -32,6 +33,7 @@ int s_horseReinSimNumPrev; int s_horseReinSimNumCurr; bool s_horseReinSimPrevValid; bool s_horseReinSimCurrValid; +uint64_t s_horseReinSimRolledSeq; } // namespace #endif @@ -3033,10 +3035,14 @@ void daHorse_c::copyReinPos() { } #if TARGET_PC if (field_0x1204 > 0) { - if (s_horseReinSimCurrValid && s_horseReinSimNumCurr > 0) { - memcpy(s_horseReinSimPrev, s_horseReinSimCurr, s_horseReinSimNumCurr * sizeof(cXyz)); - s_horseReinSimNumPrev = s_horseReinSimNumCurr; - s_horseReinSimPrevValid = true; + const uint64_t simSeq = dusk::frame_interp::sim_tick_seq(); + if (simSeq != s_horseReinSimRolledSeq) { + s_horseReinSimRolledSeq = simSeq; + if (s_horseReinSimCurrValid && s_horseReinSimNumCurr > 0) { + memcpy(s_horseReinSimPrev, s_horseReinSimCurr, s_horseReinSimNumCurr * sizeof(cXyz)); + s_horseReinSimNumPrev = s_horseReinSimNumCurr; + s_horseReinSimPrevValid = true; + } } memcpy(s_horseReinSimCurr, m_reinLine.getPos(0), field_0x1204 * sizeof(cXyz)); s_horseReinSimNumCurr = field_0x1204; diff --git a/src/d/d_bright_check.cpp b/src/d/d_bright_check.cpp index fc6924c9e7..ccb04c69e5 100644 --- a/src/d/d_bright_check.cpp +++ b/src/d/d_bright_check.cpp @@ -143,13 +143,12 @@ void dBrightCheck_c::modeMove() { if (mDoCPd_c::getTrigA(PAD_1) || mDoCPd_c::getTrigStart(PAD_1)) { mDoAud_seStart(Z2SE_ENTER_GAME, NULL, 0, 0); #ifdef TARGET_PC - dusk::speedrun::start(); - if (dusk::getSettings().game.speedrunMode && !dusk::getSettings().game.hideTvSettingsScreen) { // start a new run if a run isn't already in progress if (!dusk::m_speedrunInfo.m_isRunStarted) { dusk::resetForSpeedrunMode(); dusk::m_speedrunInfo.startRun(); + dusk::speedrun::start(); } } diff --git a/src/d/d_menu_window.cpp b/src/d/d_menu_window.cpp index 7f76f807df..e2e7b4e91f 100644 --- a/src/d/d_menu_window.cpp +++ b/src/d/d_menu_window.cpp @@ -26,6 +26,10 @@ #include "f_op/f_op_overlap_mng.h" #include "m_Do/m_Do_controller_pad.h" +#ifdef TARGET_PC +#include "dusk/frame_interpolation.h" +#endif + class dDlst_MENU_CAPTURE_c : public dDlst_base_c { public: virtual void draw() { @@ -1088,6 +1092,10 @@ void dMw_c::dMw_ring_create(u8 i_origin) { } mpCapture->setCaptureFlag(); + +#ifdef TARGET_PC + dusk::frame_interp::request_presentation_sync(); +#endif } bool dMw_c::dMw_ring_delete() { diff --git a/src/d/d_name.cpp b/src/d/d_name.cpp index e4b4b91b00..abc7512f14 100644 --- a/src/d/d_name.cpp +++ b/src/d/d_name.cpp @@ -77,16 +77,16 @@ static const char* l_mojiEisu[65] = { // That can't work on a modern platform, so instead I've filled them out ahead of time. static const char* l_mojiEisuPal_1[65] = { "A", "N", "\xC0", "\xCF", "1", "B", "O", "\xC1", "\xD0", "2", "C", "P", "\xC2", "\xD1", "3", "D", "Q", - "\xC3", "\xD2", "4", "E", "R", "\xC4", "\xD3", "5", "F", "S", "\xC5", "\xD4", "6", "G", "T", "\xC6", "\xD5", - "7", "H", "U", "\xC7", "\xD6", "8", "I", "V", "\xC8", "\xD7", "9", "J", "W", "\xC9", "\xD8", "0", "K", - "X", "\xCA", "\xD9", ",", "L", "Y", "\xCB", "\xDA", ".", "M", "Z", "\xCC", "\xDB", " ", + "\xC4", "\xD2", "4", "E", "R", "\xC6", "\xD3", "5", "F", "S", "\xC7", "\xD4", "6", "G", "T", "\xC8", "\xD6", + "7", "H", "U", "\xC9", "\x8C", "8", "I", "V", "\xCA", "\xD9", "9", "J", "W", "\xCB", "\xDA", "0", "K", + "X", "\xCC", "\xDB", ",", "L", "Y", "\xCD", "\xDC", ".", "M", "Z", "\xCE", "\x2D", " ", }; static const char* l_mojiEisuPal_2[65] = { "a", "n", "\xE0", "\xEF", "1", "b", "o", "\xE1", "\xF0", "2", "c", "p", "\xE2", "\xF1", "3", "d", "q", - "\xE3", "\xF2", "4", "e", "r", "\xE4", "\xF3", "5", "f", "s", "\xE5", "\xF4", "6", "g", "t", "\xE6", - "\xF5", "7", "h", "u", "\xE7", "\xF6", "8", "i", "v", "\xE8", "\xF7", "9", "j", "w", "\xE9", "\xF8", "0", - "k", "x", "\xEA", "\xF9", ",", "l", "y", "\xEB", "\xFA", ".", "m", "z", "\xEC", "\xFB", " ", + "\xE4", "\xF2", "4", "e", "r", "\xE6", "\xF3", "5", "f", "s", "\xE7", "\xF4", "6", "g", "t", "\xE8", + "\xF6", "7", "h", "u", "\xE9", "\x9C", "8", "i", "v", "\xEA", "\xF9", "9", "j", "w", "\xEB", "\xFA", "0", + "k", "x", "\xEC", "\xFB", ",", "l", "y", "\xED", "\xFC", ".", "m", "z", "\xEE", "\xDF", " ", }; #elif REGION_PAL static const char* l_mojiEisuPal_1[65] = { diff --git a/src/d/d_s_name.cpp b/src/d/d_s_name.cpp index c3ae12e992..92f5a6c518 100644 --- a/src/d/d_s_name.cpp +++ b/src/d/d_s_name.cpp @@ -10,6 +10,7 @@ #include "d/d_meter2_info.h" #include "d/d_s_name.h" #include "dusk/imgui/ImGuiConsole.hpp" +#include "dusk/livesplit.h" #include "dusk/memory.h" #include "dusk/speedrun.h" #include "dusk/settings.h" @@ -422,6 +423,7 @@ void dScnName_c::changeGameScene() { if (!dusk::m_speedrunInfo.m_isRunStarted) { dusk::resetForSpeedrunMode(); dusk::m_speedrunInfo.startRun(); + dusk::speedrun::start(); } } diff --git a/src/dusk/frame_interpolation.cpp b/src/dusk/frame_interpolation.cpp index ff54e3b463..06cc70c330 100644 --- a/src/dusk/frame_interpolation.cpp +++ b/src/dusk/frame_interpolation.cpp @@ -21,6 +21,7 @@ bool g_sync_presentation = false; float g_step = 0.0f; bool g_is_sim_frame = false; bool g_ui_tick_pending = false; +uint64_t g_sim_tick_seq = 0; Recording g_current_recording; Recording g_previous_recording; @@ -134,6 +135,11 @@ void begin_sim_tick() { s_interpolationCallBackWork.clear(); s_cam_prev = std::move(s_cam_curr); + ++g_sim_tick_seq; +} + +uint64_t sim_tick_seq() { + return g_sim_tick_seq; } void begin_frame(bool enabled, bool is_sim_frame, float step) { diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 4bfdebd39c..7ca6056d87 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -1199,7 +1199,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { addCheat("Always Greatspin", getSettings().game.alwaysGreatspin, "Allows the Great Spin attack without requiring full health."); addCheat("Fast Iron Boots", getSettings().game.enableFastIronBoots, - "Speeds up movement while wearing the Iron Boots."); + "Speeds up movement while heavy, including wearing the Iron Boots, holding the Ball and Chain, wearing Magic Armor without rupees, etc."); addCheat("Can Transform Anywhere", getSettings().game.canTransformAnywhere, "Allows transforming even if NPCs are looking."); addCheat("Fast Roll", getSettings().game.fastRoll, diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 2e7e5b531e..72219e98dd 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -807,7 +807,7 @@ static void duskExecute() { } if (dusk::getSettings().game.infiniteRupees) { - dComIfGs_setRupee(9999); + dComIfGs_setRupee(dComIfGs_getRupeeMax()); } if (dusk::getSettings().game.infiniteOxygen) {