diff --git a/config/SOUE01/rels/d_a_npc_volcano_f2_salboNP/symbols.txt b/config/SOUE01/rels/d_a_npc_volcano_f2_salboNP/symbols.txt index 52d172e5..0ebf0974 100644 --- a/config/SOUE01/rels/d_a_npc_volcano_f2_salboNP/symbols.txt +++ b/config/SOUE01/rels/d_a_npc_volcano_f2_salboNP/symbols.txt @@ -97,7 +97,7 @@ fn_61_4F40 = .text:0x00004F40; // type:function size:0x2E4 fn_61_5230 = .text:0x00005230; // type:function size:0x100 fn_61_5330 = .text:0x00005330; // type:function size:0x1D4 fn_61_5510 = .text:0x00005510; // type:function size:0x1A8 -fn_61_56C0 = .text:0x000056C0; // type:function size:0x4C +fn_61_56C0__12dAcNpcSlb2_cF7mVec3_cPC7mVec3_cPC4mAng = .text:0x000056C0; // type:function size:0x4C fn_61_5710 = .text:0x00005710; // type:function size:0x48 fn_61_5760 = .text:0x00005760; // type:function size:0x48 fn_61_57B0 = .text:0x000057B0; // type:function size:0x48 diff --git a/config/SOUE01/rels/d_t_scene_changeNP/symbols.txt b/config/SOUE01/rels/d_t_scene_changeNP/symbols.txt index 07ff8c96..a4a1c9aa 100644 --- a/config/SOUE01/rels/d_t_scene_changeNP/symbols.txt +++ b/config/SOUE01/rels/d_t_scene_changeNP/symbols.txt @@ -2,20 +2,20 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global dTgSceneChange_c_classInit__Fv = .text:0x00000070; // type:function size:0x4C -TgSceneChange__init = .text:0x000000C0; // type:function size:0xD4 -fn_204_1A0 = .text:0x000001A0; // type:function size:0x74 -TgSceneChange__update = .text:0x00000220; // type:function size:0x160 -fn_204_380 = .text:0x00000380; // type:function size:0x1C4 -fn_204_550 = .text:0x00000550; // type:function size:0x5C -fn_204_5B0 = .text:0x000005B0; // type:function size:0x8 -__dt__16dTgSceneChange_cFv = .text:0x000005C0; // type:function size:0x5C +create__16dTgSceneChange_cFv = .text:0x000000C0; // type:function size:0xD4 +checkDisabled__16dTgSceneChange_cCFv = .text:0x000001A0; // type:function size:0x74 +actorExecute__16dTgSceneChange_cFv = .text:0x00000220; // type:function size:0x160 +checkScrapper__16dTgSceneChange_cFv = .text:0x00000380; // type:function size:0x1C4 +savePlayerPosition__16dTgSceneChange_cFv = .text:0x00000550; // type:function size:0x5C +draw__16dTgSceneChange_cFv = .text:0x000005B0; // type:function size:0x8 +__dt__16dTgSceneChange_cFv = .text:0x000005C0; // type:function size:0x5C scope:weak _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -lbl_204_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float -lbl_204_data_0 = .data:0x00000000; // type:object size:0x13 data:string -lbl_204_data_14 = .data:0x00000014; // type:object size:0x4 data:4byte +lbl_204_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float +lbl_204_data_0 = .data:0x00000000; // type:object size:0x13 scope:local data:string +ScrapperStopEvent = .data:0x00000014; // type:object size:0x4 data:4byte g_profile_SC_CHANGE_TAG = .data:0x00000018; // type:object size:0x10 -lbl_204_data_28 = .data:0x00000028; // type:object size:0x4 data:4byte -lbl_204_data_2C = .data:0x0000002C; // type:object size:0x4 data:4byte -lbl_204_data_30 = .data:0x00000030; // type:object size:0xC data:string -TgSceneChange__vtable = .data:0x0000003C; // type:object size:0x74 +lbl_204_data_28 = .data:0x00000028; // type:object size:0x4 scope:local data:4byte +lbl_204_data_2C = .data:0x0000002C; // type:object size:0x4 scope:local data:4byte +lbl_204_data_30 = .data:0x00000030; // type:object size:0xC scope:local data:string +__vt__16dTgSceneChange_c = .data:0x0000003C; // type:object size:0x74 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 23a92d69..a19c6c64 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2521,7 +2521,7 @@ vt_0x280__17daPlayerActBase_cFv = .text:0x8005C720; // type:function size:0x8 getSwordPos__17daPlayerActBase_cCFv = .text:0x8005C730; // type:function size:0x8 vt_0x278__17daPlayerActBase_cCFv = .text:0x8005C740; // type:function size:0x8 vt_0x274__17daPlayerActBase_cFv = .text:0x8005C750; // type:function size:0xC -triggerExitRelated__17daPlayerActBase_cFv = .text:0x8005C760; // type:function size:0x4 +triggerExitRelated__17daPlayerActBase_cFiii = .text:0x8005C760; // type:function size:0x4 doesGameOver__17daPlayerActBase_cFv = .text:0x8005C770; // type:function size:0x8 setActorRef11__17daPlayerActBase_cFv = .text:0x8005C780; // type:function size:0x4 getGroosenatorIfIn__17daPlayerActBase_cFv = .text:0x8005C790; // type:function size:0x8 diff --git a/configure.py b/configure.py index 86ce4cf8..ff93c17e 100644 --- a/configure.py +++ b/configure.py @@ -2943,7 +2943,7 @@ config.libs = [ Rel( NonMatching, "d_t_ro_at_target_manager", "REL/d/t/d_t_ro_at_target_manager.cpp" ), - Rel(NonMatching, "d_t_scene_change", "REL/d/t/d_t_scene_change.cpp"), + Rel(Matching, "d_t_scene_change", "REL/d/t/d_t_scene_change.cpp"), Rel(NonMatching, "d_t_ship_flood", "REL/d/t/d_t_ship_flood.cpp"), Rel(NonMatching, "d_t_ship_slope", "REL/d/t/d_t_ship_slope.cpp"), Rel(Matching, "d_t_ship_window", "REL/d/t/d_t_ship_window.cpp"), diff --git a/include/d/a/npc/d_a_npc_volcano_f2_salbo.h b/include/d/a/npc/d_a_npc_volcano_f2_salbo.h index 03b288b1..629911cb 100644 --- a/include/d/a/npc/d_a_npc_volcano_f2_salbo.h +++ b/include/d/a/npc/d_a_npc_volcano_f2_salbo.h @@ -2,6 +2,7 @@ #define D_A_NPC_VOLCANO_F2_SALBO_H #include "d/a/npc/d_a_ordinary_npc.h" +#include "m/m_vec.h" #include "s/s_State.hpp" class dAcNpcSlb2_c : public dAcOrdinaryNpc_c { @@ -10,6 +11,7 @@ public: virtual ~dAcNpcSlb2_c() {} void fn_61_58C0(int, int); + void fn_61_56C0(const mVec3_c, const mVec3_c *, const mAng *); bool fn_61_6A10(); void fn_61_68D0(int); diff --git a/src/REL/d/t/d_t_scene_change.cpp b/src/REL/d/t/d_t_scene_change.cpp index 0ae26989..972d2406 100644 --- a/src/REL/d/t/d_t_scene_change.cpp +++ b/src/REL/d/t/d_t_scene_change.cpp @@ -3,7 +3,6 @@ #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" -#include "d/a/npc/d_a_npc_salbage_robot.h" #include "d/a/npc/d_a_npc_volcano_f2_salbo.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" @@ -13,8 +12,11 @@ #include "m/m_vec.h" #include "toBeSorted/area_math.h" #include "toBeSorted/d_path.h" +#include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" +const char *ScrapperStopEvent = "HailToPlayerToStop"; + SPECIAL_ACTOR_PROFILE(SC_CHANGE_TAG, dTgSceneChange_c, fProfile::SC_CHANGE_TAG, 0x21, 0, 4); int dTgSceneChange_c::create() { @@ -57,12 +59,15 @@ int dTgSceneChange_c::actorExecute() { return SUCCEEDED; } - if (mEnableStoryflag == 0 || mEnableStoryflag >= 0x7FF || !StoryflagManager::sInstance->getFlag(mEnableStoryflag)) { - return SUCCEEDED; + if (mEnableStoryflag != 0 && mEnableStoryflag < 0x7FF) { + if (!StoryflagManager::sInstance->getFlag(mEnableStoryflag)) { + return SUCCEEDED; + } } - - if (mEnableSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mEnableSceneflag)) { - return SUCCEEDED; + if (mEnableSceneflag < 0xFF) { + if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, mEnableSceneflag)) { + return SUCCEEDED; + } } dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); @@ -83,36 +88,33 @@ int dTgSceneChange_c::actorExecute() { extern "C" dAcOrdinaryNpc_c *SCRAPPER_PTR; bool dTgSceneChange_c::checkScrapper() { - if (SCRAPPER_PTR == nullptr) { - return false; - } - - if (SCRAPPER_PTR->mProfileName != fProfile::NPC_SLB2) { - return false; - } - - if (!static_cast(SCRAPPER_PTR)->fn_61_6A10()) { - return false; - } - - dPath_c path; - if (path.initWithPathIndex(mPathId, mRoomID, 0) && path.getNumPoints() > 1) { - if (EventManager::isInEvent(SCRAPPER_PTR, "HailToPlayerToStop")) { - mVec3_c p0, p1; - p0.copyFrom(path.getPoint(0)); - p1.copyFrom(path.getPoint(1)); - mAng a = cLib::targetAngleY(p0, p1); - - + if (SCRAPPER_PTR != nullptr && SCRAPPER_PTR->mProfileName == fProfile::NPC_SLB2) { + dAcNpcSlb2_c *pScrapper = static_cast(SCRAPPER_PTR); + if (!pScrapper->fn_61_6A10()) { + return false; + } + dPath_c path; + if (path.initWithPathIndex(mPathId, mRoomID, 0) && (u32)path.getNumPoints() >= 2) { + if (EventManager::isInEvent(pScrapper, ScrapperStopEvent)) { + mVec3_c p0, p1; + p0.copyFrom(path.getPoint(0)); + p1.copyFrom(path.getPoint(1)); + mAng a = cLib::targetAngleY(p0, p1); + pScrapper->fn_61_56C0(field_0x138, &mPosition, &a); + return true; + } else { + void *zev = pScrapper->getOarcZev("DesertRobot"); + u32 flag1 = 0x100000; + Event e(ScrapperStopEvent, zev, 100, flag1 + 1, 0, 0); + EventManager::alsoSetAsCurrentEvent(pScrapper, &e, nullptr); + return true; + } } } - return false; - - -} +} void dTgSceneChange_c::savePlayerPosition() { if (SCRAPPER_PTR == nullptr) {