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
+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