d_a_obj_appear_bridge mostly matching (#36)

* d_a_obj_appear_bridge - weak function order issue

* Mark as nonmatching for now

* Name unk IScnObjCallback funcs

---------

Co-authored-by: elijah-thomas774 <elijahthomas774@gmail.com>
This commit is contained in:
robojumper
2024-09-28 02:32:48 +02:00
committed by GitHub
parent 1039b3b239
commit 392145bf3d
12 changed files with 286 additions and 72 deletions
+126
View File
@@ -0,0 +1,126 @@
#include <d/a/d_a_player.h>
#include <d/a/obj/d_a_obj_appear_bridge.h>
#include <toBeSorted/area_utils.h>
SPECIAL_ACTOR_PROFILE(OBJ_APPEAR_BRIDGE, dAcOappearBridge_c, fProfile::OBJ_APPEAR_BRIDGE, 0x01FC, 0, 6);
static mVec3_c positionOffset(-1600.0f, 550.0f, 0.0f);
const f32 dAcOappearBridge_c::sMovementRate = 4.0f;
STATE_DEFINE(dAcOappearBridge_c, Wait);
STATE_DEFINE(dAcOappearBridge_c, Appear);
STATE_DEFINE(dAcOappearBridge_c, Disappear);
bool dAcOappearBridge_c::createHeap() {
mResFile = getOarcResFile("TongueStage");
RoomManager::bindStageResToFile(&mResFile);
nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("TongueStage");
TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x128));
nw4r::g3d::ResAnmTexSrt srt = mResFile.GetResAnmTexSrt("TongueStage");
TRY_CREATE(mSrtAnm.create(mdl, srt, &heap_allocator, nullptr, 1));
nw4r::g3d::ResAnmClr clr = mResFile.GetResAnmClr("TongueStage");
TRY_CREATE(mClrAnm.create(mdl, clr, &heap_allocator, nullptr, 1));
void *dzb = getOarcFile("TongueStage", "dzb/TongueStage.dzb");
void *plc = getOarcFile("TongueStage", "dat/TongueStage.plc");
updateMatrix();
mModel.setLocalMtx(worldMatrix);
TRY_CREATE(mCollision.create(dzb, plc, true, worldMatrix, scale) == nullptr);
mCollision.init();
return true;
}
int dAcOappearBridge_c::create() {
CREATE_ALLOCATOR(dAcOappearBridge_c);
CollisionCheckContext::get()->registerActorBgCollision(mCollision, this);
mAreaIdx = params & 0xFF;
mEventId = (params >> 8) & 0xFF;
mSoundPosition = position + positionOffset;
obj_pos = &mSoundPosition;
mSceneCallback.attach(mModel);
mModel.setAnm(mSrtAnm);
mModel.setAnm(mClrAnm);
field_0x65C = mSrtAnm.getFrameMax(0) - 1.0f;
mStateMgr.changeState(StateID_Wait);
mModel.setPriorityDraw(0x1C, 0x9);
setBoundingBox(mVec3_c(-3000.0f, -200.0f, -600.0f), mVec3_c(50.0f, 800.0f, 600.0f));
return SUCCEEDED;
}
int dAcOappearBridge_c::doDelete() {
return SUCCEEDED;
}
int dAcOappearBridge_c::actorExecute() {
mStateMgr.executeState();
return SUCCEEDED;
}
int dAcOappearBridge_c::draw() {
drawModelType1(&mModel);
return SUCCEEDED;
}
void dAcOappearBridge_c::initializeState_Wait() {
CollisionCheckContext::get()->destroyActorBgCollision(mCollision);
}
void dAcOappearBridge_c::executeState_Wait() {
if (checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) {
mStateMgr.changeState(StateID_Appear);
}
}
// this works but I don't like it
volatile u32 FLAGS_1 = 0x00000001;
u32 FLAGS_2 = 0x00100001;
void dAcOappearBridge_c::finalizeState_Wait() {
if (mEventId != 0xFF) {
u32 f1 = FLAGS_1;
u32 f2 = FLAGS_2;
Event ev = Event(mEventId, roomid, f2 & ~f1, nullptr, nullptr);
mActorEvent.scheduleEvent(ev, 0);
}
}
void dAcOappearBridge_c::initializeState_Appear() {
mSrtAnm.setRate(sMovementRate, 0);
mClrAnm.setRate(sMovementRate, 0);
CollisionCheckContext::get()->registerActorBgCollision(mCollision, this);
playSound(0xAA4);
}
void dAcOappearBridge_c::executeState_Appear() {
mClrAnm.isStop(0); // ?
if (field_0x65C == mSrtAnm.getFrame(0)) {
mSrtAnm.setRate(0.0f, 0);
}
mSrtAnm.play();
mClrAnm.play();
if (!checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) {
mStateMgr.changeState(StateID_Disappear);
}
}
void dAcOappearBridge_c::finalizeState_Appear() {}
void dAcOappearBridge_c::initializeState_Disappear() {
mSrtAnm.setRate(-sMovementRate, 0);
mClrAnm.setRate(-sMovementRate, 0);
}
void dAcOappearBridge_c::executeState_Disappear() {
if (mSrtAnm.getFrame(0) == 0.0f) {
mSrtAnm.setRate(0.0f, 0);
}
mSrtAnm.play();
mClrAnm.play();
if (checkPosInArea(mAreaIdx, roomid, dAcPy_c::LINK->position, nullptr)) {
mStateMgr.changeState(StateID_Appear);
} else {
if (mClrAnm.isStop(0)) {
mStateMgr.changeState(StateID_Wait);
}
}
}
void dAcOappearBridge_c::finalizeState_Disappear() {}