d_a_obj_seat_sword OK (#107)

* d_a_obj_seat_sword mostly done

* ninja apply

* symbol cleanup

* correct code pattern, not right regs

* d_a_obj_seat_sword OK

---------

Co-authored-by: robojumper <robojumper@gmail.com>
This commit is contained in:
Elijah Thomas
2024-11-15 12:28:43 -05:00
committed by GitHub
parent 7ead1b24c0
commit f42f9a0e23
11 changed files with 1480 additions and 1000 deletions
@@ -17,3 +17,6 @@ REL/global_destructor_chain.c:
REL/d/a/obj/d_a_obj_seat_sword.cpp:
.text start:0x000000F0 end:0x000015E8
.ctors start:0x00000000 end:0x00000004
.rodata start:0x00000000 end:0x0000007C
.data start:0x00000000 end:0x0000025C
.bss start:0x00000008 end:0x00000088
@@ -8,26 +8,26 @@ __dt__28sFState_c<15dAcOSeatSword_c>Fv = .text:0x000001F0; // type:function size
__dt__31sFStateFct_c<15dAcOSeatSword_c>Fv = .text:0x00000250; // type:function size:0x6C
__dt__84sStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002C0; // type:function size:0xA0
__dt__54sFStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000360; // type:function size:0xA4
AcOSeatSword__initModels = .text:0x00000410; // type:function size:0x25C
AcOSeatSword__init = .text:0x00000670; // type:function size:0x1B0
createHeap__15dAcOSeatSword_cFv = .text:0x00000410; // type:function size:0x25C
create__15dAcOSeatSword_cFv = .text:0x00000670; // type:function size:0x1B0
changeState__84sStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000820; // type:function size:0x10
fn_499_830 = .text:0x00000830; // type:function size:0x8
AcOSeatSword__update = .text:0x00000840; // type:function size:0x9C
doDelete__15dAcOSeatSword_cFv = .text:0x00000830; // type:function size:0x8
actorExecute__15dAcOSeatSword_cFv = .text:0x00000840; // type:function size:0x9C
executeState__84sStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000008E0; // type:function size:0x10
getStateID__84sStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x000008F0; // type:function size:0x10
AcOSeatSword__updateInEvents = .text:0x00000900; // type:function size:0x110
AcOSeatSword__performInteraction = .text:0x00000A10; // type:function size:0x84
fn_499_AA0 = .text:0x00000AA0; // type:function size:0x164
fn_499_C10 = .text:0x00000C10; // type:function size:0x98
actorExecuteInEvent__15dAcOSeatSword_cFv = .text:0x00000900; // type:function size:0x110
doInteraction__15dAcOSeatSword_cFl = .text:0x00000A10; // type:function size:0x84
registerInEvent__15dAcOSeatSword_cFv = .text:0x00000AA0; // type:function size:0x164
draw__15dAcOSeatSword_cFv = .text:0x00000C10; // type:function size:0x98
initializeState_Wait__15dAcOSeatSword_cFv = .text:0x00000CB0; // type:function size:0x4
executeState_Wait__15dAcOSeatSword_cFv = .text:0x00000CC0; // type:function size:0x88
finalizeState_Wait__15dAcOSeatSword_cFv = .text:0x00000D50; // type:function size:0x4
initializeState_Get__15dAcOSeatSword_cFv = .text:0x00000D60; // type:function size:0xC
executeState_Get__15dAcOSeatSword_cFv = .text:0x00000D70; // type:function size:0x4
finalizeState_Get__15dAcOSeatSword_cFv = .text:0x00000D80; // type:function size:0x4
AcOSeatSword__commonUpdate = .text:0x00000D90; // type:function size:0xE8
fn_499_E80 = .text:0x00000E80; // type:function size:0x104
AcOSeatSword__checkShouldHaveSword = .text:0x00000F90; // type:function size:0xC4
actorExecuteCommon__15dAcOSeatSword_cFv = .text:0x00000D90; // type:function size:0xE8
updateSwordMdl__15dAcOSeatSword_cFv = .text:0x00000E80; // type:function size:0x104
checkPlayerHasSword__15dAcOSeatSword_cFv = .text:0x00000F90; // type:function size:0xC4
__dt__15dAcOSeatSword_cFv = .text:0x00001060; // type:function size:0x114
build__31sFStateFct_c<15dAcOSeatSword_c>FRC12sStateIDIf_c = .text:0x00001180; // type:function size:0x60
dispose__31sFStateFct_c<15dAcOSeatSword_c>FRP10sStateIf_c = .text:0x000011E0; // type:function size:0xC
@@ -49,29 +49,31 @@ isSameName__30sFStateID_c<15dAcOSeatSword_c>CFPCc = .text:0x00001560; // type:fu
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
__destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global
lbl_499_rodata_0 = .rodata:0x00000000; // type:object size:0x10 data:float
lbl_499_rodata_10 = .rodata:0x00000010; // type:object size:0x30
lbl_499_rodata_40 = .rodata:0x00000040; // type:object size:0x10 data:float
lbl_499_rodata_50 = .rodata:0x00000050; // type:object size:0x18 data:float
lbl_499_rodata_68 = .rodata:0x00000068; // type:object size:0x4 data:float
lbl_499_rodata_6C = .rodata:0x0000006C; // type:object size:0x8 data:float
lbl_499_rodata_74 = .rodata:0x00000074; // type:object size:0x4 data:float
lbl_499_rodata_78 = .rodata:0x00000078; // type:object size:0x4 data:float
sEventName = .rodata:0x00000000; // type:object size:0xE scope:local data:string
sInteractionDef__15dAcOSeatSword_c = .rodata:0x00000010; // type:object size:0x30
sEffectPos__15dAcOSeatSword_c = .rodata:0x00000040; // type:object size:0xC data:float
l_inGroundRot = .rodata:0x0000004C; // type:object size:0x2 data:2byte
lbl_499_rodata_50 = .rodata:0x00000050; // type:object size:0x18 scope:local data:float
lbl_499_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local data:float
lbl_499_rodata_6C = .rodata:0x0000006C; // type:object size:0x8 scope:local data:float
lbl_499_rodata_74 = .rodata:0x00000074; // type:object size:0x4 scope:local data:float
lbl_499_rodata_78 = .rodata:0x00000078; // type:object size:0x4 scope:local data:float
g_profile_OBJ_SEAT_SWORD = .data:0x00000000; // type:object size:0x10 data:4byte
lbl_499_data_10 = .data:0x00000010; // type:object size:0x30
lbl_499_data_40 = .data:0x00000040; // type:object size:0xC
lbl_499_data_4C = .data:0x0000004C; // type:object size:0xC
lbl_499_data_58 = .data:0x00000058; // type:object size:0x8
lbl_499_data_60 = .data:0x00000060; // type:object size:0xC
lbl_499_data_6C = .data:0x0000006C; // type:object size:0x20
lbl_499_data_8C = .data:0x0000008C; // type:object size:0x4 data:4byte
lbl_499_data_90 = .data:0x00000090; // type:object size:0x80
lbl_499_data_110 = .data:0x00000110; // type:object size:0x30
lbl_499_data_140 = .data:0x00000140; // type:object size:0x30
lbl_499_data_170 = .data:0x00000170; // type:object size:0x18
lbl_499_data_188 = .data:0x00000188; // type:object size:0xA0
lbl_499_data_228 = .data:0x00000228; // type:object size:0x34
sCylSrc__15dAcOSeatSword_c = .data:0x00000010; // type:object size:0x30
lbl_499_data_40 = .data:0x00000040; // type:object size:0xC scope:local
lbl_499_data_4C = .data:0x0000004C; // type:object size:0xC scope:local
SwordSeatNames = .data:0x00000058; // type:object size:0x8
lbl_499_data_60 = .data:0x00000060; // type:object size:0xC scope:local
lbl_499_data_6C = .data:0x0000006C; // type:object size:0x20 scope:local
lbl_499_data_8C = .data:0x0000008C; // type:object size:0x4 scope:local data:4byte
__vt__15dAcOSeatSword_c = .data:0x00000090; // type:object size:0x80
__vt__54sFStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c> = .data:0x00000110; // type:object size:0x30
__vt__84sStateMgr_c<15dAcOSeatSword_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000140; // type:object size:0x30
__vt__31sFStateFct_c<15dAcOSeatSword_c> = .data:0x00000170; // type:object size:0x14
__vt__28sFState_c<15dAcOSeatSword_c> = .data:0x00000188; // type:object size:0x18
__vt__30sFStateID_c<15dAcOSeatSword_c> = .data:0x00000228; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_499_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
lbl_499_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte
lbl_499_bss_58 = .bss:0x00000058; // type:object size:0x30 data:4byte
lbl_499_bss_8 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte
StateID_Wait__15dAcOSeatSword_c = .bss:0x00000018; // type:object size:0x30 data:4byte
lbl_499_bss_48 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte
StateID_Get__15dAcOSeatSword_c = .bss:0x00000058; // type:object size:0x30 data:4byte
+1115 -953
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1532,7 +1532,7 @@ config.libs = [
Rel(NonMatching, "d_a_obj_save", "REL/d/a/obj/d_a_obj_save.cpp"),
Rel(NonMatching, "d_a_obj_scattersand", "REL/d/a/obj/d_a_obj_scattersand.cpp"),
Rel(NonMatching, "d_a_obj_sealed_door", "REL/d/a/obj/d_a_obj_sealed_door.cpp"),
Rel(NonMatching, "d_a_obj_seat_sword", "REL/d/a/obj/d_a_obj_seat_sword.cpp"),
Rel(Matching, "d_a_obj_seat_sword", "REL/d/a/obj/d_a_obj_seat_sword.cpp"),
Rel(NonMatching, "d_a_obj_sea_F301", "REL/d/a/obj/d_a_obj_sea_F301.cpp"),
Rel(NonMatching, "d_a_obj_shed", "REL/d/a/obj/d_a_obj_shed.cpp"),
Rel(NonMatching, "d_a_obj_ship_window", "REL/d/a/obj/d_a_obj_ship_window.cpp"),
+12 -2
View File
@@ -1,6 +1,11 @@
#include "common.h"
#include "d/a/d_a_base.h"
#include "d/a/obj/d_a_obj_base.h"
#include "m/m_allocator.h"
#include "m/m_angle.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/g3d_resfile.h"
class dAcPy_c : public dAcObjBase_c {
// See Below for some info
@@ -57,7 +62,7 @@ public:
/* vt 0x08C */ virtual void set0x43DE();
/* vt 0x090 */ virtual f32 vt_0x090();
/* vt 0x094 */ virtual void relatedToUsingItem0x11();
/* vt 0x098 */ virtual void setPosRot();
/* vt 0x098 */ virtual void setPosRot(const mVec3_c &pos, const mAng3_c &ang, UNKWORD, UNKWORD, UNKWORD);
/* vt 0x09C */ virtual void isLiftingObject();
/* vt 0x0A0 */ virtual void isThrowingOrRollingItem();
/* vt 0x0A4 */ virtual void canThrowObject();
@@ -118,7 +123,7 @@ public:
/* vt 0x180 */ virtual void setWindMillPos();
/* vt 0x184 */ virtual void isOffeset0x435eEqual0x20();
/* vt 0x188 */ virtual void getVec3F_Z();
/* vt 0x18C */ virtual void somethingWithMainBodyModel();
/* vt 0x18C */ virtual void getBodyMtx(mMtx_c *out_mtx, int boneIdx);
/* vt 0x190 */ virtual void getSheathModelMatrix();
/* vt 0x194 */ virtual void getSwordModelMatrix();
/* vt 0x198 */ virtual void vt_0x198();
@@ -229,6 +234,8 @@ public:
/* 0x364 */ u32 mActionFlags;
/* 0x368 */ u32 mActionFlagsCont;
/* 0x36C */ int mCurrentAction; // TODO (Document Enum)
/* 0x370 */ u8 _370[0x3C8 - 0x370];
/* 0x3C8 */ nw4r::g3d::ResFile mSwordRes;
inline bool checkFlags0x340(u32 mask) const {
return (someFlags_0x340 & mask) != 0;
@@ -253,8 +260,11 @@ public:
return (mActionFlagsCont & mask) != 0;
}
static nw4r::g3d::ResFile getItemResFile(const char *name, mAllocator_c &allocator);
static const dAcPy_c *GetLink() {
return LINK;
}
static dAcPy_c *LINK;
};
+52 -2
View File
@@ -1,20 +1,70 @@
#ifndef D_A_OBJ_SEAT_SWORD_H
#define D_A_OBJ_SEAT_SWORD_H
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_w.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_d.h"
#include "d/flag/storyflag_manager.h"
#include "m/m3d/m_smdl.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/g3d_resfile.h"
#include "nw4r/math/math_types.h"
#include "rvl/MTX/mtx.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
#include "toBeSorted/actor_event.h"
#include "toBeSorted/attention.h"
#include "toBeSorted/effects_struct.h"
class dAcOSeatSword_c : public dAcObjBase_c {
public:
dAcOSeatSword_c() : mStateMgr(*this, sStateID::null) {}
dAcOSeatSword_c() : mEvent(*this, nullptr), mStateMgr(*this, sStateID::null) {}
virtual ~dAcOSeatSword_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int draw() override;
virtual bool createHeap() override;
virtual int actorExecute() override;
virtual int actorExecuteInEvent() override;
virtual void registerInEvent() override;
virtual void doInteraction(s32) override;
STATE_FUNC_DECLARE(dAcOSeatSword_c, Wait);
STATE_FUNC_DECLARE(dAcOSeatSword_c, Get);
void actorExecuteCommon();
void updateSwordMdl();
bool checkPlayerHasSword();
u8 getSubtype() const {
return params & 0x3;
}
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcOSeatSword_c);
/* 0x330 */ ActorEventRelated mEvent;
/* 0x380 */ nw4r::g3d::ResFile mRes;
/* 0x384 */ m3d::smdl_c mSwordMdl;
/* 0x3A0 */ m3d::smdl_c mPedestalMdl;
/* 0x3BC */ m3d::smdl_c mPedestalMdl_s;
/* 0x3D8 */ dBgW mBgW;
/* 0x5E8 */ dCcD_Cyl mCyl;
/* 0x738 */ STATE_MGR_DECLARE(dAcOSeatSword_c);
/* 0x774 */ EffectsStruct mEff;
/* 0x7A8 */ mMtx_c mSwordMtx;
/* 0x7D8 */ mVec3_c mEffPos;
/* 0x7E4 */ f32 mField_0x7E4;
/* 0x7E8 */ mAng mField_0x7E8;
/* 0x7EA */ u8 mField_0x7EA;
/* 0x7EB */ u8 mSubtype;
/* 0x7EC */ bool mbNoSword;
static dCcD_SrcCyl sCylSrc;
static const InteractionTargetDef sInteractionDef;
static const Vec sEffectPos;
};
#endif
+4
View File
@@ -30,6 +30,10 @@ public:
return FileManager::sInstance->getStoryFlagsConst();
};
u16 getFlag(u16 flag) const {
return getCounterOrFlag(flag);
}
public:
static StoryflagManager *sInstance;
static u16 sFlags[0x80];
+5 -2
View File
@@ -23,8 +23,11 @@ public:
}
void remove(bool);
void fn_80029929(u16 effect, mVec3_c *pos, void *, void *, void *, void *);
void fn_80029A10(u16 effect, mVec3_c *pos, mAng3_c *rot, void *, void *, void *);
void fn_80027320(u8);
void fn_80029920(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *);
void fn_80029980(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *);
void fn_800299F0(u16 effect, mMtx_c *mtx, void *, void *);
void fn_80029A10(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *);
void setMtx(const mMtx_c &);
bool checkField0x00() const {
+249 -2
View File
@@ -1,13 +1,260 @@
#include "d/a/obj/d_a_obj_seat_sword.h"
#include "common.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_s.h"
#include "d/col/bg/d_bg_w.h"
#include "d/col/cc/d_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "f/f_base.h"
#include "m/m_angle.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/g3d_resfile.h"
#include "rvl/MTX/mtx.h"
#include "s/s_Math.h"
#include "toBeSorted/attention.h"
#include "toBeSorted/event.h"
#include "toBeSorted/event_manager.h"
SPECIAL_ACTOR_PROFILE(OBJ_SEAT_SWORD, dAcOSeatSword_c, fProfile::OBJ_SEAT_SWORD, 0x249, 0, 3);
STATE_DEFINE(dAcOSeatSword_c, Wait);
STATE_DEFINE(dAcOSeatSword_c, Get);
dCcD_SrcCyl dAcOSeatSword_c::sCylSrc = {
/* mObjInf */
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */ {0, 0x311, {0, 0x407}, 0x0, 0x0},
/* mObjCo */ {0xE9}},
/* mCylInf */
{20.f, 100.f}
};
const char sEventName[] = "PickSwordSeat";
char *SwordSeatNames[] = {"SwordSeal", "SwordGrd"};
const InteractionTargetDef dAcOSeatSword_c::sInteractionDef = {
0, 2, 1, EXAMINE_TALK, 0, 200.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f,
};
const Vec dAcOSeatSword_c::sEffectPos = {-20.f, 260.f, 30.f};
extern "C" const char *getSwordName(int);
extern "C" u8 EQUIPPED_SWORD;
bool dAcOSeatSword_c::createHeap() {
if (mSubtype == 0) {
const char *goddess_sword = getSwordName(1);
mRes = dAcPy_c::getItemResFile(goddess_sword, heap_allocator);
TRY_CREATE(mSwordMdl.create(mRes.GetResMdl(goddess_sword), &heap_allocator, 0x120, 1, nullptr));
} else if (mSubtype == 1) {
mRes = dAcPy_c::LINK->mSwordRes;
const char *sword_name = getSwordName(EQUIPPED_SWORD);
TRY_CREATE(mSwordMdl.create(mRes.GetResMdl(sword_name), &heap_allocator, 0x120, 1, nullptr));
}
nw4r::g3d::ResFile mPedRes = getOarcResFile(SwordSeatNames[mSubtype]);
TRY_CREATE(mPedestalMdl.create(mPedRes.GetResMdl(SwordSeatNames[mSubtype]), &heap_allocator, 0x120, 1, nullptr));
void *dzb = getOarcDZB(SwordSeatNames[mSubtype], SwordSeatNames[mSubtype]);
void *plc = getOarcPLC(SwordSeatNames[mSubtype], SwordSeatNames[mSubtype]);
updateMatrix();
mSwordMtx.copyFrom(mWorldMtx);
TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale));
if (mSubtype == 1) {
TRY_CREATE(mPedestalMdl_s.create(mPedRes.GetResMdl("SwordGrd_s"), &heap_allocator, 0x120, 1, nullptr));
}
return true;
}
const s16 l_inGroundRot = {0x71C};
int dAcOSeatSword_c::create() {
mSubtype = getSubtype();
if (mSubtype >= 2) {
mSubtype = 0;
}
CREATE_ALLOCATOR(dAcOSeatSword_c);
mStts.SetRank(0xD);
mCyl.Set(sCylSrc);
mCyl.SetStts(mStts);
dBgS::GetInstance()->Regist(&mBgW, this);
mPedestalMdl.setLocalMtx(mWorldMtx);
if (mSubtype == 1) {
mPedestalMdl_s.setLocalMtx(mWorldMtx);
mPedestalMdl_s.setPriorityDraw(0x22, 0x9);
}
forwardAccel = 0.f;
forwardMaxSpeed = -40.f;
if (mSubtype == 1) {
mField_0x7E8 = l_inGroundRot;
}
updateSwordMdl();
mEff.init(this);
mPedestalMdl.setPriorityDraw(0x1C, 0x9);
if (checkPlayerHasSword()) {
mStateMgr.changeState(StateID_Get);
} else {
mStateMgr.changeState(StateID_Wait);
}
boundingBox.Set(mVec3_c(-75.f, -10.f, -75.f), mVec3_c(75.f, 200.f, 75.f));
return SUCCEEDED;
}
int dAcOSeatSword_c::doDelete() {
return SUCCEEDED;
}
int dAcOSeatSword_c::actorExecute() {
mStateMgr.executeState();
if (mStateMgr.isState(StateID_Wait)) {
actorExecuteCommon();
mCyl.SetC(position);
dCcS::GetInstance()->Set(&mCyl);
}
return SUCCEEDED;
}
int dAcOSeatSword_c::actorExecuteInEvent() {
if (mbNoSword) {
sLib::chase(&mField_0x7E4, 255.f, 8.f);
}
actorExecuteCommon();
if (mEvent.isThisActorInEvent()) {
switch (mEvent.getCurrentEventCommand()) {
case 'act0': {
mEvent.advanceNext();
} break;
case 'act1': {
dAcPy_c::LINK->getBodyMtx(&mSwordMtx, 0xF /* weaponR*/);
mSwordMdl.setLocalMtx(mSwordMtx);
mEvent.advanceNext();
} break;
case 'act2': {
mbNoSword = true;
dAcPy_c::LINK->getBodyMtx(&mSwordMtx, 0xF /* weaponR*/);
mSwordMdl.setLocalMtx(mSwordMtx);
mEvent.advanceNext();
}
}
}
return SUCCEEDED;
}
void dAcOSeatSword_c::doInteraction(s32 param0) {
if (param0 == 5) {
mField_0x7EA = true;
Event evt((char *)sEventName, 0x190, 0x100001, nullptr, nullptr);
mEvent.scheduleEvent(evt, 0);
} else {
mField_0x7EA = false;
}
}
u32 someAng = 0x8000;
void dAcOSeatSword_c::registerInEvent() {
static const u32 rodata_stuff = {0};
if (mField_0x7EA == 1 && EventManager::isCurrentEvent(sEventName)) {
dAcPy_c *player = dAcPy_c::LINK;
mVec3_c vec = mVec3_c::Ez * 78.f;
mAng3_c ang = rotation;
ang.y += someAng;
vec.rotY(rotation.y);
vec += position;
player->setPosRot(vec, ang, 0, 1, 0);
mField_0x7E8 = 0;
updateSwordMdl();
}
}
int dAcOSeatSword_c::draw() {
if (!mStateMgr.isState(StateID_Get)) {
drawModelType1(&mSwordMdl);
}
drawModelType1(&mPedestalMdl);
if (mSubtype == 1) {
drawModelType1(&mPedestalMdl_s);
}
return SUCCEEDED;
}
void dAcOSeatSword_c::initializeState_Wait() {}
void dAcOSeatSword_c::executeState_Wait() {}
void dAcOSeatSword_c::executeState_Wait() {
AttentionManager::sInstance->addTarget(*this, sInteractionDef, 0, nullptr);
if (checkPlayerHasSword()) {
mbNoSword = true;
}
if (mbNoSword) {
mStateMgr.changeState(StateID_Get);
}
}
void dAcOSeatSword_c::finalizeState_Wait() {}
void dAcOSeatSword_c::initializeState_Get() {}
// Get state to remove any interaction/effect
void dAcOSeatSword_c::initializeState_Get() {
mEff.remove(true);
}
void dAcOSeatSword_c::executeState_Get() {}
void dAcOSeatSword_c::finalizeState_Get() {}
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_76_;
void dAcOSeatSword_c::actorExecuteCommon() {
if (checkPlayerHasSword()) {
return;
}
// ??????? this func
const dAcPy_c *player = dAcPy_c::LINK;
mEffPos.x = sEffectPos.x;
mEffPos.y = sEffectPos.y;
mEffPos.z = sEffectPos.z;
mEffPos.rotY(player->rotation.y);
mEffPos += player->position;
mEffPos.y = position.y;
mEff.fn_80029A10(PARTICLE_RESOURCE_ID_MAPPING_76_, &mEffPos, &rotation, &mScale, nullptr, nullptr);
mEff.fn_80027320(mField_0x7E4);
}
void dAcOSeatSword_c::updateSwordMdl() {
updateMatrix();
mSwordMtx.copyFrom(mWorldMtx);
if (mSubtype == 1) {
mSwordMtx.XrotM(mField_0x7E8);
}
mMtx_c mtx;
// Weird value for y, but ok
mtx.transS(0.f, 87.51f, 0.f);
mSwordMtx += mtx;
mSwordMtx.YrotM(0x4000);
mSwordMtx.ZrotM(0xC000);
mSwordMdl.setLocalMtx(mSwordMtx);
}
bool dAcOSeatSword_c::checkPlayerHasSword() {
// the GetFlag needs to be an inline ... (using getCounterOrFlag doesnt work)
return (mSubtype == 0 && StoryflagManager::sInstance->getFlag(0x3)) ||
(mSubtype == 1 && !StoryflagManager::sInstance->getFlag(0xA7));
}
+1 -2
View File
@@ -594,11 +594,10 @@ void dAcOTowerHandD101_c::executeState_RemainOpen() {
void dAcOTowerHandD101_c::finalizeState_RemainOpen() {}
extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_573;
// extern "C" void fn_80029929()
void dAcOTowerHandD101_c::initializeState_Close() {
mMdl.getAnm().setPlayState(m3d::PLAY_MODE_1);
mMdl.setRate(getCloseRate());
mEffects.fn_80029929(PARTICLE_RESOURCE_ID_MAPPING_573, &position, nullptr, nullptr, nullptr, nullptr);
mEffects.fn_80029920(PARTICLE_RESOURCE_ID_MAPPING_573, &position, nullptr, nullptr, nullptr, nullptr);
playSound(0xC0C);
}
void dAcOTowerHandD101_c::executeState_Close() {
+1 -1
View File
@@ -16,7 +16,7 @@
#include "toBeSorted/attention.h"
extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32);
extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_394_;
extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_394_;
void dAcOInsect_c::kill() {
// Small Ordering issue between loading particle id and position