diff --git a/config/RSBE01_02/symbols.txt b/config/RSBE01_02/symbols.txt index fedea1b01..062007555 100644 --- a/config/RSBE01_02/symbols.txt +++ b/config/RSBE01_02/symbols.txt @@ -4281,7 +4281,7 @@ fn_800A6668 = .text:0x800A6668; // type:function size:0x258 __ct__21cmMenuFixedControllerFv = .text:0x800A68C0; // type:function size:0x44 storeDefault__21cmMenuFixedControllerFv = .text:0x800A6904; // type:function size:0x3C init__21cmMenuFixedControllerFv = .text:0x800A6940; // type:function size:0x6C -fn_800A69AC = .text:0x800A69AC; // type:function size:0xCC +update__21cmMenuFixedControllerFf = .text:0x800A69AC; // type:function size:0xCC fn_800A6A78 = .text:0x800A6A78; // type:function size:0x1C fn_800A6A94 = .text:0x800A6A94; // type:function size:0x40 fn_800A6AD4 = .text:0x800A6AD4; // type:function size:0xA4 diff --git a/configure.py b/configure.py index d44984a5b..3bfb6e6c9 100755 --- a/configure.py +++ b/configure.py @@ -334,7 +334,7 @@ def MatchingFor(*versions): Object(Matching, "sora/mv/mv_THPAudioDecode.cpp"), Object(Matching, "sora/mv/mv_THPRead.cpp"), Object(Matching, "sora/cm/cm_controller_default.cpp", extra_cflags=["-RTTI off"]), - Object(NonMatching, "sora/cm/cm_controller_menu_fixed.cpp"), + Object(Matching, "sora/cm/cm_controller_menu_fixed.cpp"), Object(Matching, "sora/cm/cm_controller_melee_fixed.cpp"), Object(Matching, "sora/cm/cm_stage_param.cpp"), Object(NonMatching, "sora/ty/ty_fig_listmng.cpp"), diff --git a/src/sora/cm/cm_controller_menu_fixed.cpp b/src/sora/cm/cm_controller_menu_fixed.cpp index e2d3f9c93..04d6cae5b 100644 --- a/src/sora/cm/cm_controller_menu_fixed.cpp +++ b/src/sora/cm/cm_controller_menu_fixed.cpp @@ -34,19 +34,33 @@ void cmMenuFixedController::storeDefault() { unk8 = true; } -// NONMATCHING void cmMenuFixedController::init() { - m_cameraManager->m_cameras[0].unkCC = unkC; - m_cameraManager->m_cameras[0].unkFA.m_flag7 = true; - m_cameraManager->m_cameras[0].m_targetPos.m_x = unk10.m_x; - m_cameraManager->m_cameras[0].m_targetPos.m_y = unk10.m_y; - m_cameraManager->m_cameras[0].m_targetPos.m_z = unk10.m_z; - m_cameraManager->m_cameras[0].unkFA.m_flag1 = true; - m_cameraManager->m_cameras[0].unkD0 = unk1C; - m_cameraManager->m_cameras[0].m_rot.m_x = 0.0f; - m_cameraManager->m_cameras[0].m_rot.m_y = 0.0f; - m_cameraManager->m_cameras[0].m_rot.m_z = 0.0f; - m_cameraManager->m_cameras[0].unkFA.m_flag2 = true; + gfCamera& cam = m_cameraManager->m_cameras[0]; + cam.unkCC = unkC; + // Setting m_flag7 through the mask keeps the original read live, which is + // what lets the later two writes chain off it. + u16 flags = cam.unkFA.m_mask; + cam.unkFA.m_mask = flags | 0x80; + cam.m_targetPos.m_x = unk10.m_x; + cam.m_targetPos.m_y = unk10.m_y; + cam.m_targetPos.m_z = unk10.m_z; + cam.unkFA.m_flag1 = true; + cam.unkD0 = unk1C; + Vec2f xy(0.0f, 0.0f); + cam.m_rot.m_x = xy.m_x; + cam.m_rot.m_y = xy.m_y; + cam.m_rot.m_z = 0.0f; + cam.unkFA.m_rotate = true; } -// TODO: cmMenuFixedController::update +extern "C" void fn_80018778(gfCameraManager*); + +void cmMenuFixedController::update(float) { + gfCameraManager* mgr = m_cameraManager; + if (!unk8) { + storeDefault(); + } + init(); + mgr->m_cameras[0].m_transformFlag.m_mask = 0xE1; + fn_80018778(mgr); +}