From 4a0dfc55cc19612e16cc277ee46dc8965fa3ab9d Mon Sep 17 00:00:00 2001 From: Sebastian Snoer Date: Tue, 27 May 2025 17:56:56 +0200 Subject: [PATCH 1/9] d_a_obj_bird_sp Almost implemented, mismatched update function --- config/SOUE01/rels/d_a_birdNP/symbols.txt | 2 +- .../SOUE01/rels/d_a_obj_bird_spNP/symbols.txt | 12 ++-- include/d/a/d_a_bird.h | 8 +++ include/d/a/obj/d_a_obj_bird_sp.h | 8 +++ src/REL/d/a/d_a_bird.cpp | 4 ++ src/REL/d/a/obj/d_a_obj_bird_sp.cpp | 70 +++++++++++++++++++ 6 files changed, 97 insertions(+), 7 deletions(-) diff --git a/config/SOUE01/rels/d_a_birdNP/symbols.txt b/config/SOUE01/rels/d_a_birdNP/symbols.txt index da10b192..47d12cac 100644 --- a/config/SOUE01/rels/d_a_birdNP/symbols.txt +++ b/config/SOUE01/rels/d_a_birdNP/symbols.txt @@ -91,7 +91,7 @@ fn_129_8390 = .text:0x00008390; // type:function size:0x374 fn_129_8710 = .text:0x00008710; // type:function size:0x29C fn_129_89B0 = .text:0x000089B0; // type:function size:0x3C4 fn_129_8D80 = .text:0x00008D80; // type:function size:0x4C -fn_129_8DD0 = .text:0x00008DD0; // type:function size:0xB8 +speedUpAccel__FR7mVec3_c = .text:0x00008DD0; // type:function size:0xB8 fn_129_8E90 = .text:0x00008E90; // type:function size:0x2B4 changesRot = .text:0x00009150; // type:function size:0x74 fn_129_91D0 = .text:0x000091D0; // type:function size:0x374 diff --git a/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt b/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt index a33ec37a..413fc633 100644 --- a/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt @@ -2,15 +2,15 @@ _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 dAcObjBirdSp_c_classInit__Fv = .text:0x00000070; // type:function size:0x54 -fn_241_D0 = .text:0x000000D0; // type:function size:0x8 -AcObjBirdSp__init = .text:0x000000E0; // type:function size:0xC4 -AcObjBirdSp__update = .text:0x000001B0; // type:function size:0x230 -fn_241_3E0 = .text:0x000003E0; // type:function size:0x8 +createHeap__14dAcObjBirdSp_cFv = .text:0x000000D0; // type:function size:0x8 +create__14dAcObjBirdSp_cFv = .text:0x000000E0; // type:function size:0xC4 +actorExecute__14dAcObjBirdSp_cFv = .text:0x000001B0; // type:function size:0x230 +draw__14dAcObjBirdSp_cFv = .text:0x000003E0; // type:function size:0x8 __dt__14dAcObjBirdSp_cFv = .text:0x000003F0; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global lbl_241_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float AcObjBirdSp__colliderInit = .data:0x00000000; // type:object size:0x30 g_profile_OBJ_BIRD_SP_UP = .data:0x00000030; // type:object size:0x10 -lbl_241_data_40 = .data:0x00000040; // type:object size:0x20 -AcObjBirdSp__vtable = .data:0x00000060; // type:object size:0x80 +@14827 = .data:0x00000040; // type:object size:0x20 scope:local +__vt__14dAcObjBirdSp_c = .data:0x00000060; // type:object size:0x80 diff --git a/include/d/a/d_a_bird.h b/include/d/a/d_a_bird.h index 42db16b8..dcc03a6d 100644 --- a/include/d/a/d_a_bird.h +++ b/include/d/a/d_a_bird.h @@ -26,11 +26,19 @@ public: STATE_FUNC_DECLARE(dBird_c, MiniGameEnd); STATE_FUNC_DECLARE(dBird_c, MiniGameLevelUpDemo); + // fn_129_8DD0, only referenced by d_a_obj_bird_sp + void speedUpAccel(mVec3_c ¶m); + s16 getNumDashes() const { return mNumDashes; } + static dBird_c *getInstance() { + return spInstance; + } + private: + static dBird_c *spInstance; /* 0x??? */ STATE_MGR_DECLARE(dBird_c); u8 _0x36C[0xF8E - 0x36C]; /* 0xF8E */ s16 mNumDashes; diff --git a/include/d/a/obj/d_a_obj_bird_sp.h b/include/d/a/obj/d_a_obj_bird_sp.h index efeb9a2e..3a4919bc 100644 --- a/include/d/a/obj/d_a_obj_bird_sp.h +++ b/include/d/a/obj/d_a_obj_bird_sp.h @@ -2,13 +2,21 @@ #define D_A_OBJ_BIRD_SP_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/cc/d_cc_d.h" class dAcObjBirdSp_c : public dAcObjBase_c { public: dAcObjBirdSp_c() {} virtual ~dAcObjBirdSp_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + private: + static dCcD_SrcSph sCcSrc; + /* 0x330 */ dCcD_Sph mCollider; }; #endif diff --git a/src/REL/d/a/d_a_bird.cpp b/src/REL/d/a/d_a_bird.cpp index 2700bfcb..7344c800 100644 --- a/src/REL/d/a/d_a_bird.cpp +++ b/src/REL/d/a/d_a_bird.cpp @@ -18,6 +18,8 @@ STATE_DEFINE(dBird_c, MiniGameMove); STATE_DEFINE(dBird_c, MiniGameEnd); STATE_DEFINE(dBird_c, MiniGameLevelUpDemo); +dBird_c *dBird_c::spInstance; + void dBird_c::initializeState_Wait() {} void dBird_c::executeState_Wait() {} void dBird_c::finalizeState_Wait() {} @@ -63,3 +65,5 @@ void dBird_c::finalizeState_MiniGameEnd() {} void dBird_c::initializeState_MiniGameLevelUpDemo() {} void dBird_c::executeState_MiniGameLevelUpDemo() {} void dBird_c::finalizeState_MiniGameLevelUpDemo() {} + +void speedUpAccel(mVec3_c ¶m) {} diff --git a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp index f188f860..db650e5a 100644 --- a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp +++ b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp @@ -1,3 +1,73 @@ #include "d/a/obj/d_a_obj_bird_sp.h" +#include "d/a/d_a_bird.h" +#include "d/col/cc/d_cc_s.h" +#include "f/f_base.h" +#include "f/f_profile_name.h" +#include "m/m_mtx.h" + +// clang-format off +dCcD_SrcSph dAcObjBirdSp_c::sCcSrc = { + /* mObjInf */ { + /* mObjAt */ {0, 2, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {0xfeb77fff, 0x00000105, {0, 00, 0x407}, 0, 0}, + /* mObjCo */ {0x00004029}}, + /* mSphInf */ {1000.0f} +}; +// clang-format on + SPECIAL_ACTOR_PROFILE(OBJ_BIRD_SP_UP, dAcObjBirdSp_c, fProfile::OBJ_BIRD_SP_UP, 0x260, 0, 1); + +bool dAcObjBirdSp_c::createHeap() { + return SUCCEEDED; +} + +int dAcObjBirdSp_c::create() { + CREATE_ALLOCATOR(dAcObjBirdSp_c); + + boundingBox.Set(mVec3_c(-2000, -2000, -2000), mVec3_c(2000, 2000, 2000)); + mCollider.Set(sCcSrc); + mCollider.SetStts(mStts); + mCollider.SetR(mScale.x * 1000.0f); + + return SUCCEEDED; +} +int dAcObjBirdSp_c::actorExecute() { + /* if its colliding with Bird or Player */ + if (mCollider.ChkCoHit() && mCollider.GetCoActor() != nullptr && + (mCollider.GetCoActor()->profile_name == fProfile::BIRD || + mCollider.GetCoActor()->profile_name == fProfile::PLAYER)) { + mVec3_c posChange(0, -0.2, 1.0); + mMtx_c matrix; + matrix.ZXYrotS(rotation); + PSMTXMultVec(matrix.m, posChange, posChange); + + // Current most accurate solution + if ((position.z - dBird_c::getInstance()->position.z) * posChange.z + + (position.y - dBird_c::getInstance()->position.y) * posChange.y + + (position.x - dBird_c::getInstance()->position.x) * posChange.x < + 0) { + posChange = -posChange; + } + + // !! I think the error occurs down here, and the if statement i think matches as good as i can get it to + // First attempt + /* posChange = (posChange * 1000 + position) - dBird_c::getInstance()->position; */ + // Current most accurate solution + posChange.x = (posChange.x * 1000.0f + position.x) - dBird_c::getInstance()->position.x; + posChange.y = (posChange.y * 1000.0f + position.y) - dBird_c::getInstance()->position.y; + posChange.z = (posChange.z * 1000.0f + position.z) - dBird_c::getInstance()->position.z; + dBird_c::getInstance()->speedUpAccel(posChange); + } + + mCollider.SetC(position); + dCcS::GetInstance()->Set(&mCollider); + PSMTXTrans(mWorldMtx.m, position.x, position.y, position.z); + mWorldMtx.ZXYrotM((mAng3_c &)position); + + return SUCCEEDED; +} + +int dAcObjBirdSp_c::draw() { + return SUCCEEDED; +} From 18b2de0643fbb994426dec1b614a79b1f1944d34 Mon Sep 17 00:00:00 2001 From: Sebastian Snoer Date: Tue, 27 May 2025 18:14:34 +0200 Subject: [PATCH 2/9] use at types and add missing --- include/d/col/c/c_cc_d.h | 4 ++++ src/REL/d/a/obj/d_a_obj_bird_sp.cpp | 30 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index d3a0cf5a..574e6b8a 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -360,6 +360,10 @@ enum dCcD_ObjAtType { /* 0x 0200 0000 */ AT_TYPE_0x2000000 = (1 << 25), /* 0x 0400 0000 */ AT_TYPE_KOLOKTOS_SWORD = (1 << 26), /* 0x 0800 0000 */ AT_TYPE_0x8000000 = (1 << 27), + /* 0x 1000 0000 */ AT_TYPE_0x10000000 = (1 << 28), + /* 0x 2000 0000 */ AT_TYPE_0x20000000 = (1 << 29), + /* 0x 4000 0000 */ AT_TYPE_0x40000000 = (1 << 30), + /* 0x 8000 0000 */ AT_TYPE_0x80000000 = (1 << 31), /* 0x 0148 8200 */ AT_TYPE_COMMON0 = AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND, }; diff --git a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp index db650e5a..7d6ab62f 100644 --- a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp +++ b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp @@ -10,7 +10,35 @@ dCcD_SrcSph dAcObjBirdSp_c::sCcSrc = { /* mObjInf */ { /* mObjAt */ {0, 2, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {0xfeb77fff, 0x00000105, {0, 00, 0x407}, 0, 0}, + /* mObjTg */ {(AT_TYPE_0x1 | + AT_TYPE_SWORD | + AT_TYPE_0x4 | + AT_TYPE_PHYSICS | + AT_TYPE_0x10 | + AT_TYPE_BOMB | + AT_TYPE_0x40 | + AT_TYPE_SLINGSHOT | + AT_TYPE_0x100 | + AT_TYPE_WIND | + AT_TYPE_DAMAGE | + AT_TYPE_WHIP | + AT_TYPE_0x1000 | + AT_TYPE_ARROW | + AT_TYPE_CLAWSHOT | + AT_TYPE_BELLOWS | + AT_TYPE_0x20000 | + AT_TYPE_0x40000 | + AT_TYPE_BUBBLE | + AT_TYPE_0x200000 | + AT_TYPE_0x800000 | + AT_TYPE_0x2000000 | + AT_TYPE_KOLOKTOS_SWORD | + AT_TYPE_0x8000000 | + AT_TYPE_0x10000000 | + AT_TYPE_0x20000000 | + AT_TYPE_0x40000000 | + AT_TYPE_0x80000000 + ), 0x00000105, {0, 00, 0x407}, 0, 0}, /* mObjCo */ {0x00004029}}, /* mSphInf */ {1000.0f} }; From b210414eb76fd395d1dc636511760e5af0c42450 Mon Sep 17 00:00:00 2001 From: Swekka Date: Tue, 27 May 2025 18:39:46 +0200 Subject: [PATCH 3/9] d_a_obj_mapparts OK --- config/SOUE01/rels/d_a_obj_mappartsNP/symbols.txt | 2 +- configure.py | 2 +- include/d/a/obj/d_a_obj_mapparts.h | 2 ++ src/REL/d/a/obj/d_a_obj_mapparts.cpp | 5 +++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_mappartsNP/symbols.txt b/config/SOUE01/rels/d_a_obj_mappartsNP/symbols.txt index 6b1fbce5..8dc86aed 100644 --- a/config/SOUE01/rels/d_a_obj_mappartsNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_mappartsNP/symbols.txt @@ -2,7 +2,7 @@ _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 dAcOMapparts_c_classInit__Fv = .text:0x00000070; // type:function size:0x4C -AcOMapparts__init = .text:0x000000C0; // type:function size:0x8 +create__14dAcOMapparts_cFv = .text:0x000000C0; // type:function size:0x8 __dt__14dAcOMapparts_cFv = .text:0x000000D0; // type:function size:0x58 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global diff --git a/configure.py b/configure.py index 9abbc2b9..14640025 100644 --- a/configure.py +++ b/configure.py @@ -2147,7 +2147,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_lotus", "REL/d/a/obj/d_a_obj_lotus.cpp"), Rel(NonMatching, "d_a_obj_lotus_flower", "REL/d/a/obj/d_a_obj_lotus_flower.cpp"), Rel(NonMatching, "d_a_obj_lotus_seed", "REL/d/a/obj/d_a_obj_lotus_seed.cpp"), - Rel(NonMatching, "d_a_obj_mapparts", "REL/d/a/obj/d_a_obj_mapparts.cpp"), + Rel(Matching, "d_a_obj_mapparts", "REL/d/a/obj/d_a_obj_mapparts.cpp"), Rel(Matching, "d_a_obj_megami_island", "REL/d/a/obj/d_a_obj_megami_island.cpp"), Rel(NonMatching, "d_a_obj_mg_pumpkin", "REL/d/a/obj/d_a_obj_mg_pumpkin.cpp"), Rel(NonMatching, "d_a_obj_mole_cover", "REL/d/a/obj/d_a_obj_mole_cover.cpp"), diff --git a/include/d/a/obj/d_a_obj_mapparts.h b/include/d/a/obj/d_a_obj_mapparts.h index 7242dd91..75c6993f 100644 --- a/include/d/a/obj/d_a_obj_mapparts.h +++ b/include/d/a/obj/d_a_obj_mapparts.h @@ -8,6 +8,8 @@ public: dAcOMapparts_c() {} virtual ~dAcOMapparts_c() {} + virtual int create() override; + private: }; diff --git a/src/REL/d/a/obj/d_a_obj_mapparts.cpp b/src/REL/d/a/obj/d_a_obj_mapparts.cpp index 274c280b..5e4a118f 100644 --- a/src/REL/d/a/obj/d_a_obj_mapparts.cpp +++ b/src/REL/d/a/obj/d_a_obj_mapparts.cpp @@ -1,3 +1,8 @@ #include "d/a/obj/d_a_obj_mapparts.h" +#include "f/f_base.h" SPECIAL_ACTOR_PROFILE(OBJ_MAPPARTS, dAcOMapparts_c, fProfile::OBJ_MAPPARTS, 0x288, 0, 0); + +int dAcOMapparts_c::create() { + return FAILED; +} From 9d6c56adc30dd0a827173e1c2a2b57c784e0f6c9 Mon Sep 17 00:00:00 2001 From: Sebastian Snoer Date: Tue, 27 May 2025 20:12:45 +0200 Subject: [PATCH 4/9] d_a_obj_bird_sp Implemented --- config/SOUE01/rels/d_a_birdNP/symbols.txt | 4 +- include/d/a/d_a_bird.h | 2 +- include/d/col/c/c_cc_d.h | 4 -- src/REL/d/a/d_a_bird.cpp | 2 +- src/REL/d/a/obj/d_a_obj_bird_sp.cpp | 55 +++++------------------ 5 files changed, 15 insertions(+), 52 deletions(-) diff --git a/config/SOUE01/rels/d_a_birdNP/symbols.txt b/config/SOUE01/rels/d_a_birdNP/symbols.txt index 47d12cac..1b9b48bb 100644 --- a/config/SOUE01/rels/d_a_birdNP/symbols.txt +++ b/config/SOUE01/rels/d_a_birdNP/symbols.txt @@ -91,7 +91,7 @@ fn_129_8390 = .text:0x00008390; // type:function size:0x374 fn_129_8710 = .text:0x00008710; // type:function size:0x29C fn_129_89B0 = .text:0x000089B0; // type:function size:0x3C4 fn_129_8D80 = .text:0x00008D80; // type:function size:0x4C -speedUpAccel__FR7mVec3_c = .text:0x00008DD0; // type:function size:0xB8 +accelerateTowards__7dBird_cFR7mVec3_c = .text:0x00008DD0; // type:function size:0xB8 fn_129_8E90 = .text:0x00008E90; // type:function size:0x2B4 changesRot = .text:0x00009150; // type:function size:0x74 fn_129_91D0 = .text:0x000091D0; // type:function size:0x374 @@ -252,7 +252,7 @@ lbl_129_data_B50 = .data:0x00000B50; // type:object size:0xC data:string lbl_129_data_B5C = .data:0x00000B5C; // type:object size:0xC __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_129_bss_8 = .bss:0x00000008; // type:object size:0x14 data:4byte -LOFTWING_POINTER = .bss:0x0000001C; // type:object size:0x94 data:4byte +spInstance__7dBird_c = .bss:0x0000001C; // type:object size:0x94 data:4byte AcBird__STATE_MOVE = .bss:0x000000B0; // type:object size:0x40 data:4byte AcBird__STATE_HIDE = .bss:0x000000F0; // type:object size:0x40 data:4byte AcBird__STATE_RIDE_DEMO = .bss:0x00000130; // type:object size:0xC0 data:4byte diff --git a/include/d/a/d_a_bird.h b/include/d/a/d_a_bird.h index dcc03a6d..05450e45 100644 --- a/include/d/a/d_a_bird.h +++ b/include/d/a/d_a_bird.h @@ -27,7 +27,7 @@ public: STATE_FUNC_DECLARE(dBird_c, MiniGameLevelUpDemo); // fn_129_8DD0, only referenced by d_a_obj_bird_sp - void speedUpAccel(mVec3_c ¶m); + void accelerateTowards(mVec3_c &targetDirection); s16 getNumDashes() const { return mNumDashes; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 574e6b8a..d3a0cf5a 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -360,10 +360,6 @@ enum dCcD_ObjAtType { /* 0x 0200 0000 */ AT_TYPE_0x2000000 = (1 << 25), /* 0x 0400 0000 */ AT_TYPE_KOLOKTOS_SWORD = (1 << 26), /* 0x 0800 0000 */ AT_TYPE_0x8000000 = (1 << 27), - /* 0x 1000 0000 */ AT_TYPE_0x10000000 = (1 << 28), - /* 0x 2000 0000 */ AT_TYPE_0x20000000 = (1 << 29), - /* 0x 4000 0000 */ AT_TYPE_0x40000000 = (1 << 30), - /* 0x 8000 0000 */ AT_TYPE_0x80000000 = (1 << 31), /* 0x 0148 8200 */ AT_TYPE_COMMON0 = AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND, }; diff --git a/src/REL/d/a/d_a_bird.cpp b/src/REL/d/a/d_a_bird.cpp index 7344c800..581a8ad9 100644 --- a/src/REL/d/a/d_a_bird.cpp +++ b/src/REL/d/a/d_a_bird.cpp @@ -66,4 +66,4 @@ void dBird_c::initializeState_MiniGameLevelUpDemo() {} void dBird_c::executeState_MiniGameLevelUpDemo() {} void dBird_c::finalizeState_MiniGameLevelUpDemo() {} -void speedUpAccel(mVec3_c ¶m) {} +void dBird_c::accelerateTowards(mVec3_c &targetDirection) {} diff --git a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp index 7d6ab62f..6d8301b5 100644 --- a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp +++ b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp @@ -1,6 +1,7 @@ #include "d/a/obj/d_a_obj_bird_sp.h" #include "d/a/d_a_bird.h" +#include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "f/f_base.h" #include "f/f_profile_name.h" @@ -10,35 +11,8 @@ dCcD_SrcSph dAcObjBirdSp_c::sCcSrc = { /* mObjInf */ { /* mObjAt */ {0, 2, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {(AT_TYPE_0x1 | - AT_TYPE_SWORD | - AT_TYPE_0x4 | - AT_TYPE_PHYSICS | - AT_TYPE_0x10 | - AT_TYPE_BOMB | - AT_TYPE_0x40 | - AT_TYPE_SLINGSHOT | - AT_TYPE_0x100 | - AT_TYPE_WIND | - AT_TYPE_DAMAGE | - AT_TYPE_WHIP | - AT_TYPE_0x1000 | - AT_TYPE_ARROW | - AT_TYPE_CLAWSHOT | - AT_TYPE_BELLOWS | - AT_TYPE_0x20000 | - AT_TYPE_0x40000 | - AT_TYPE_BUBBLE | - AT_TYPE_0x200000 | - AT_TYPE_0x800000 | - AT_TYPE_0x2000000 | - AT_TYPE_KOLOKTOS_SWORD | - AT_TYPE_0x8000000 | - AT_TYPE_0x10000000 | - AT_TYPE_0x20000000 | - AT_TYPE_0x40000000 | - AT_TYPE_0x80000000 - ), 0x00000105, {0, 00, 0x407}, 0, 0}, + // AT_TYPE_COMMON0 - AT_TYPE_WIND + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x00000105, {0, 00, 0x407}, 0, 0}, /* mObjCo */ {0x00004029}}, /* mSphInf */ {1000.0f} }; @@ -70,28 +44,21 @@ int dAcObjBirdSp_c::actorExecute() { matrix.ZXYrotS(rotation); PSMTXMultVec(matrix.m, posChange, posChange); - // Current most accurate solution - if ((position.z - dBird_c::getInstance()->position.z) * posChange.z + - (position.y - dBird_c::getInstance()->position.y) * posChange.y + - (position.x - dBird_c::getInstance()->position.x) * posChange.x < - 0) { + f32 angle = (position - dBird_c::getInstance()->position).dot(posChange); + if (angle < 0.0f) { posChange = -posChange; } - // !! I think the error occurs down here, and the if statement i think matches as good as i can get it to - // First attempt - /* posChange = (posChange * 1000 + position) - dBird_c::getInstance()->position; */ - // Current most accurate solution - posChange.x = (posChange.x * 1000.0f + position.x) - dBird_c::getInstance()->position.x; - posChange.y = (posChange.y * 1000.0f + position.y) - dBird_c::getInstance()->position.y; - posChange.z = (posChange.z * 1000.0f + position.z) - dBird_c::getInstance()->position.z; - dBird_c::getInstance()->speedUpAccel(posChange); + posChange *= 1000.0f; + posChange += position; + posChange -= dBird_c::getInstance()->position; + dBird_c::getInstance()->accelerateTowards(posChange); } mCollider.SetC(position); dCcS::GetInstance()->Set(&mCollider); - PSMTXTrans(mWorldMtx.m, position.x, position.y, position.z); - mWorldMtx.ZXYrotM((mAng3_c &)position); + mWorldMtx.transS(position.x, position.y, position.z); + mWorldMtx.ZXYrotM(rotation); return SUCCEEDED; } From d7c0c0591ee5c2d525a35a6d5b586ed2708918a4 Mon Sep 17 00:00:00 2001 From: Sebastian Snoer Date: Tue, 27 May 2025 20:16:16 +0200 Subject: [PATCH 5/9] d_a_obj_bird_sp Ok --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 95f72ab1..68374d68 100644 --- a/configure.py +++ b/configure.py @@ -1957,7 +1957,7 @@ config.libs = [ Rel( NonMatching, "d_a_obj_bigbomb_flower", "REL/d/a/obj/d_a_obj_bigbomb_flower.cpp" ), - Rel(NonMatching, "d_a_obj_bird_sp", "REL/d/a/obj/d_a_obj_bird_sp.cpp"), + Rel(Matching, "d_a_obj_bird_sp", "REL/d/a/obj/d_a_obj_bird_sp.cpp"), Rel(Matching, "d_a_obj_bird_statue", "REL/d/a/obj/d_a_obj_bird_statue.cpp"), Rel(NonMatching, "d_a_obj_blade", "REL/d/a/obj/d_a_obj_blade.cpp"), Rel(NonMatching, "d_a_obj_blast_rock", "REL/d/a/obj/d_a_obj_blast_rock.cpp"), From ddd456d450d676fabad4513dad9ead60bf58bb31 Mon Sep 17 00:00:00 2001 From: Swekka Date: Tue, 27 May 2025 21:27:32 +0200 Subject: [PATCH 6/9] d_a_obj_F400_gate_leaf OK --- .../rels/d_a_obj_F400_gate_leafNP/symbols.txt | 8 +-- configure.py | 2 +- include/d/a/obj/d_a_obj_F400_gate_leaf.h | 7 +++ include/d/flag/baseflag_manager.h | 4 ++ src/REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp | 53 +++++++++++++++++++ 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt b/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt index c599de77..442a1519 100644 --- a/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt @@ -2,10 +2,10 @@ _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 dAcOF400GateLeaf_c_classInit__Fv = .text:0x00000070; // type:function size:0x54 -fn_628_D0 = .text:0x000000D0; // type:function size:0x98 -AcOF400GateLeaf__init = .text:0x00000170; // type:function size:0xE4 -AcOF400GateLeaf__draw = .text:0x00000260; // type:function size:0x6C -AcOF400GateLeaf__getStoryflag = .text:0x000002D0; // type:function size:0xC +createHeap__18dAcOF400GateLeaf_cFv = .text:0x000000D0; // type:function size:0x98 +create__18dAcOF400GateLeaf_cFv = .text:0x00000170; // type:function size:0xE4 +draw__18dAcOF400GateLeaf_cFv = .text:0x00000260; // type:function size:0x6C +getStoryflag__18dAcOF400GateLeaf_cFv = .text:0x000002D0; // type:function size:0xC __dt__18dAcOF400GateLeaf_cFv = .text:0x000002E0; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global diff --git a/configure.py b/configure.py index c0869eb4..913412cf 100644 --- a/configure.py +++ b/configure.py @@ -2044,7 +2044,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_evil_field", "REL/d/a/obj/d_a_obj_evil_field.cpp"), Rel(NonMatching, "d_a_obj_F302_light", "REL/d/a/obj/d_a_obj_F302_light.cpp"), Rel( - NonMatching, "d_a_obj_F400_gate_leaf", "REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp" + Matching, "d_a_obj_F400_gate_leaf", "REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp" ), Rel( NonMatching, "d_a_obj_F400_gate_seal", "REL/d/a/obj/d_a_obj_F400_gate_seal.cpp" diff --git a/include/d/a/obj/d_a_obj_F400_gate_leaf.h b/include/d/a/obj/d_a_obj_F400_gate_leaf.h index a31e3ba8..24b73c1e 100644 --- a/include/d/a/obj/d_a_obj_F400_gate_leaf.h +++ b/include/d/a/obj/d_a_obj_F400_gate_leaf.h @@ -8,7 +8,14 @@ public: dAcOF400GateLeaf_c() {} virtual ~dAcOF400GateLeaf_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int draw() override; + + u16 getStoryflag(); + private: + /* 0x330 */ m3d::smdl_c mMdl; }; #endif diff --git a/include/d/flag/baseflag_manager.h b/include/d/flag/baseflag_manager.h index 932e3b76..db0aa401 100644 --- a/include/d/flag/baseflag_manager.h +++ b/include/d/flag/baseflag_manager.h @@ -35,6 +35,10 @@ public: u16 getUncommittedValue_Priv(u16 flag) const; + u32 checkFlagValid(u16 counterIdx) const { + return mpFlagIndex->checkFlagValid(counterIdx, mFlagCount); + } + protected: void setFlagSizes(u16 flagCount, u16 flagSizeBytes); diff --git a/src/REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp b/src/REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp index e8f0ee98..3596fc3c 100644 --- a/src/REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp +++ b/src/REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp @@ -1,3 +1,56 @@ #include "d/a/obj/d_a_obj_F400_gate_leaf.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/flag/storyflag_manager.h" +#include "f/f_base.h" +#include "nw4r/g3d/res/g3d_resfile.h" SPECIAL_ACTOR_PROFILE(OBJ_F400_GATE_LEAF, dAcOF400GateLeaf_c, fProfile::OBJ_F400_GATE_LEAF, 0x286, 0, 3); + +bool dAcOF400GateLeaf_c::createHeap() { + void *data = dAcObjBase_c::getOarcResFile("F400GateLeaf"); + if (data == nullptr) { + return false; + } + + nw4r::g3d::ResFile resFile(data); + if (!resFile.IsValid()){ + return false; + } + + nw4r::g3d::ResMdl mdl = resFile.GetResMdl("F400GateLeaf"); + if (!mdl.IsValid()){ + return false; + } + + return mMdl.create(mdl, &heap_allocator, 0, 1, nullptr); +} + +int dAcOF400GateLeaf_c::create() { + u32 counterIdx = getStoryflag(); + u32 flagValid = StoryflagManager::sInstance->checkFlagValid(counterIdx); + if (flagValid == 0) { + return FAILED; + } + CREATE_ALLOCATOR(dAcOF400GateLeaf_c); + mMdl.setPriorityDraw(0x1C, 9); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + mVec3_c min, max; + mMdl.getBounds(&min,&max); + boundingBox.Set(min, max); + return SUCCEEDED; +} + +int dAcOF400GateLeaf_c::draw() { + StoryflagManager *storyFlagManager = StoryflagManager::sInstance; + u32 counterIdx = getStoryflag(); + if (!storyFlagManager->getCounterOrFlag(counterIdx)) { + dAcObjBase_c::drawModelType1(&mMdl); + } + return SUCCEEDED; +} + +u16 dAcOF400GateLeaf_c::getStoryflag() { + return params & 0xffff; +} From cdaa0f414ff18edc799f8ecf57a533976f7ea71b Mon Sep 17 00:00:00 2001 From: Seba244c <23051740+Seba244c@users.noreply.github.com> Date: Wed, 28 May 2025 16:10:50 +0200 Subject: [PATCH 7/9] d_a_obj_bird_sp add scope:local to symbols.txt Co-authored-by: robojumper --- config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt b/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt index 413fc633..0e6f3c9b 100644 --- a/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_bird_spNP/symbols.txt @@ -9,7 +9,7 @@ draw__14dAcObjBirdSp_cFv = .text:0x000003E0; // type:function size:0x8 __dt__14dAcObjBirdSp_cFv = .text:0x000003F0; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -lbl_241_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float +lbl_241_rodata_0 = .rodata:0x00000000; // type:object size:0x18 scope:local data:float AcObjBirdSp__colliderInit = .data:0x00000000; // type:object size:0x30 g_profile_OBJ_BIRD_SP_UP = .data:0x00000030; // type:object size:0x10 @14827 = .data:0x00000040; // type:object size:0x20 scope:local From 1e5451ca59ab4706f887667925b5c11a410cece9 Mon Sep 17 00:00:00 2001 From: Swekka Date: Wed, 28 May 2025 16:36:55 +0200 Subject: [PATCH 8/9] add scope:local to labels and map vtable --- config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt b/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt index 442a1519..43ff366b 100644 --- a/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_F400_gate_leafNP/symbols.txt @@ -10,6 +10,6 @@ __dt__18dAcOF400GateLeaf_cFv = .text:0x000002E0; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global g_profile_OBJ_F400_GATE_LEAF = .data:0x00000000; // type:object size:0x10 -lbl_628_section4_10 = .data:0x00000010; // type:object size:0x10 -lbl_628_section4_20 = .data:0x00000020; // type:object size:0x20 data:string -lbl_628_section4_40 = .data:0x00000040; // type:object size:0x80 +lbl_628_section4_10 = .data:0x00000010; // type:object size:0x10 scope:local +lbl_628_section4_20 = .data:0x00000020; // type:object size:0x20 scope:local data:string +__vt__18dAcOF400GateLeaf_c = .data:0x00000040; // type:object size:0x80 From 3aab2a210dd51fee4acb8018c18fde9cc5d68c43 Mon Sep 17 00:00:00 2001 From: Swekka Date: Wed, 28 May 2025 17:00:52 +0200 Subject: [PATCH 9/9] d_a_obj_F400_gate_seal OK --- .../rels/d_a_obj_F400_gate_sealNP/symbols.txt | 18 +-- config/SOUE01/rels/d_a_obj_doorNP/symbols.txt | 2 +- configure.py | 2 +- include/d/a/obj/d_a_obj_F400_gate_seal.h | 12 ++ include/d/a/obj/d_a_obj_door.h | 2 + src/REL/d/a/obj/d_a_obj_F400_gate_seal.cpp | 112 ++++++++++++++++++ 6 files changed, 137 insertions(+), 11 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_F400_gate_sealNP/symbols.txt b/config/SOUE01/rels/d_a_obj_F400_gate_sealNP/symbols.txt index 280a5ff0..9d91a142 100644 --- a/config/SOUE01/rels/d_a_obj_F400_gate_sealNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_F400_gate_sealNP/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 dAcOF400GateSeal_c_classInit__Fv = .text:0x00000070; // type:function size:0x98 -AcOF400GateSeal__initModels = .text:0x00000110; // type:function size:0x11C -fn_629_230 = .text:0x00000230; // type:function size:0x8 -AcOF400GateSeal__init = .text:0x00000240; // type:function size:0x1A4 -fn_629_3F0 = .text:0x000003F0; // type:function size:0xD8 -AcOF400GateSeal__draw = .text:0x000004D0; // type:function size:0x28 +createHeap__18dAcOF400GateSeal_cFv = .text:0x00000110; // type:function size:0x11C +actorCreate__18dAcOF400GateSeal_cFv = .text:0x00000230; // type:function size:0x8 +actorPostCreate__18dAcOF400GateSeal_cFv = .text:0x00000240; // type:function size:0x1A4 +actorExecute__18dAcOF400GateSeal_cFv = .text:0x000003F0; // type:function size:0xD8 +draw__18dAcOF400GateSeal_cFv = .text:0x000004D0; // type:function size:0x28 __dt__18dAcOF400GateSeal_cFv = .text:0x00000500; // type:function size:0x84 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -lbl_629_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float +lbl_629_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float g_profile_OBJ_F400_GATE_SEAL = .data:0x00000000; // type:object size:0x10 -lbl_629_data_10 = .data:0x00000010; // type:object size:0x10 -lbl_629_data_20 = .data:0x00000020; // type:object size:0x20 data:string -AcOF400GateSeal__vtable = .data:0x00000040; // type:object size:0x80 +lbl_629_data_10 = .data:0x00000010; // type:object size:0x10 scope:local +lbl_629_data_20 = .data:0x00000020; // type:object size:0x20 scope:local data:string +__vt__18dAcOF400GateSeal_c = .data:0x00000040; // type:object size:0x80 diff --git a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt index 6b8d3406..9070c836 100644 --- a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt @@ -20,7 +20,7 @@ fn_572_1250 = .text:0x00001250; // type:function size:0x16C4 fn_572_2920 = .text:0x00002920; // type:function size:0x1C AcODoor__update = .text:0x00002940; // type:function size:0x808 fn_572_3150 = .text:0x00003150; // type:function size:0x98 -AcODoor__isLocked = .text:0x000031F0; // type:function size:0x158 +isLocked__10dAcOdoor_cFv = .text:0x000031F0; // type:function size:0x158 fn_572_3350 = .text:0x00003350; // type:function size:0x84 fn_572_33E0 = .text:0x000033E0; // type:function size:0xC fn_572_33F0 = .text:0x000033F0; // type:function size:0x78 diff --git a/configure.py b/configure.py index 95f72ab1..483a7759 100644 --- a/configure.py +++ b/configure.py @@ -2047,7 +2047,7 @@ config.libs = [ NonMatching, "d_a_obj_F400_gate_leaf", "REL/d/a/obj/d_a_obj_F400_gate_leaf.cpp" ), Rel( - NonMatching, "d_a_obj_F400_gate_seal", "REL/d/a/obj/d_a_obj_F400_gate_seal.cpp" + Matching, "d_a_obj_F400_gate_seal", "REL/d/a/obj/d_a_obj_F400_gate_seal.cpp" ), Rel(NonMatching, "d_a_obj_farmland", "REL/d/a/obj/d_a_obj_farmland.cpp"), Rel(NonMatching, "d_a_obj_fence", "REL/d/a/obj/d_a_obj_fence.cpp"), diff --git a/include/d/a/obj/d_a_obj_F400_gate_seal.h b/include/d/a/obj/d_a_obj_F400_gate_seal.h index f4f2714e..bcdb4e8e 100644 --- a/include/d/a/obj/d_a_obj_F400_gate_seal.h +++ b/include/d/a/obj/d_a_obj_F400_gate_seal.h @@ -2,13 +2,25 @@ #define D_A_OBJ_F400_GATE_SEAL_H #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_door.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_smdl.h" class dAcOF400GateSeal_c : public dAcObjBase_c { public: dAcOF400GateSeal_c() {} virtual ~dAcOF400GateSeal_c() {} + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual int draw() override; + private: + /* 0x330 */ m3d::smdl_c mMdl; + /* 0x34C */ m3d::anmMatClr_c mAnmClr; + /* 0x378 */ dAcRef_c mDoor; }; #endif diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index fa6c4c35..6681801e 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -8,6 +8,8 @@ public: dAcOdoor_c() {} virtual ~dAcOdoor_c() {} + bool isLocked(); + private: }; diff --git a/src/REL/d/a/obj/d_a_obj_F400_gate_seal.cpp b/src/REL/d/a/obj/d_a_obj_F400_gate_seal.cpp index d6898bde..e0147bd4 100644 --- a/src/REL/d/a/obj/d_a_obj_F400_gate_seal.cpp +++ b/src/REL/d/a/obj/d_a_obj_F400_gate_seal.cpp @@ -1,3 +1,115 @@ #include "d/a/obj/d_a_obj_F400_gate_seal.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_door.h" +#include "f/f_base.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_anmmatclr.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "rvl/MTX/vec.h" + SPECIAL_ACTOR_PROFILE(OBJ_F400_GATE_SEAL, dAcOF400GateSeal_c, fProfile::OBJ_F400_GATE_SEAL, 0x287, 0, 6); + +bool dAcOF400GateSeal_c::createHeap() { + void *data = dAcObjBase_c::getOarcResFile("F400GateSeal"); + if (data == nullptr) { + return false; + } + + nw4r::g3d::ResFile resFile(data); + if (!resFile.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl = resFile.GetResMdl("F400GateSeal"); + if (!mdl.IsValid()) { + return false; + } + + if (!mMdl.create(mdl, &heap_allocator, 0)) { + return false; + } + + nw4r::g3d::ResAnmClr anmClr = resFile.GetResAnmClr("F400GateSeal"); + if (!anmClr.IsValid()) { + return false; + } + + if (!mAnmClr.create(mdl, anmClr, &heap_allocator, 0, 1)) { + return false; + } + + return mMdl.setAnm(mAnmClr); +} + +int dAcOF400GateSeal_c::actorCreate() { + return SUCCEEDED; +} + +int dAcOF400GateSeal_c::actorPostCreate() { + bool notDone = true; + dAcOdoor_c *parent = (dAcOdoor_c *)fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, nullptr); + dAcOdoor_c *door; + + while (notDone && parent != nullptr) { + if (10000.0f < PSVECSquareDistance(position, parent->position)) { + parent = (dAcOdoor_c *)fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, parent); + door = parent; + } else { + notDone = false; + } + } + if (notDone) { + return FAILED; + } + + mDoor.link(door); + CREATE_ALLOCATOR(dAcOF400GateSeal_c); + if (mDoor.get() == nullptr) { + return FAILED; + } + if (mDoor.get()->isLocked()) { + mAnmClr.setFrame(mAnmClr.getFrameStart(0), 0); + } else { + mAnmClr.setFrame(mAnmClr.getFrameMax(0), 0); + } + mMdl.setPriorityDraw(0x1C, 9); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + mVec3_c min, max; + mMdl.getBounds(&min, &max); + boundingBox.Set(min, max); + return SUCCEEDED; +} + +int dAcOF400GateSeal_c::actorExecute() { + if (mDoor.get() == nullptr) { + return SUCCEEDED; + } + + if (mDoor.get()->isLocked()) { + f32 frame = mAnmClr.getFrameStart(0); + mAnmClr.setFrame(frame, 0); + } else { + if (checkObjectProperty(2)) { + f32 frame = mAnmClr.getFrameMax(0); + mAnmClr.setFrame(frame, 0); + } else { + mAnmClr.play(); + } + } + if (mAnmClr.isStop(0)) { + setObjectProperty(0x200); + } else { + clearObjectProperty(0x200); + } + return SUCCEEDED; +} + +int dAcOF400GateSeal_c::draw() { + dAcObjBase_c::drawModelType1(&mMdl); + return SUCCEEDED; +}