diff --git a/config/SOUE01/rels/d_a_obj_clearness_wallNP/symbols.txt b/config/SOUE01/rels/d_a_obj_clearness_wallNP/symbols.txt index 771becf0..ed3a4d74 100644 --- a/config/SOUE01/rels/d_a_obj_clearness_wallNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_clearness_wallNP/symbols.txt @@ -2,16 +2,16 @@ _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 dAcOclearnessWall_c_classInit__Fv = .text:0x00000070; // type:function size:0x5C -fn_622_D0 = .text:0x000000D0; // type:function size:0x9C -fn_622_170 = .text:0x00000170; // type:function size:0xC8 -fn_622_240 = .text:0x00000240; // type:function size:0x8 -fn_622_250 = .text:0x00000250; // type:function size:0x218 -fn_622_470 = .text:0x00000470; // type:function size:0x8 -fn_622_480 = .text:0x00000480; // type:function size:0x68 -fn_622_4F0 = .text:0x000004F0; // type:function size:0x68 +createHeap__19dAcOclearnessWall_cFv = .text:0x000000D0; // type:function size:0x9C +create__19dAcOclearnessWall_cFv = .text:0x00000170; // type:function size:0xC8 +doDelete__19dAcOclearnessWall_cFv = .text:0x00000240; // type:function size:0x8 +actorExecute__19dAcOclearnessWall_cFv = .text:0x00000250; // type:function size:0x218 +draw__19dAcOclearnessWall_cFv = .text:0x00000470; // type:function size:0x8 +getArcName__19dAcOclearnessWall_cFv = .text:0x00000480; // type:function size:0x68 +getModelName__19dAcOclearnessWall_cFv = .text:0x000004F0; // type:function size:0x68 __dt__19dAcOclearnessWall_cFv = .text:0x00000560; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global g_profile_OBJ_CLEARNESS_WALL = .data:0x00000000; // type:object size:0x10 -lbl_622_section4_10 = .data:0x00000010; // type:object size:0xD8 -lbl_622_section4_E8 = .data:0x000000E8; // type:object size:0x80 +lbl_622_section4_10 = .data:0x00000010; // type:object size:0xD8 scope:local +lbl_622_section4_E8 = .data:0x000000E8; // type:object size:0x80 scope:local diff --git a/configure.py b/configure.py index 4ba08d20..f1f149d4 100644 --- a/configure.py +++ b/configure.py @@ -2375,7 +2375,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_city_water", "REL/d/a/obj/d_a_obj_city_water.cpp"), Rel(NonMatching, "d_a_obj_claw_shot_tg", "REL/d/a/obj/d_a_obj_claw_shot_tg.cpp"), Rel( - NonMatching, "d_a_obj_clearness_wall", "REL/d/a/obj/d_a_obj_clearness_wall.cpp" + Matching, "d_a_obj_clearness_wall", "REL/d/a/obj/d_a_obj_clearness_wall.cpp" ), Rel(NonMatching, "d_a_obj_clef", "REL/d/a/obj/d_a_obj_clef.cpp"), Rel(Matching, "d_a_obj_cloud_dive", "REL/d/a/obj/d_a_obj_cloud_dive.cpp"), diff --git a/include/d/a/obj/d_a_obj_clearness_wall.h b/include/d/a/obj/d_a_obj_clearness_wall.h index d2b62bb8..a15f6352 100644 --- a/include/d/a/obj/d_a_obj_clearness_wall.h +++ b/include/d/a/obj/d_a_obj_clearness_wall.h @@ -2,13 +2,28 @@ #define D_A_OBJ_CLEARNESS_WALL_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" class dAcOclearnessWall_c : public dAcObjBase_c { public: - dAcOclearnessWall_c() {} + dAcOclearnessWall_c(): field_0x543(true) {} virtual ~dAcOclearnessWall_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + private: + const char *getArcName(); + const char *getModelName(); + + /* 0x330 */ dBgW mBgW; + /* 0x540 */ u8 mSceneflag; + /* 0x541 */ u8 mVariant; + /* 0x542 */ u8 field_0x542; + /* 0x543 */ bool field_0x543; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_clearness_wall.cpp b/src/REL/d/a/obj/d_a_obj_clearness_wall.cpp index 3d074d69..9a2dbad0 100644 --- a/src/REL/d/a/obj/d_a_obj_clearness_wall.cpp +++ b/src/REL/d/a/obj/d_a_obj_clearness_wall.cpp @@ -1,3 +1,115 @@ #include "d/a/obj/d_a_obj_clearness_wall.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/flag/sceneflag_manager.h" +#include "f/f_base.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_CLEARNESS_WALL, dAcOclearnessWall_c, fProfile::OBJ_CLEARNESS_WALL, 0x15B, 0, 0); + +bool dAcOclearnessWall_c::createHeap() { + const char *arcName = getArcName(); + const char *modelName = getModelName(); + void *dzb = OarcManager::GetInstance()->getDzbFromArc(arcName, modelName); + void *plc = OarcManager::GetInstance()->getPlcFromArc(arcName, modelName); + TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale)); + return SUCCEEDED; +} + +int dAcOclearnessWall_c::create() { + mSceneflag = params; + mVariant = getFromParams(8, 0xF); + field_0x542 = getFromParams(0xC, 0xF); + if (field_0x542 == 0xF) { + field_0x542 = 0; + } + updateMatrix(); + CREATE_ALLOCATOR(dAcOclearnessWall_c); + dBgS::GetInstance()->Regist(&mBgW, this); + mBgW.Lock(); + if (field_0x542 == 2) { + dBgS::GetInstance()->Release(&mBgW); + } + if (mVariant == 4) { + mBgW.field_0x22 = 4; + } + return SUCCEEDED; +} + +int dAcOclearnessWall_c::doDelete() { + return SUCCEEDED; +} + +int dAcOclearnessWall_c::actorExecute() { + switch (field_0x542) { + case 0: { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (flag) { + deleteRequest(); + } + break; + } + case 1: { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (flag && field_0x543) { + dBgS::GetInstance()->Release(&mBgW); + field_0x543 = false; + } else { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (!flag && !field_0x543) { + dBgS::GetInstance()->Regist(&mBgW, this); + field_0x543 = true; + } + } + break; + } + case 2: { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (flag && field_0x543) { + dBgS::GetInstance()->Regist(&mBgW, this); + field_0x543 = false; + } else { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (!flag && !field_0x543) { + dBgS::GetInstance()->Release(&mBgW); + field_0x543 = true; + } + } + break; + } + default: { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, mSceneflag); + if (flag) { + deleteRequest(); + } + } + } + return SUCCEEDED; +} + +int dAcOclearnessWall_c::draw() { + return SUCCEEDED; +} + +const char *dAcOclearnessWall_c::getArcName() { + switch (mVariant) { + case 0: return "InvisibleWall"; + case 1: return "InvisibleWallB"; + case 2: return "InvisibleWallC"; + case 3: return "InvisibleWallD"; + case 4: return "InvisibleWallE"; + default: return nullptr; + } +} + +const char *dAcOclearnessWall_c::getModelName() { + switch (mVariant) { + case 0: return "InvisibleWall"; + case 1: return "InvisibleWall_yahane"; + case 2: return "InvisibleWall_AirNaraku"; + case 3: return "InvisibleWall_Camera"; + case 4: return "InvisibleWall_tekitome"; + default: return nullptr; + } +}