diff --git a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt index 0a8b474b..67013f44 100644 --- a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt @@ -7,7 +7,7 @@ getDoorResName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x000001F0; // type: getDoorMdlName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x00000240; // type:function size:0x4C getDoorUnknown__26@unnamed@d_a_obj_door_cpp@FUcRUc = .text:0x00000290; // type:function size:0x58 isDoorSpecial__26@unnamed@d_a_obj_door_cpp@Fl = .text:0x000002F0; // type:function size:0x4C -getDoorTalk = .text:0x00000340; // type:function size:0xC +getDoorInteractionName__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000340; // type:function size:0xC isInOuterSandship__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000350; // type:function size:0x7C isInEvent__26@unnamed@d_a_obj_door_cpp@FPCc = .text:0x000003D0; // type:function size:0x40 isInTimeDoorEvent__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000410; // type:function size:0x7C @@ -30,20 +30,20 @@ startPushEventWithCallback__10dAcOdoor_cFPv = .text:0x00003570; // type:function startPullEvent__10dAcOdoor_cFPv = .text:0x000035F0; // type:function size:0x24 startPushEvent__10dAcOdoor_cFPv = .text:0x00003620; // type:function size:0x24 startOpenEvent__10dAcOdoor_cFPv = .text:0x00003650; // type:function size:0xB0 -doorPullEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003700; // type:function size:0x4 -doorPushEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003710; // type:function size:0x4 +doorPullEventCallback__10dAcOdoor_cFPv = .text:0x00003700; // type:function size:0x4 +doorPushEventCallback__10dAcOdoor_cFPv = .text:0x00003710; // type:function size:0x4 startDoorPullLockedEvent__10dAcOdoor_cFPv = .text:0x00003720; // type:function size:0x70 startDoorPushLockedEvent__10dAcOdoor_cFPv = .text:0x00003790; // type:function size:0x70 startLockedEvent__10dAcOdoor_cFPv = .text:0x00003800; // type:function size:0x5C -pullLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003860; // type:function size:0x68 -pushLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000038D0; // type:function size:0x68 +pullLockedEventCallback__10dAcOdoor_cFPv = .text:0x00003860; // type:function size:0x68 +pushLockedEventCallback__10dAcOdoor_cFPv = .text:0x000038D0; // type:function size:0x68 startUnlockEvent__10dAcOdoor_cFv = .text:0x00003940; // type:function size:0x6C -unlockEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000039B0; // type:function size:0x1EC -openCallbackCommon__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003BA0; // type:function size:0x148 +unlockEventCallback__10dAcOdoor_cFPv = .text:0x000039B0; // type:function size:0x1EC +openCallbackCommon__10dAcOdoor_cFPv = .text:0x00003BA0; // type:function size:0x148 registerInEvent__10dAcOdoor_cFv = .text:0x00003CF0; // type:function size:0x3C unkVirtFunc_0x6C__10dAcOdoor_cFv = .text:0x00003D30; // type:function size:0x4 doInteraction__10dAcOdoor_cFl = .text:0x00003D40; // type:function size:0x1EC -getKeyParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC +getLockParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC getSubtype2__10dAcOdoor_cFv = .text:0x00003F40; // type:function size:0xC getSceneflag__10dAcOdoor_cFv = .text:0x00003F50; // type:function size:0xC fn_572_3F60__10dAcOdoor_cFv = .text:0x00003F60; // type:function size:0xC @@ -60,7 +60,7 @@ getInteractionLockMinZ__10dAcOdoor_cFv = .text:0x00004020; // type:function size getInteractionLockMaxZ__10dAcOdoor_cFv = .text:0x00004030; // type:function size:0xC setRoomId__10dAcOdoor_cFSc = .text:0x00004040; // type:function size:0x8 fn_572_4050__10dAcOdoor_cFUl = .text:0x00004050; // type:function size:0x8 -fn_572_4060__10dAcOdoor_cFSc = .text:0x00004060; // type:function size:0x8 +fn_572_4060__10dAcOdoor_cFUc = .text:0x00004060; // type:function size:0x8 fn_572_4070__10dAcOdoor_cFSc = .text:0x00004070; // type:function size:0x8 fn_572_4080__10dAcOdoor_cFSc = .text:0x00004080; // type:function size:0x8 fn_572_4090__10dAcOdoor_cFv = .text:0x00004090; // type:function size:0xC @@ -78,16 +78,16 @@ fn_572_4140__10dAcOdoor_cCFRb = .text:0x00004140; // type:function size:0xC fn_572_4150__10dAcOdoor_cCFRb = .text:0x00004150; // type:function size:0x90 triggerExit__10dAcOdoor_cFv = .text:0x000041E0; // type:function size:0x7C isLeavingSealedTempleSideDoorPostSkyKeep__10dAcOdoor_cCFv = .text:0x00004260; // type:function size:0xAC -transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x28 -fn_572_4340__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x28 +transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x2C +transitionPullRoomFlags__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x2C fn_572_4370__10dAcOdoor_cCFRC7mVec3_c = .text:0x00004370; // type:function size:0x84 isPlayerInFrontOfDoor__10dAcOdoor_cCFv = .text:0x00004400; // type:function size:0x10 -hasFlowEntryPoint__10dAcOdoor_cCFv = .text:0x00004410; // type:function size:0x18 +hasFlowEntryPoint__10dAcOdoor_cFv = .text:0x00004410; // type:function size:0x18 fn_572_4430__10dAcOdoor_cCFv = .text:0x00004430; // type:function size:0xC fn_572_4440__10dAcOdoor_cFv = .text:0x00004440; // type:function size:0xE4 isPlayerInteractable__10dAcOdoor_cCFv = .text:0x00004530; // type:function size:0xD0 isPlayerInteractableLocked__10dAcOdoor_cCFv = .text:0x00004600; // type:function size:0xE4 -playInteractionLocked__10dAcOdoor_cCFv = .text:0x000046F0; // type:function size:0x68 +playInteractionLocked__10dAcOdoor_cFv = .text:0x000046F0; // type:function size:0x68 __dt__10dAcOdoor_cFv = .text:0x00004760; // type:function size:0xE8 __sinit_\d_a_obj_door_cpp = .text:0x00004850; // type:function size:0x144 scope:local _ctors = .ctors:0x00000000; // type:label scope:global diff --git a/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt b/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt index b5ed5c3e..658ac9b0 100644 --- a/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt @@ -21,11 +21,11 @@ getStateID__80sStateMgr_c<11dAcOFence_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13 fn_550_D30 = .text:0x00000D30; // type:function size:0x304 fn_550_1040 = .text:0x00001040; // type:function size:0x13C fn_550_1180 = .text:0x00001180; // type:function size:0x28 -fn_550_11B0 = .text:0x000011B0; // type:function size:0xA0 -fn_550_1250 = .text:0x00001250; // type:function size:0x50 +fn_550_11B0__11dAcOFence_cCFv = .text:0x000011B0; // type:function size:0xA0 +fn_550_1250__11dAcOFence_cFv = .text:0x00001250; // type:function size:0x50 changeState__80sStateMgr_c<11dAcOFence_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000012A0; // type:function size:0x10 -fn_550_12B0 = .text:0x000012B0; // type:function size:0x10 -fn_550_12C0 = .text:0x000012C0; // type:function size:0x10 +fn_550_12B0__11dAcOFence_cFv = .text:0x000012B0; // type:function size:0x10 +fn_550_12C0__11dAcOFence_cFv = .text:0x000012C0; // type:function size:0x10 initializeState_WaitOpen__11dAcOFence_cFv = .text:0x000012D0; // type:function size:0x94 executeState_WaitOpen__11dAcOFence_cFv = .text:0x00001370; // type:function size:0x168 finalizeState_WaitOpen__11dAcOFence_cFv = .text:0x000014E0; // type:function size:0x4 @@ -142,4 +142,4 @@ lbl_550_bss_118 = .bss:0x00000118; // type:object size:0x40 data:4byte lbl_550_bss_158 = .bss:0x00000158; // type:object size:0x40 data:4byte lbl_550_bss_198 = .bss:0x00000198; // type:object size:0x40 data:4byte lbl_550_bss_1D8 = .bss:0x000001D8; // type:object size:0x40 data:4byte -lbl_550_bss_218 = .bss:0x00000218; // type:object size:0x30 +StateID_RequestConfineEvent__11dAcOFence_c = .bss:0x00000218; // type:object size:0x30 diff --git a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt index 42e9ce53..9a7ae51a 100644 --- a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt @@ -80,7 +80,7 @@ lbl_374_data_190 = .data:0x00000190; // type:object size:0x198 scope:local __vt__29sFStateID_c<14dAcOwindmill_c> = .data:0x00000328; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_374_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte -AcOwindmill__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 data:4byte +StateID_Wait__14dAcOwindmill_c = .bss:0x00000018; // type:object size:0x40 data:4byte AcOwindmill__STATE_CAMERA_MOVE = .bss:0x00000058; // type:object size:0x40 data:4byte AcOwindmill__STATE_MOVE = .bss:0x00000098; // type:object size:0x80 data:4byte AcOwindmill__STATE_COLLECT_STICK = .bss:0x00000118; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 587eb1c6..a722eb7b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3525,7 +3525,7 @@ getCurrentEventCommand__17ActorEventRelatedCFv = .text:0x8009CF10; // type:funct ActorEventRelated__getSomeEventRelatedNumber = .text:0x8009CFA0; // type:function size:0x80 isAdvance__17ActorEventRelatedFv = .text:0x8009D020; // type:function size:0x34 advanceNext__17ActorEventRelatedFv = .text:0x8009D060; // type:function size:0x50 -ActorEventRelated__getSingleIntData2 = .text:0x8009D0B0; // type:function size:0x8C +getSingleShortData__17ActorEventRelatedFPiUlUl = .text:0x8009D0B0; // type:function size:0x8C getSingleIntData__17ActorEventRelatedFPiUlUl = .text:0x8009D140; // type:function size:0x8C getSingleFloatData__17ActorEventRelatedFPfUlUl = .text:0x8009D1D0; // type:function size:0x8C getSingleVecData__17ActorEventRelatedFP7mVec3_cUlUl = .text:0x8009D260; // type:function size:0x9C @@ -3568,7 +3568,7 @@ fn_8009F850 = .text:0x8009F850; // type:function size:0x134 fn_8009F990__12EventManagerFv = .text:0x8009F990; // type:function size:0x80 fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8 attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0 -setAsEvent = .text:0x8009FBC0; // type:function size:0x120 +setEvent__12EventManagerFP9dAcBase_cP5EventP9dAcBase_c = .text:0x8009FBC0; // type:function size:0x120 changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C fn_8009FE00 = .text:0x8009FE00; // type:function size:0x124 isInEvent__12EventManagerFP9dAcBase_cPCc = .text:0x8009FF30; // type:function size:0x10C @@ -9879,8 +9879,8 @@ fn_80178E90 = .text:0x80178E90; // type:function size:0x40 fn_80178ED0 = .text:0x80178ED0; // type:function size:0x114 __dt__13dAcBirdBase_cFv = .text:0x80178FF0; // type:function size:0xDC __dt__Q213dAcBirdBase_c10callback_cFv = .text:0x801790D0; // type:function size:0x58 -__ct__16dAcObjDoor_cFv = .text:0x80179130; // type:function size:0x58 -fn_80179190 = .text:0x80179190; // type:function size:0x74 +__ct__12dAcObjDoor_cFv = .text:0x80179130; // type:function size:0x58 +__dt__12dAcObjDoor_cFv = .text:0x80179190; // type:function size:0x74 ActorDoorBase__hasVisitedRoomIdMaybe = .text:0x80179210; // type:function size:0x14 fn_80179230 = .text:0x80179230; // type:function size:0x4 fn_80179240 = .text:0x80179240; // type:function size:0x4 @@ -10420,13 +10420,13 @@ fn_80194A90 = .text:0x80194A90; // type:function size:0x58 checkStatueFlag__10dAcOSave_cCFv = .text:0x80194AF0; // type:function size:0x28 fn_80194B20 = .text:0x80194B20; // type:function size:0x8 fn_80194B30 = .text:0x80194B30; // type:function size:0x44 -fn_80194B80 = .text:0x80194B80; // type:function size:0x8 +getConnectedDoorRef__10dAcOdoor_cFv = .text:0x80194B80; // type:function size:0x8 fn_80194B90 = .text:0x80194B90; // type:function size:0x8 -fn_80194BA0 = .text:0x80194BA0; // type:function size:0x30 +isConnectedToOtherDoor__10dAcOdoor_cCFv = .text:0x80194BA0; // type:function size:0x30 fn_80194BD0 = .text:0x80194BD0; // type:function size:0x18 fn_80194BF0 = .text:0x80194BF0; // type:function size:0x24 fn_80194C20 = .text:0x80194C20; // type:function size:0x48 -fn_80194C70 = .text:0x80194C70; // type:function size:0x70 +stepTowards__10dAcOdoor_cCFR7mVec3_c = .text:0x80194C70; // type:function size:0x70 getImprisonedPtr = .text:0x80194CE0; // type:function size:0x8 fn_80194CF0 = .text:0x80194CF0; // type:function size:0x128 dAcOClef__getTadtoneGroupIndex = .text:0x80194E20; // type:function size:0x38 @@ -10960,9 +10960,9 @@ waitForRooms__8dStage_cFv = .text:0x801B3930; // type:function size:0x30 setRoom__8dStage_cFiP7dRoom_c = .text:0x801B3960; // type:function size:0x10 getRoom__8dStage_cFl = .text:0x801B3970; // type:function size:0x10 handleRoomChange__8dStage_cFi = .text:0x801B3980; // type:function size:0x114 -RoomManager__updateRoomFlags = .text:0x801B3AA0; // type:function size:0x134 +updateRoomFlags__8dStage_cFii = .text:0x801B3AA0; // type:function size:0x134 RoomManager__checkOtherRoomLoaded = .text:0x801B3BE0; // type:function size:0x78 -fn_801B3C60 = .text:0x801B3C60; // type:function size:0x9C +fn_801B3C60__8dStage_cFi = .text:0x801B3C60; // type:function size:0x9C fadeIn__8dStage_cFlUs = .text:0x801B3D00; // type:function size:0xA8 fadeOut__8dStage_cFlUs = .text:0x801B3DB0; // type:function size:0xA8 forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index 332c03e7..fded4fa4 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -35,8 +35,20 @@ public: SUBTYPE_8, ///< DoorH }; + enum LockType_c { + LOCK_NONE = 0, ///< Door does not have a lock + LOCK_KEY = 1, ///< Door usually is locked + }; + public: - dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiterL(this), mEmmiterR(this) {} + dAcOdoor_c() + : mEventRelated(*this, nullptr), + mEmmiterL(this), + mEmmiterR(this), + mFlags(0), + field_0x5B0(0), + field_0x5B9(false), + field_0x5BA(false) {} virtual ~dAcOdoor_c() {} virtual int doDelete() override; @@ -79,10 +91,10 @@ public: void startOpenEvent(void *zevData); /** */ - static void doorPullEventCallback(dAcOdoor_c *); + static void doorPullEventCallback(void *); /** */ - static void doorPushEventCallback(dAcOdoor_c *); + static void doorPushEventCallback(void *); /** */ void startDoorPullLockedEvent(void *zevData); @@ -94,22 +106,22 @@ public: void startLockedEvent(void *zevData); /** */ - static void pullLockedEventCallback(dAcOdoor_c *); + static void pullLockedEventCallback(void *); /** */ - static void pushLockedEventCallback(dAcOdoor_c *); + static void pushLockedEventCallback(void *); /** */ void startUnlockEvent(); /** */ - static void unlockEventCallback(dAcOdoor_c *); + static void unlockEventCallback(void *); /** */ - static void openCallbackCommon(dAcOdoor_c *); + static void openCallbackCommon(void *); /** */ - s32 getKeyParameter(); // getFromParams(6, 0x1) + s32 getLockParameter(); // getFromParams(6, 0x1) /** */ s32 getSubtype2(); // (mRotation.x >> 0) & 0xFF @@ -126,8 +138,8 @@ public: /** fn_572_3F80 */ u8 fn_572_3F80(); // (mRotation.z >> 10) & 0x3F - /** fn_572_3F90 */ - u8 fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + /** (getParams2Lower() >> 0) & 0xFF */ + u16 fn_572_3F90(); /** fn_572_3FC0 */ static f32 getInteractionMinX(); // -80.f @@ -160,7 +172,7 @@ public: void fn_572_4050(u32 flags); // field_0x5A8 = flags /** fn_572_4060 */ - void fn_572_4060(s8); // field_0x5B3 = in + void fn_572_4060(u8); // field_0x5B3 = in /** fn_572_4070 */ void fn_572_4070(s8); // field_0x5B4 = in @@ -217,10 +229,7 @@ public: void transitionPushRoomFlags() const; /** fn_572_4430 */ - bool transitionPullRoomFlags() const; - - /** fn_572_4340 */ - void fn_572_4340() const; // nop + void transitionPullRoomFlags() const; /** fn_572_4370 */ bool fn_572_4370(const mVec3_c &point) const; // Is in front of door @@ -229,7 +238,7 @@ public: bool isPlayerInFrontOfDoor() const; /** */ - bool hasFlowEntryPoint() const; // getFromParams(16, 0xFFFF) + bool hasFlowEntryPoint(); /** fn_572_4430 */ bool fn_572_4430() const; // field_0x5A8 & 2 @@ -244,7 +253,7 @@ public: bool isPlayerInteractableLocked() const; /** */ - void playInteractionLocked() const; + void playInteractionLocked(); public: s32 getType() { @@ -277,7 +286,7 @@ private: /* 0x560 */ dAcRef_c mLock; /* 0x56C */ dAcRef_c mObjRef; /* 0x578 */ mMtx_c mMtx; - /* 0x5A8 */ u8 _0x5A8[0x5AC - 0x5A8]; + /* 0x5A8 */ u32 mFlags; ///< /* 0x5AC */ u32 mRumbleIdx; ///< /* 0x5B0 */ u8 field_0x5B0; ///< some timer to trigger exit /* 0x5B1 */ u8 field_0x5B1; ///< @@ -287,7 +296,9 @@ private: /* 0x5B5 */ s8 field_0x5B5; /* 0x5B6 */ s8 field_0x5B6; /* 0x5B7 */ bool field_0x5B7; - /* 0x5B8 */ u8 _0x5B8[0x5BB - 0x5B8]; + /* 0x5B8 */ bool field_0x5B8; + /* 0x5B9 */ bool field_0x5B9; + /* 0x5BA */ bool field_0x5BA; /* 0x5BB */ bool field_0x5BB; }; diff --git a/include/d/a/obj/d_a_obj_door_base.h b/include/d/a/obj/d_a_obj_door_base.h index 854c1ba2..9a64bf34 100644 --- a/include/d/a/obj/d_a_obj_door_base.h +++ b/include/d/a/obj/d_a_obj_door_base.h @@ -11,7 +11,7 @@ class dAcObjDoor_c : public dAcObjBase_c { public: dAcObjDoor_c(); - ~dAcObjDoor_c() {} + ~dAcObjDoor_c(); virtual bool canOpen() = 0; virtual bool hasVisitedRoom(); diff --git a/include/d/a/obj/d_a_obj_fence.h b/include/d/a/obj/d_a_obj_fence.h index f2127ee2..8b7afd5d 100644 --- a/include/d/a/obj/d_a_obj_fence.h +++ b/include/d/a/obj/d_a_obj_fence.h @@ -11,6 +11,8 @@ public: virtual ~dAcOFence_c(); bool fn_550_11B0() const; + void fn_550_1250(); + void fn_550_12B0(); void fn_550_12C0(); void changeToRequestConfineEvent() { diff --git a/include/d/a/obj/d_a_obj_lock.h b/include/d/a/obj/d_a_obj_lock.h index e332902c..071bf5c5 100644 --- a/include/d/a/obj/d_a_obj_lock.h +++ b/include/d/a/obj/d_a_obj_lock.h @@ -12,8 +12,8 @@ public: STATE_FUNC_DECLARE(dAcOLock_c, Wait); - bool checkField_0x2090() const { - return field_0x2090; + bool checkField_0x2091() const { + return field_0x2091; } void setField_0x2090() { field_0x2090 = true; @@ -23,6 +23,7 @@ private: /* 0x???? */ STATE_MGR_DECLARE(dAcOLock_c); /* 0x???? */ u8 _0x36C[0x2090 - 0x36C]; /* 0x2090 */ bool field_0x2090; + /* 0x2091 */ bool field_0x2091; }; #endif diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 2f5a4770..3c3d2a93 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -119,6 +119,7 @@ public: void fn_801B3C60(int roomId); void drawMap(mMtx_c *mtx, int); dRoom_c *getRoom(s32 idx); + void updateRoomFlags(int, int); void setRoom(int roomid, dRoom_c *room); void handleRoomChange(int roomid); diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 68d47f3f..f7a00405 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -106,7 +106,6 @@ public: static dStageMgr_c *GetInstance() { return sInstance; } - EGG::CpuTexture *getField_0x8898() { return field_0x8898; } @@ -225,7 +224,7 @@ private: // ... u8 ___[438]; /* 0x8898 */ EGG::CpuTexture *field_0x8898; - + u8 _0x889C[4]; /* 0x88A0 */ u32 field_0x88A0; diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 1b89074f..3f3946ab 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -11,6 +11,7 @@ class dAcObjBase_c; class EventManager { public: + static bool setEvent(dAcBase_c *actor, Event *, dAcBase_c *); static bool isInEvent(dAcBase_c *actor, const char *eventName); static bool finishEvent(dAcBase_c *actor, const char *eventName); static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD); diff --git a/src/REL/d/a/obj/d_a_obj_door.cpp b/src/REL/d/a/obj/d_a_obj_door.cpp index 195d4cc2..834a4f3f 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -3,6 +3,7 @@ #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_fence.h" @@ -14,12 +15,15 @@ #include "d/d_rumble.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/d_stage_mgr.h" #include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_wzsound.h" #include "egg/math/eggMath.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" +#include "m/m3d/m_anmmdl.h" #include "m/m3d/m_fanm.h" #include "m/m_mtx.h" #include "m/m_vec.h" @@ -28,7 +32,9 @@ #include "nw4r/math/math_arithmetic.h" #include "s/s_Math.h" #include "sized_string.h" +#include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" +#include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); @@ -36,6 +42,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); namespace { const char *const DoorAnim = "DoorAnim"; +const char *const DoorAnim_ = "DoorAnim"; const char *const DoorAnimPull = "DoorAnimPull"; const char *const DoorAnimPush = "DoorAnimPush"; @@ -56,12 +63,22 @@ DoorFileMapping sDoorMappings[8] = { }; const char *const DoorF = "DoorF"; +const char *const DoorF_ = "DoorF"; const char *const DoorF_Open = "DoorF_Open"; const char *const DoorF_Close = "DoorF_Close"; + +static const u8 sDoorUnknown[2] = {0, 1}; + +const s32 sSpecialDoorMapTypes[5] = { + sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, + sDoorMappings[5].mType, sDoorMappings[6].mType, +}; + const char *const DoorPull = "DoorPull"; const char *const DoorPush = "DoorPush"; const char *const DoorPullLock = "DoorPullLock"; const char *const DoorPushLock = "DoorPushLock"; +const char *const DoorTalk = "DoorTalk"; bool getDoorMapping(u32 type, const DoorFileMapping *&filemap) { bool found = false; @@ -99,7 +116,6 @@ bool getDoorMdlName(u32 type, const char *&name) { return found; } -static const u8 sDoorUnknown[2] = {0, 1}; bool getDoorUnknown(u8 search, u8 &idx) { bool found = false; int i = 0; @@ -118,11 +134,6 @@ bool getDoorUnknown(u8 search, u8 &idx) { return found; } -static s32 sSpecialDoorMapTypes[5] = { - sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, - sDoorMappings[5].mType, sDoorMappings[6].mType, -}; - bool isDoorSpecial(s32 type) { bool found = false; int i = 0; @@ -136,9 +147,8 @@ bool isDoorSpecial(s32 type) { return found; } - const char *getDoorInteractionName() { - return "DoorTalk"; + return DoorTalk; } const char *const sSandShipOuterStages[2] = {"B301", "D301_1"}; @@ -188,12 +198,29 @@ bool checkRoom(s8 roomID, bool &b) { return true; } -static mVec3_c sVecs[] = { - mVec3_c(70.f, 0.f, 0.f), mVec3_c(52.f, 110.f, 0.f), mVec3_c(0.f, 0.f, 70.f), mVec3_c(0.f, 0.f, -70.f) -}; } // namespace -const char *const DoorE_N = "DoorE_N"; +void rodata0() { + const f32 a[] = {0.f, 16.f, 60.f, 0.f, 80.f, 100.f, 0.f, 160.f, 100.f}; + const u32 b[] = {0x2D2D7832, 0x73010000, 0x03000000}; +} +static mVec3_c sVec0 = mVec3_c(70.f, 0.f, 0.f); +static mVec3_c sVec1 = mVec3_c(52.f, 110.f, 0.f); + +static mVec3_c sVec2 = mVec3_c(0.f, 0.f, 70.f); +static mVec3_c sVec3 = mVec3_c(0.f, 0.f, -70.f); + +static const InteractionTargetDef sOpenInteraction = { + 0, 2, 1, OPEN, 0, 1000.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f, +}; +static const InteractionTargetDef sLockedInteraction = { + 0, 2, 1, EXAMINE_TALK, 0, 1000.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f, +}; +void rodata1() { + const f32 a[] = {200.f, 0.f}; +} + +SizedString<32> sStageF402("F402"); bool dAcOdoor_c::createHeap() { s32 type = getFromParams(0, 0x3F); if (type == SUBTYPE_7) { @@ -201,13 +228,13 @@ bool dAcOdoor_c::createHeap() { if (!resFile.IsValid()) { return false; } - mAnmChr.create(resFile.ptr(), DoorF, DoorF_Open, &mAllocator, 0x120); + mAnmChr.create(resFile.ptr(), DoorF_, DoorF_Open, &mAllocator, 0x120); } else { nw4r::g3d::ResFile resFileAnim(getOarcResFile(DoorAnim)); if (!resFileAnim.IsValid()) { return false; } - if (!mAnmChr.create(resFileAnim.ptr(), DoorAnim, DoorAnimPull, &mAllocator, 0)) { + if (!mAnmChr.create(resFileAnim.ptr(), DoorAnim_, DoorAnimPull, &mAllocator, 0)) { return false; } @@ -268,7 +295,7 @@ int dAcOdoor_c::actorCreate() { mSceneflag = getSceneflag(); - if (getKeyParameter() == true) { + if (getLockParameter() == LOCK_KEY) { if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { mLock.link( static_cast( @@ -346,7 +373,7 @@ int dAcOdoor_c::actorPostCreate() { foundPair = true; this->getConnectedDoorRef().link(pDoor); pDoor->getConnectedDoorRef().link(this); - if (getKeyParameter() == true) { + if (getLockParameter() == LOCK_KEY) { this->fn_572_40B0(); pDoor->fn_572_40C0(); } else { @@ -407,7 +434,7 @@ int dAcOdoor_c::actorPostCreate() { if (type != SUBTYPE_7) { mMtx_c m; mAnmChr.getModel().getNodeWorldMtx(1, m); - m.transM(sVecs[0]); + m.transM(sVec0); mMdl0.setLocalMtx(m); if (fn_572_4430()) { mMdl1.setLocalMtx(m); @@ -564,7 +591,7 @@ int dAcOdoor_c::actorExecuteInEvent() { frame0 = frame; if (field_0x5B3 == s8(1)) { - fn_572_4340(); + transitionPullRoomFlags(); } } else { frame0 = mAnmChr.getAnm().getFrame(); @@ -716,15 +743,14 @@ int dAcOdoor_c::actorExecuteInEvent() { if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B5()); if (pRoom != nullptr) { - pRoom->setFlag(0x1); + pRoom->setFlag(0x4); dStage_c::GetInstance()->fn_801B3C60(getField_0x5B4()); } } mEventRelated.advanceNext(); - const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - bool search = true; + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); dAcOFence_c *pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); while (search && pFence != nullptr) { @@ -750,17 +776,16 @@ int dAcOdoor_c::actorExecuteInEvent() { if (mLock.get() != nullptr) { mLock.get()->deleteRequest(); } - - if (type == SUBTYPE_7) { - bool b; - if (frame0 == frame1) { - b = frame0 == 55.f; - } else { - b = frame0 < 55.f && 55.f <= frame1; - } - if (b) { - dRumble_c::start(dRumble_c::sRumblePreset5, dRumble_c::FLAG_SLOT0); - } + } + if (type == SUBTYPE_7) { + bool b; + if (frame0 == frame1) { + b = frame0 == 55.f; + } else { + b = frame0 < 55.f && 55.f <= frame1; + } + if (b) { + dRumble_c::start(dRumble_c::sRumblePreset5, dRumble_c::FLAG_SLOT0); } } } break; @@ -778,16 +803,18 @@ int dAcOdoor_c::actorExecuteInEvent() { } break; case 'cAna': { mVec3_c pos; - int rot; + mAng rot; if (type == SUBTYPE_7) { pos.set(0.f, 0.f, 85.f); - rot = mRotation.y - 0x8000; + rot = mAng(0x8000); + rot += mRotation.y; } else { int dir; mEventRelated.getSingleShortData(&dir, 'dir ', 0); if (dir == 0) { pos.set(v1); - rot = mRotation.y - 0x8000; + rot = mAng(0x8000); + rot += mRotation.y; } else { pos.set(v2); rot = mRotation.y; @@ -806,7 +833,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mAng ang = pPlayer->mRotation.y; sLib::addCalcAngle(ang.ref(), rot, 4, 0x7FFF, 0); - if (pos.squareDistanceToXZ(tmp) < 25.f && mAng(ang - mAng(rot)).abs() < 182) { + if (pos.squareDistanceToXZ(tmp) < 25.f && mAng::abs(ang - mAng((s32)rot)) < 182) { pPlayer->setPosYRot(pos, rot); mEventRelated.advanceNext(); } else { @@ -864,7 +891,7 @@ int dAcOdoor_c::actorExecuteInEvent() { pLock->setField_0x2090(); fn_572_4440(); } - if (pLock->checkField_0x2090()) { + if (pLock->checkField_0x2091()) { mEventRelated.advanceNext(); } } @@ -879,7 +906,7 @@ int dAcOdoor_c::actorExecuteInEvent() { dAcObjBase_c *pObj = mObjRef.get(); if (pObj != nullptr) { mMtx_c m = pObj->mWorldMtx; - m += mWorldMtx; + m += mMtx; mWorldMtx = m; mAnmChr.getModel().setLocalMtx(mWorldMtx); } @@ -889,7 +916,7 @@ int dAcOdoor_c::actorExecuteInEvent() { if (type != SUBTYPE_7) { mMtx_c nodeMtx; mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); - nodeMtx.transM(sVecs[0]); + nodeMtx.transM(sVec0); mMdl0.setLocalMtx(nodeMtx); if (fn_572_4430()) { mMdl1.setLocalMtx(nodeMtx); @@ -979,7 +1006,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mEmmiterL.setTransform(nodeMtx); } } - if (mEmmiterL.hasEmitters()) { + if (mEmmiterR.hasEmitters()) { int node = mAnmChr.getModel().getNodeID("DoorF_R"); if (node >= 0) { mMtx_c nodeMtx; @@ -1051,80 +1078,396 @@ int dAcOdoor_c::actorExecuteInEvent() { if (mEventRelated.getCurrentEventCommand() == 'pshB' && type == SUBTYPE_7) { if (frame0 < 50.f && 50.f <= frame1) { - // ?? + // TODO(Zeldex) - Why is this a check - This seems to indicate it was a getter for a pointer if (&dRumble_c::sRumblePreset3) { mRumbleIdx = dRumble_c::start(dRumble_c::sRumblePreset3, dRumble_c::FLAG_SLOT0 | dRumble_c::FLAG_INITIALIZE); } } - if (frame0 <= 115.f && 115.f < frame0) { + if (frame0 <= 115.f && 115.f < frame1) { dRumble_c::stop(mRumbleIdx); } } return SUCCEEDED; } -int dAcOdoor_c::actorExecute() {} +int dAcOdoor_c::actorExecute() { + if (fn_572_4430()) { + fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); + } + switch (field_0x5B3) { + case 0: { + bool b; + checkRoom(mRoomID, b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + case 1: { + bool b; + fn_572_4150(b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + } + unsetObjectProperty(OBJ_PROP_0x200); + s32 type = getType(); -int dAcOdoor_c::draw() {} + if (getLockParameter() == LOCK_KEY) { + if (mLock.get() == nullptr) { + if (isPlayerInteractable()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } else { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } + } else { + switch (field_0x5B1) { + case 0: { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + case 1: + case 4: + case 5: + case 6: { + if (isPlayerInFrontOfDoor()) { + if (isLocked()) { + AttentionManager::GetInstance()->addTarget(*this, sLockedInteraction, 0, nullptr); + } else { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } + } break; + case 2: { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + case 3: { + if (!isLocked() && isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + } + } -bool dAcOdoor_c::isLocked() {} + dAcObjBase_c *pObj = mObjRef.get(); + if (pObj != nullptr) { + mMtx_c m = pObj->mWorldMtx; + m += mMtx; + mWorldMtx = m; + mAnmChr.getModel().setLocalMtx(mWorldMtx); + mAnmChr.getModel().calc(false); -bool dAcOdoor_c::canOpen() {} + if (type != SUBTYPE_7) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); + nodeMtx.transM(sVec0); + mMdl0.setLocalMtx(nodeMtx); + if (fn_572_4430()) { + mMdl1.setLocalMtx(nodeMtx); + } + } + } -/** fn_572_33E0 - I Think this gets the Door open range*/ -f32 dAcOdoor_c::fn_572_33E0() {} // -80.f + if (pObj != nullptr) { + mVec3_c min, max; + min.set(999999.f, 999999.f, 999999.f); + max.set(-999999.f, -999999.f, -999999.f); -/** */ -void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) {} + if (type == SUBTYPE_7) { + mAnmChr.getModel().getBounds(&min, &max); + } else { + mVec3_c min_l, max_l; + mMtx_c local; + mMdl0.getBounds(&min_l, &max_l); + mMdl0.getLocalMtx(local); -/** */ -void dAcOdoor_c::startPullEventWithCallback(void *zevData) {} + mMtx_c world = mWorldMtx; + world.inverse(); -/** */ -void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) {} + mVec3_c minPos = min_l; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); -/** */ -void dAcOdoor_c::startPushEventWithCallback(void *zevData) {} + // clang-format off + min.set( + nw4r::ut::Min(minPos.x, min.x), + nw4r::ut::Min(minPos.y, min.y), + nw4r::ut::Min(minPos.z, min.z) + ); + max.set( + nw4r::ut::Max(minPos.x, max.x), + nw4r::ut::Max(minPos.y, max.y), + nw4r::ut::Max(minPos.z, max.z) + ); + // clang-format on -/** */ -void dAcOdoor_c::startPullEvent(void *zevData) {} + mVec3_c maxPos = max_l; + local.multVec(maxPos, maxPos); + world.multVec(maxPos, maxPos); + // clang-format off + min.set( + nw4r::ut::Min(maxPos.x, min.x), + nw4r::ut::Min(maxPos.y, min.y), + nw4r::ut::Min(maxPos.z, min.z) + ); + max.set( + nw4r::ut::Max(maxPos.x, max.x), + nw4r::ut::Max(maxPos.y, max.y), + nw4r::ut::Max(maxPos.z, max.z) + ); + // clang-format on -/** */ -void dAcOdoor_c::startPushEvent(void *zevData) {} + mVec3_c vecs[6] = { + mVec3_c(min_l.x, min_l.y, max_l.z), mVec3_c(min_l.x, max_l.y, min_l.z), + mVec3_c(min_l.x, max_l.y, max_l.z), mVec3_c(max_l.x, min_l.y, min_l.z), + mVec3_c(max_l.x, min_l.y, max_l.z), mVec3_c(max_l.x, max_l.y, min_l.z), + }; -/** */ -void dAcOdoor_c::startOpenEvent(void *zevData) {} + for (int i = 0, j = 0; i < (int)ARRAY_LENGTH(vecs); j++, i++) { + local.multVec(vecs[i], vecs[j]); + world.multVec(vecs[i], vecs[j]); + // clang-format off + min.set( + nw4r::ut::Min(vecs[j].x, min.x), + nw4r::ut::Min(vecs[j].y, min.y), + nw4r::ut::Min(vecs[j].z, min.z) + ); + max.set( + nw4r::ut::Max(vecs[j].x, max.x), + nw4r::ut::Max(vecs[j].y, max.y), + nw4r::ut::Max(vecs[j].z, max.z) + ); + // clang-format on + } + } + mBoundingBox.Set(min, max); + } + return SUCCEEDED; +} -/** */ -void dAcOdoor_c::doorPullEventCallback(dAcOdoor_c *) {} +int dAcOdoor_c::draw() { + if (fn_572_4430()) { + if (!mTimeBits.field_0x00) { + drawModelType1(&mMdl1); + } + if (!mTimeBits.field_0x01) { + drawModelType1(&mMdl0); + } + } else { + if (getType() == SUBTYPE_7) { + drawModelType1(&mAnmChr.getModel()); + } else { + drawModelType1(&mMdl0); + } + } + return SUCCEEDED; +} -/** */ -void dAcOdoor_c::doorPushEventCallback(dAcOdoor_c *) {} +bool dAcOdoor_c::isLocked() { + if (getLockParameter() == LOCK_KEY) { + return mLock.isLinked(); + } -/** */ -void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) {} + switch (field_0x5B1) { + case 0: return false; + case 1: + case 3: return mSceneflag < 0xFF ? !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + case 2: return false; + case 4: return mSceneflag < 0xFF ? SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + case 5: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::DAY; + case 6: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT; + default: return true; + } +} -/** */ -void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) {} +bool dAcOdoor_c::canOpen() { + // NONMATCHING + // https://decomp.me/scratch/dHRfo + // Duplicate load of dStageMgr_c::sInstance for nullptr check and function call + // Happens in d_a_obj_door_boss as well + dStageMgr_c *pStageMgr = dStageMgr_c::GetInstance(); + if (pStageMgr != nullptr && pStageMgr->isAreaTypeDungeonOrBoss()) { + return getLockParameter() == LOCK_KEY && mLock.isLinked(); + } + return isLocked(); +} -/** */ -void dAcOdoor_c::startLockedEvent(void *zevData) {} +f32 dAcOdoor_c::fn_572_33E0() { + return -80.f; +} -/** */ -void dAcOdoor_c::pullLockedEventCallback(dAcOdoor_c *) {} +// HACK +inline u32 createBits(const u32 &a, const u32 &b) { + return a | b; +} -/** */ -void dAcOdoor_c::pushLockedEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startUnlockEvent() {} +void dAcOdoor_c::startPullEventWithCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::unlockEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::openCallbackCommon(dAcOdoor_c *) {} +void dAcOdoor_c::startPushEventWithCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), (void *)doorPushEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +void dAcOdoor_c::startPullEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPullEventWithoutCallback(zevData); break; + case 1: startPullEventWithCallback(zevData); break; + } +} + +void dAcOdoor_c::startPushEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPushEventWithoutCallback(zevData); break; + case 1: startPushEventWithCallback(zevData); break; + } +} + +void dAcOdoor_c::startOpenEvent(void *zevData) { + if (isPlayerInFrontOfDoor()) { + startPullEvent(zevData); + } else if (field_0x5BB) { + Event event("KobunDoorPush", zevData, 100, 0x100001, nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + } else { + startPushEvent(zevData); + } +} + +void dAcOdoor_c::doorPullEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} + +void dAcOdoor_c::doorPushEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} + +void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) { + Event event(DoorPullLock, zevData, 100, 0x100001, (void *)pullLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) { + Event event(DoorPushLock, zevData, 100, 0x100001, (void *)pushLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +void dAcOdoor_c::startLockedEvent(void *zevData) { + if (isPlayerInFrontOfDoor()) { + startDoorPullLockedEvent(zevData); + } else { + startDoorPushLockedEvent(zevData); + } +} + +void dAcOdoor_c::pullLockedEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + if (pDoor->hasFlowEntryPoint()) { + pDoor->playInteractionLocked(); + } + u16 flag = pDoor->fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + if (flag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); + } +} + +void dAcOdoor_c::pushLockedEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + if (pDoor->hasFlowEntryPoint()) { + pDoor->playInteractionLocked(); + } + u16 flag = pDoor->fn_572_3F90(); + if (flag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); + } +} + +void dAcOdoor_c::startUnlockEvent() { + Event event("ShutterUnlock", 100, 0x100001, (void *)unlockEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +extern "C" void increaseSmallKeyCounter(int amt); + +void dAcOdoor_c::unlockEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + void *zevData = getOarcZev("DoorAnim"); + if (pDoor->isPlayerInFrontOfDoor()) { + switch (pDoor->field_0x5B3) { + case 0: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + case 1: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + } + + } else { + switch (pDoor->field_0x5B3) { + case 0: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + case 1: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + } + } + + if (pDoor->mSceneflag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, pDoor->mSceneflag); + } + + increaseSmallKeyCounter(-1); +} + +void dAcOdoor_c::openCallbackCommon(void *vDoor) { + if (vDoor == nullptr) { + return; + } + dAcOdoor_c *pDoor = static_cast(vDoor); + + bool search = true; + dAcOFence_c *pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); + while (search && pFence != nullptr) { + if (mAng::abs(dAcPy_c::GetLink()->mRotation.y - pFence->mRotation.y) < 0x4000) { + const mVec3_c &posFence = pFence->mPosition; + const mVec3_c &position = pDoor->mPosition; + if (posFence.squareDistanceToXZ(position) < 22500.f && nw4r::math::FAbs(posFence.y - position.y) < 500.f) { + pFence->setObjectProperty(OBJ_PROP_0x200); + pFence->fn_550_1250(); + pFence->fn_550_12B0(); + search = false; + continue; + } + } + pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, pFence)); + } +} void dAcOdoor_c::registerInEvent() { if (isInTimeDoorEvent()) { @@ -1132,144 +1475,295 @@ void dAcOdoor_c::registerInEvent() { } } -void dAcOdoor_c::unkVirtFunc_0x6C() {} +void dAcOdoor_c::unkVirtFunc_0x6C() { + fn_572_4100(); +} -void dAcOdoor_c::doInteraction(s32 interaction) {} +void dAcOdoor_c::doInteraction(s32 interaction) { + if (getType() == SUBTYPE_7) { + void *zevData = getOarcZev("DoorF"); + Event event("FTypeDoorOut", zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + return; + } -/** */ -s32 dAcOdoor_c::getKeyParameter() {} // getFromParams(6, 0x1) + void *zevData = getOarcZev("DoorAnim"); -/** */ -s32 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF + switch (interaction) { + case OPEN: { + if (getLockParameter() == LOCK_KEY) { + if (!mLock.isLinked()) { + startOpenEvent(zevData); + } else { + if (dAcItem_c::getSmallKeyCount() != 0) { + if (isConnectedToOtherDoor()) { + if (isPlayerInteractable()) { + startUnlockEvent(); + } else { + dAcOdoor_c *pDoor = getConnectedDoorRef().get(); + pDoor->mLock.link(mLock.get()); + pDoor->startUnlockEvent(); + } + } else { + startOpenEvent(zevData); + } + } else { + Event event(getDoorInteractionName(), 100, 0x100001, nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + } + } + } else { + startOpenEvent(zevData); + if (field_0x5B1 == 2 && mSceneflag < 0xFF) { + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } + } break; + case EXAMINE_TALK: { + startLockedEvent(zevData); + } break; + } +} -/** */ -u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF +s32 dAcOdoor_c::getLockParameter() { + return getFromParams(6, 0x1); +} -/** fn_572_3F60 */ -u8 dAcOdoor_c::fn_572_3F60() {} // (mRotation.z >> 0) & 0xF +s32 dAcOdoor_c::getSubtype2() { + return (mRotation.x >> 0) & 0xFF; +} -/** fn_572_3F70 */ -u8 dAcOdoor_c::fn_572_3F70() {} // (mRotation.z >> 4) & 0x3F +u8 dAcOdoor_c::getSceneflag() { + return (mRotation.x >> 8) & 0xFF; +} -/** fn_572_3F80 */ -u8 dAcOdoor_c::fn_572_3F80() {} // (mRotation.z >> 10) & 0x3F +u8 dAcOdoor_c::fn_572_3F60() { + return (mRotation.z >> 0) & 0xF; +} -/** fn_572_3F90 */ -u8 dAcOdoor_c::fn_572_3F90() {} // (getParams2Lower() >> 0) & 0xFF +u8 dAcOdoor_c::fn_572_3F70() { + return (mRotation.z >> 4) & 0x3F; +} -/** fn_572_3FC0 */ -f32 dAcOdoor_c::getInteractionMinX() {} // -80.f +u8 dAcOdoor_c::fn_572_3F80() { + return (mRotation.z >> 10) & 0x3F; +} -/** fn_572_3FD0 */ -f32 dAcOdoor_c::getInteractionMaxX() {} // 80.f +u16 dAcOdoor_c::fn_572_3F90() { + return getParams2Lower() & 0xFF; +} -/** fn_572_3FE0 */ -f32 dAcOdoor_c::getInteractionMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionMinX() { + return -80.f; +} -/** fn_572_3FF0 */ -f32 dAcOdoor_c::getInteractionMaxZ() {} // 100.f +f32 dAcOdoor_c::getInteractionMaxX() { + return 80.f; +} -/** fn_572_4000 */ -f32 dAcOdoor_c::getInteractionLockMinX() {} // -160.f +f32 dAcOdoor_c::getInteractionMinZ() { + return -100.f; +} -/** fn_572_4010 */ -f32 dAcOdoor_c::getInteractionLockMaxX() {} // 160.f +f32 dAcOdoor_c::getInteractionMaxZ() { + return 100.f; +} -/** fn_572_4020 */ -f32 dAcOdoor_c::getInteractionLockMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionLockMinX() { + return -160.f; +} -/** fn_572_4030 */ -f32 dAcOdoor_c::getInteractionLockMaxZ() {} // 100.f +f32 dAcOdoor_c::getInteractionLockMaxX() { + return 160.f; +} -/** */ -void dAcOdoor_c::setRoomId(s8 roomId) {} // mRoomId = roomId; +f32 dAcOdoor_c::getInteractionLockMinZ() { + return -100.f; +} -/** fn_572_4050 */ -void dAcOdoor_c::fn_572_4050(u32 flags) {} // field_0x5A8 = flags +f32 dAcOdoor_c::getInteractionLockMaxZ() { + return 100.f; +} -/** fn_572_4060 */ -void dAcOdoor_c::fn_572_4060(s8) {} // field_0x5B3 = in +void dAcOdoor_c::setRoomId(s8 roomId) { + mRoomID = roomId; +} -/** fn_572_4070 */ -void dAcOdoor_c::fn_572_4070(s8) {} // field_0x5B4 = in +void dAcOdoor_c::fn_572_4050(u32 flags) { + mFlags = flags; +} -/** fn_572_4080 */ -void dAcOdoor_c::fn_572_4080(s8) {} // field_0x5B5 = in +void dAcOdoor_c::fn_572_4060(u8 in) { + field_0x5B3 = in; +} -/** fn_572_4090 */ -void dAcOdoor_c::fn_572_4090() {} // field_0x5B7 = true +void dAcOdoor_c::fn_572_4070(s8 in) { + field_0x5B4 = in; +} -/** fn_572_40A0 */ -void dAcOdoor_c::fn_572_40A0() {} // field_0x5B7 = false +void dAcOdoor_c::fn_572_4080(s8 in) { + field_0x5B5 = in; +} -/** fn_572_40B0 */ -void dAcOdoor_c::fn_572_40B0() {} // field_0x5B8 = true +void dAcOdoor_c::fn_572_4090() { + field_0x5B7 = true; +} -/** fn_572_40C0 */ -void dAcOdoor_c::fn_572_40C0() {} // field_0x5B8 = false +void dAcOdoor_c::fn_572_40A0() { + field_0x5B7 = false; +} -/** fn_572_40D0 */ -void dAcOdoor_c::fn_572_40D0() {} // field_0x5B9 = true +void dAcOdoor_c::fn_572_40B0() { + field_0x5B8 = true; +} -/** fn_572_40E0 */ -bool dAcOdoor_c::fn_572_40E0() const {} // field_0x5A8 & 1 +void dAcOdoor_c::fn_572_40C0() { + field_0x5B8 = false; +} -/** fn_572_40F0 */ -void dAcOdoor_c::fn_572_40F0() {} // field_0x5A8 |= 1 (Time Door) +void dAcOdoor_c::fn_572_40D0() { + field_0x5B9 = true; +} -/** fn_572_4100 */ -void dAcOdoor_c::fn_572_4100() {} // field_0x5A8 &= ~1 +bool dAcOdoor_c::fn_572_40E0() const { + return mFlags & 1; +} -/** fn_572_4110 */ -void dAcOdoor_c::fn_572_4110() {} // field_0x5A8 |= 2 +void dAcOdoor_c::fn_572_40F0() { + fn_572_4050(mFlags | 1); +} -/** fn_572_4120 */ -void dAcOdoor_c::fn_572_4120() {} // field_0x5A8 &= ~2 +void dAcOdoor_c::fn_572_4100() { + fn_572_4050(mFlags & ~1); +} -/** fn_572_4130 */ -bool dAcOdoor_c::fn_572_4130(bool &b) const {} // checkRoom(field_0x5B4,b) +void dAcOdoor_c::fn_572_4110() { + fn_572_4050(mFlags | 2); +} -/** fn_572_4140 */ -bool dAcOdoor_c::fn_572_4140(bool &b) const {} // checkRoom(field_0x5B5,b) +void dAcOdoor_c::fn_572_4120() { + fn_572_4050(mFlags & ~2); +} -/** fn_572_4150 */ -bool dAcOdoor_c::fn_572_4150(bool &b) const {} // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 +bool dAcOdoor_c::fn_572_4130(bool &b) const { + checkRoom(field_0x5B4, b); +} -/** */ -void dAcOdoor_c::triggerExit() {} +bool dAcOdoor_c::fn_572_4140(bool &b) const { + checkRoom(field_0x5B5, b); +} -/** */ -bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const {} +bool dAcOdoor_c::fn_572_4150(bool &b) const { + bool b0, b1; + if (!fn_572_4130(b0)) { + return false; + } + if (!fn_572_4140(b1)) { + return false; + } + b = b0 && b1; + return true; +} -/** fn_572_4310 */ -void dAcOdoor_c::transitionPushRoomFlags() const {} +void dAcOdoor_c::triggerExit() { + if (isLeavingSealedTempleSideDoorPostSkyKeep()) { + dScGame_c::GetInstance()->triggerExit(mRoomID, 11, 2, 2); + } else { + dScGame_c::GetInstance()->triggerExit(mRoomID, getFromParams(8, 0xFF), 2, 2); + } +} -/** fn_572_4430 */ -bool dAcOdoor_c::transitionPullRoomFlags() const {} +bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const { + return s32(mParams & 0x3F) == SUBTYPE_4 && field_0x5B5 == 1 && + StoryflagManager::sInstance->getFlag(STORYFLAG_342) && dScGame_c::isCurrentStage(sStageF402); +} -/** fn_572_4340 */ -void dAcOdoor_c::fn_572_4340() const {} // nop +void dAcOdoor_c::transitionPushRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B4(), getField_0x5B5()); +} -/** fn_572_4370 */ -bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const {} // Is in front of door +void dAcOdoor_c::transitionPullRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B5(), getField_0x5B4()); +} -/** */ -bool dAcOdoor_c::isPlayerInFrontOfDoor() const {} +bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const { + s32 diff = mRotation.y - (point - mPosition).atan2sX_Z(); + return mAng::abs(diff) <= 0x4000; +} -/** */ -bool dAcOdoor_c::hasFlowEntryPoint() const {} // getFromParams(16, 0xFFFF) +bool dAcOdoor_c::isPlayerInFrontOfDoor() const { + return fn_572_4370(dAcPy_c::GetLink()->mPosition); +} -/** fn_572_4430 */ -bool dAcOdoor_c::fn_572_4430() const {} // field_0x5A8 & 2 +bool dAcOdoor_c::hasFlowEntryPoint() { + return getFromParams(16, 0xFFFF); +} -/** fn_572_4440 */ -void dAcOdoor_c::fn_572_4440() {} // Sets the Postion Copies +bool dAcOdoor_c::fn_572_4430() const { + return mFlags & 2; +} -/** */ -bool dAcOdoor_c::isPlayerInteractable() const {} +void dAcOdoor_c::fn_572_4440() { + mVec3_c pos; + if (getType() == SUBTYPE_7) { + pos.set(mPosition); + pos.y += 150.f; + } else { + mMtx_c m; + mAnmChr.getModel().getNodeWorldMtx(1, m); + m.transM(sVec0); + m.multVec(sVec1, pos); + } + mPositionCopy2.set(pos); + mPositionCopy3.set(pos); +} -/** fn_572_4600 */ -bool dAcOdoor_c::isPlayerInteractableLocked() const {} +bool dAcOdoor_c::isPlayerInteractable() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); -/** */ -void dAcOdoor_c::playInteractionLocked() const {} + if (v.x < getInteractionMinX()) { + return false; + } + if (getInteractionMaxX() < v.x) { + return false; + } + if (v.z < getInteractionMinZ()) { + return false; + } + if (getInteractionMaxZ() < v.z) { + return false; + } + return true; +} + +bool dAcOdoor_c::isPlayerInteractableLocked() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); + v.x += 80.f; + + if (v.x < getInteractionLockMinX()) { + return false; + } + if (getInteractionLockMaxX() < v.x) { + return false; + } + if (v.z < getInteractionLockMinZ()) { + return false; + } + if (getInteractionLockMaxZ() < v.z) { + return false; + } + return true; +} + +void dAcOdoor_c::playInteractionLocked() { + Event event(getDoorInteractionName(), 100, 0x100001, nullptr, nullptr); + EventManager::setEvent(this, &event, nullptr); +}