mirror of
https://github.com/zeldaret/ss
synced 2026-07-29 15:42:51 -04:00
d_linkage is largely done (#176)
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
#include "d/a/obj/d_a_obj_arrow.h"
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "nw4r/types_nw4r.h"
|
||||
|
||||
@@ -38,7 +37,7 @@ const dCcD_SrcSph dAcArrow_c::sCc2 = {
|
||||
|
||||
// clang-format on
|
||||
|
||||
bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
bool dAcArrow_atHitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
static_cast<dAcArrow_c *>(i_actorA)->hitCallback(i_objInfA, i_actorB, i_objInfB);
|
||||
return true;
|
||||
}
|
||||
@@ -70,7 +69,7 @@ int dAcArrow_c::create() {
|
||||
mCcCps.Set(sCc1);
|
||||
mCcCps.SetStts(mStts);
|
||||
mCcCps.SetAtFlag(0x2000);
|
||||
mCcCps.SetAtCallback(::hitCallback);
|
||||
mCcCps.SetAtCallback(dAcArrow_atHitCallback);
|
||||
mCcSph.Set(sCc2);
|
||||
mCcSph.SetStts(mStts);
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
#include "d/a/obj/d_a_obj_boomerang.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m3d/m_fanm.h"
|
||||
#include "nw4r/g3d/g3d_anmchr.h"
|
||||
#include "nw4r/g3d/res/g3d_resmdl.h"
|
||||
#include "s/s_State.hpp"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(BOOMERANG, dAcBoomerang_c, fProfile::BOOMERANG, 0x125, 0, 0x4);
|
||||
|
||||
STATE_DEFINE(dAcBoomerang_c, Wait);
|
||||
STATE_DEFINE(dAcBoomerang_c, Move);
|
||||
STATE_DEFINE(dAcBoomerang_c, MoveCancelWait);
|
||||
STATE_DEFINE(dAcBoomerang_c, ReturnWait);
|
||||
STATE_DEFINE(dAcBoomerang_c, EventReturnWait);
|
||||
|
||||
const dAcBoomerang_c::ChrAnimation_t dAcBoomerang_c::sChrAnims[dAcBoomerang_c::RB_MAX] = {
|
||||
{ "RB_Set", 0.f},
|
||||
{"RB_Default", 3.f},
|
||||
{ "RB_Cut", 3.f},
|
||||
{ "RB_Hold", 3.f},
|
||||
{"RB_Hold_ed", 3.f},
|
||||
{ "RB_Back", 3.f},
|
||||
};
|
||||
|
||||
void areaCallback(dAcObjBase_c *param0, mVec3_c *param1, u32 param2) {
|
||||
if (param2 != 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
|
||||
if (i_actorB != nullptr && GetLinkage().checkFlag(0x80)) {
|
||||
if (dAcPy_c::getCurrentBeetleType() > 2) {
|
||||
if (i_actorB == mGrabbedActor.get()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mStateMgr.isState(StateID_Move)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tryGrabObject(i_actorB)) {
|
||||
setChrAnimation(RB_HOLD);
|
||||
mAnmChr[0].setRate(0.f);
|
||||
mAnmChr[0].setFrameOnly(i_actorB->GetLinkage().field_0x24);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool dAcBoomerang_atHitCallback(
|
||||
dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB
|
||||
) {
|
||||
static_cast<dAcBoomerang_c *>(i_actorA)->atHitCallback(i_objInfA, i_actorB, i_objInfB);
|
||||
return true;
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
bool dAcBoomerang_c::tryGrabObject(dAcObjBase_c *pObj) {
|
||||
dAcPy_c *player = dAcPy_c::GetLink2();
|
||||
if (checkField_0x8CC(0x1000) && GetLinkage().checkFlag(0x80)) {}
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
void dAcBoomerang_c::setChrAnimation(dAcBoomerang_c::ChrAnimation_e requestedAnimation) {
|
||||
// Do not set anim if there is no change, or the request is to cut from hold
|
||||
if (requestedAnimation == mCurrentAnimation || (mCurrentAnimation == RB_HOLD && requestedAnimation == RB_CUT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
mAnmChr[0].setAnm(mMdl, mResFile.GetResAnmChr(sChrAnims[requestedAnimation].mName), m3d::PLAY_MODE_4);
|
||||
nw4r::g3d::AnmObjChr *pAnmObj = static_cast<nw4r::g3d::AnmObjChr *>(mAnmChr[0].getAnimObj());
|
||||
|
||||
pAnmObj->Release();
|
||||
|
||||
nw4r::g3d::ResMdl mdl = mMdl.getResMdl();
|
||||
for (int i = 0; i < mWindNodeID; ++i) {
|
||||
pAnmObj->Bind(mdl, i, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
}
|
||||
|
||||
if (requestedAnimation == RB_SET) {
|
||||
pAnmObj->Bind(mdl, mLeftWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
pAnmObj->Bind(mdl, mRightWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE);
|
||||
}
|
||||
|
||||
mCurrentAnimation = requestedAnimation;
|
||||
|
||||
mMdl.setAnm(mAnmChrBlend, sChrAnims[requestedAnimation].mRate);
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/col/bg/d_bg_s.h"
|
||||
#include "d/col/bg/d_bg_w.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "s/s_Math.h"
|
||||
@@ -42,26 +43,29 @@ void dAcOsw_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *in
|
||||
dAcPy_c *link = interactor->isActorPlayer() ? static_cast<dAcPy_c *>(interactor) : nullptr;
|
||||
dAcOsw_c *sw = static_cast<dAcOsw_c *>(actor);
|
||||
|
||||
// halp
|
||||
if (!(link == nullptr || (!link->checkActionFlags(dAcPy_c::FLG0_IN_WATER) &&
|
||||
((!link->checkFlags0x340(0x800000) ||
|
||||
((link->getCurrentCarriedActor() != nullptr &&
|
||||
link->getCurrentCarriedActor()->mActorCarryInfo.testCarryFlag(0x04)))))))) {
|
||||
if (link != nullptr) {
|
||||
if (link->checkActionFlags(dAcPy_c::FLG0_IN_WATER)) {
|
||||
return;
|
||||
}
|
||||
if (link->checkFlags0x340(0x800000) &&
|
||||
!(link->getCurrentCarriedActor() && link->getCurrentCarriedActor()->GetLinkage().checkFlag(0x04))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (interactor->GetLinkage().checkState(dLinkage_c::STATE_ACTIVE)) {
|
||||
return;
|
||||
}
|
||||
if (interactor->mActorCarryInfo.isCarried != 1) {
|
||||
if (link == nullptr || (link->checkActionFlags(0xC70852)) == 0) {
|
||||
if (!sw->someInteractCheck(link != nullptr)) {
|
||||
bool needsOnFlag = sw->mOnSceneFlag < 0xFF &&
|
||||
!SceneflagManager::sInstance->checkBoolFlag(sw->roomid, sw->mOnSceneFlag);
|
||||
if (!needsOnFlag && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 &&
|
||||
sw->mStateMgr.isState(StateID_On)) {
|
||||
link->onFlags_0x360(0x8000);
|
||||
}
|
||||
|
||||
if (!(link && link->checkActionFlags(0xC70852))) {
|
||||
if (!sw->someInteractCheck(link != nullptr)) {
|
||||
if (!sw->checkOnFlag() && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 &&
|
||||
sw->mStateMgr.isState(StateID_On)) {
|
||||
link->onFlags_0x360(0x8000);
|
||||
}
|
||||
}
|
||||
interactor->setObjectProperty(0x40);
|
||||
}
|
||||
interactor->setObjectProperty(0x40);
|
||||
}
|
||||
|
||||
bool dAcOsw_c::createHeap() {
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "m/m_mtx.h"
|
||||
|
||||
ActorCarryStruct::ActorCarryStruct()
|
||||
: actorLink(nullptr), carriedActor(nullptr), carryFlags(0), carryType(0), field_0x18(0),
|
||||
field_0x1C(0.0f, 0.0f, 0.0f), carryTransMtx(mMtx_c::Identity), field_0x58(mMtx_c::Identity), isCarried(0),
|
||||
field_0x8C(0.0f), field_0x90(0.0f), field_0x94(0.0f), field_0x98(0.0f) {}
|
||||
|
||||
ActorCarryStruct::~ActorCarryStruct() {
|
||||
fn_80051190(nullptr);
|
||||
fn_80050EB0(nullptr);
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
#include "d/d_linkage.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_s_acch.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "rvl/MTX/mtx.h"
|
||||
|
||||
dLinkage_c::dLinkage_c()
|
||||
: mControllingActor(nullptr),
|
||||
pLinkedActor(nullptr),
|
||||
carryFlags(0),
|
||||
mType(CONNECTION_0),
|
||||
field_0x18(0),
|
||||
field_0x1C(0.0f),
|
||||
field_0x20(0.f),
|
||||
field_0x24(0.f),
|
||||
carryTransMtx(mMtx_c::Identity),
|
||||
field_0x58(mMtx_c::Identity),
|
||||
mState(STATE_0),
|
||||
field_0x8C(0.0f),
|
||||
field_0x90(0.0f),
|
||||
field_0x94(0.0f),
|
||||
field_0x98(0.0f) {}
|
||||
|
||||
dLinkage_c::~dLinkage_c() {
|
||||
fn_80051190(nullptr);
|
||||
fn_80050EB0(nullptr);
|
||||
}
|
||||
|
||||
// Ignore the parameter names. I am unsure what they are
|
||||
void dLinkage_c::set(u32 flags, f32 x, f32 y, f32 z, void *) {
|
||||
onFlag(0x8000000 | flags);
|
||||
field_0x1C = x;
|
||||
field_0x20 = y;
|
||||
field_0x24 = z;
|
||||
|
||||
if (flags & 2) {
|
||||
field_0x8C = 28.f;
|
||||
field_0x90 = 36.f;
|
||||
field_0x94 = 28.f;
|
||||
field_0x98 = 0.f;
|
||||
} else if (flags & 4) {
|
||||
field_0x8C = 18.f;
|
||||
field_0x90 = 25.f;
|
||||
field_0x94 = 18.f;
|
||||
field_0x98 = 0.f;
|
||||
} else if (flags & 8) {
|
||||
field_0x8C = 16.7f;
|
||||
field_0x90 = 25.f;
|
||||
field_0x94 = 16.7f;
|
||||
field_0x98 = 0.f;
|
||||
} else {
|
||||
field_0x8C = 18.f;
|
||||
field_0x90 = 30.f;
|
||||
field_0x94 = 18.f;
|
||||
field_0x98 = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
bool dLinkage_c::tryAttach(
|
||||
dAcObjBase_c *pActor, dAcObjBase_c *pSrc, dAcRefBase_c *pRef, dLinkage_c::ConnectionType_e type, bool replace
|
||||
) {
|
||||
if (checkState(STATE_ACTIVE)) {
|
||||
if (replace) {
|
||||
fn_80050EB0(pActor);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
pActor->clearObjectProperty(0x1000);
|
||||
pActor->clearObjectProperty(0x4);
|
||||
mControllingActor.link(pSrc);
|
||||
mState = STATE_ACTIVE;
|
||||
mType = type;
|
||||
|
||||
if (type == CONNECTION_4) {
|
||||
pActor->setObjectProperty(0x4);
|
||||
} else if (type == CONNECTION_7) {
|
||||
pActor->setObjectProperty(0x1000);
|
||||
field_0x1A = 4;
|
||||
}
|
||||
MTXIdentity(carryTransMtx);
|
||||
pLinkedActor = pRef;
|
||||
pRef->link(pActor);
|
||||
if ((pSrc == dAcPy_c::GetLink2() || type == CONNECTION_5) &&
|
||||
pActor->getConnectParent()->profile_name == fProfile::ROOM) {
|
||||
pActor->addActorToRoom(-1);
|
||||
onFlag(0x20000000);
|
||||
pActor->setActorProperty(0x2000000);
|
||||
pActor->changeLoadedEntitiesWithSet();
|
||||
}
|
||||
pActor->clearActorProperty(0x1);
|
||||
return true;
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050DC0(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
mState = STATE_2;
|
||||
fn_80050E40(pActor, speed, velocityY, rot);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050E00(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
mState = STATE_3;
|
||||
fn_80050E40(pActor, speed, velocityY, rot);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050E40(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) {
|
||||
fn_80050EB0(pActor);
|
||||
pActor->forwardSpeed = speed;
|
||||
pActor->velocity.y = velocityY;
|
||||
pActor->angle.y = rot;
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050EA0(dAcObjBase_c *pActor) {
|
||||
mState = STATE_DELETE;
|
||||
fn_80050EB0(pActor);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80050EB0(dAcObjBase_c *pActor) {
|
||||
mControllingActor.unlink();
|
||||
if (pLinkedActor) {
|
||||
pLinkedActor->unlink();
|
||||
pLinkedActor = nullptr;
|
||||
}
|
||||
|
||||
if (checkType_1_3_5_6_9()) {
|
||||
MTXConcat(carryTransMtx, field_0x58, field_0x58);
|
||||
field_0x58.fn_802F1C40(2, 0);
|
||||
field_0x18 = 5;
|
||||
MTXIdentity(carryTransMtx);
|
||||
} else if (mType == CONNECTION_4) {
|
||||
if (pActor) {
|
||||
pActor->clearObjectProperty(0x4);
|
||||
}
|
||||
} else if (mType == CONNECTION_7) {
|
||||
if (pActor) {
|
||||
pActor->clearObjectProperty(0x1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (pActor && checkFlag(0x20000000)) {
|
||||
pActor->addActorToRoom(pActor->getRoomId());
|
||||
offFlag(0x20000000);
|
||||
}
|
||||
|
||||
field_0x1A = 4;
|
||||
mType = CONNECTION_0;
|
||||
offFlag(0x10000000);
|
||||
}
|
||||
|
||||
void dLinkage_c::bushTpFunc(dBgS_Acch &acch) {
|
||||
mVec3_c *pos = acch.GetPos();
|
||||
mVec3_c origPos = *pos;
|
||||
|
||||
if (field_0x1A != 0) {
|
||||
if (field_0x1A == 4 && !acch.ChkLineCheck()) {
|
||||
acch.OnLineCheck();
|
||||
onFlag(0x4000000);
|
||||
}
|
||||
|
||||
if (--field_0x1A == 0 && checkFlag(0x4000000)) {
|
||||
acch.OffLineCheck();
|
||||
offFlag(0x4000000);
|
||||
}
|
||||
}
|
||||
|
||||
acch.CrrPos(*dBgS::GetInstance());
|
||||
if (mState == STATE_ACTIVE) {
|
||||
dAcPy_c *player = dAcPy_c::GetLink2();
|
||||
if (mType == CONNECTION_1 && mControllingActor.p_owner == player) {
|
||||
player->fn_80202E00(nullptr, pos->x - origPos.x, pos->z - origPos.z);
|
||||
}
|
||||
|
||||
if (mType == CONNECTION_7 && mControllingActor.p_owner == player) {
|
||||
if (!checkFlag(0x10000)) {
|
||||
if (acch.ChkWallHit(nullptr)) {
|
||||
fn_80050EA0(player->getWhippedItem());
|
||||
return;
|
||||
}
|
||||
field_0x1A = 3;
|
||||
}
|
||||
}
|
||||
|
||||
*pos = origPos;
|
||||
}
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_80051190(dAcObjBase_c *pActor) {
|
||||
// If not active, return
|
||||
if (!checkState(STATE_ACTIVE)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If currently Linked
|
||||
if (mControllingActor.p_owner) {
|
||||
// if the actor being linked to is empty, no need to delink
|
||||
if (pLinkedActor == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the Actor is linked to itself, return?
|
||||
dAcObjBase_c *pLinked = static_cast<dAcObjBase_c *>(pLinkedActor->p_owner);
|
||||
if (pLinked && &pLinked->GetLinkage() == this) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
pLinkedActor = nullptr;
|
||||
|
||||
fn_80050EA0(pActor);
|
||||
}
|
||||
|
||||
void dLinkage_c::fn_800511E0(dAcObjBase_c *pActor) {
|
||||
bool b = checkType_1_3_5_6_9();
|
||||
|
||||
if (!(checkFlag(0x200) || b || field_0x18 == 0)) {
|
||||
field_0x58.slerpTo(mMtx_c::Identity, field_0x58, 1.f / field_0x18);
|
||||
field_0x58.fn_802F1C40(2, 0);
|
||||
field_0x18--;
|
||||
}
|
||||
mMtx_c &mtx = pActor->mWorldMtx;
|
||||
f32 y = field_0x1C * pActor->mScale.y;
|
||||
mtx.transS(pActor->GetPosition().x, pActor->GetPosition().y + pActor->GetYOffset(), pActor->GetPosition().z);
|
||||
if (mType == CONNECTION_1) {
|
||||
MTXConcat(mtx, carryTransMtx, mtx);
|
||||
}
|
||||
mMtx_c m1;
|
||||
MTXTrans(m1, 0.f, y, 0.f);
|
||||
MTXConcat(mtx, m1, mtx);
|
||||
|
||||
if (b && mType != CONNECTION_1) {
|
||||
MTXConcat(mtx, carryTransMtx, mtx);
|
||||
}
|
||||
mMtx_c m2;
|
||||
MTXConcat(mtx, field_0x58, mtx);
|
||||
MTXTrans(m2, 0.f, -y, 0.f);
|
||||
MTXConcat(mtx, m2, mtx);
|
||||
|
||||
mtx.ZXYrotM(pActor->rotation);
|
||||
if (mControllingActor.p_owner) {
|
||||
pActor->roomid = static_cast<dAcObjBase_c *>(mControllingActor.p_owner)->roomid;
|
||||
}
|
||||
}
|
||||
|
||||
bool dLinkage_c::fn_800513C0() const {
|
||||
return (mState == STATE_ACTIVE && (mType == CONNECTION_1 || mType == CONNECTION_6)) &&
|
||||
!(mControllingActor.p_owner && mControllingActor.p_owner->profile_name == fProfile::E_GEROCK);
|
||||
}
|
||||
Reference in New Issue
Block a user