mirror of
https://github.com/zeldaret/ss
synced 2026-09-10 11:55:29 -04:00
d_a_b_lastboss WIP
This commit is contained in:
@@ -1,5 +1,27 @@
|
||||
#include "d/a/b/d_a_b_lastboss.h"
|
||||
|
||||
#include "c/c_lib.h"
|
||||
#include "c/c_math.h"
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/d_base.h"
|
||||
#include "d/d_light_env.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/snd/d_snd_wzsound.h"
|
||||
#include "d/t/d_t_sword_battle_game.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_manager.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m3d/m_fanm.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "nw4r/g3d/res/g3d_resmdl.h"
|
||||
#include "s/s_Math.h"
|
||||
#include "toBeSorted/d_emitter.h"
|
||||
#include "toBeSorted/minigame_mgr.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(B_LASTBOSS, dAcBlastboss_c, fProfile::B_LASTBOSS, 0xBA, 0, 0);
|
||||
|
||||
STATE_DEFINE(dAcBlastboss_c, Fight);
|
||||
@@ -17,6 +39,421 @@ STATE_DEFINE(dAcBlastboss_c, Down);
|
||||
STATE_DEFINE(dAcBlastboss_c, Stun);
|
||||
STATE_DEFINE(dAcBlastboss_c, ThunderWait);
|
||||
|
||||
static dCcD_SrcCyl sSrcCyl1 = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_BELLOWS | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000),
|
||||
0x4103,
|
||||
{0, 0x4, 0x407},
|
||||
0x0,
|
||||
0x0},
|
||||
/* mObjCo */ {0x0}},
|
||||
/* mCylInf */
|
||||
{40.f, 300.f}
|
||||
};
|
||||
|
||||
static dCcD_SrcCyl sSrcCyl2 = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{AT_TYPE_BELLOWS, 0x103, {0, 0x4, 0x407}, 0x0, 0x0},
|
||||
/* mObjCo */ {0x0}},
|
||||
/* mCylInf */
|
||||
{70.f, 30.f}
|
||||
};
|
||||
|
||||
static dCcD_SrcCyl sSrcCyl3 = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{0x0, 0x0, {0, 0x0, 0x407}, 0x0, 0x0},
|
||||
/* mObjCo */ {0xE5}},
|
||||
/* mCylInf */
|
||||
{100.f, 250.f}
|
||||
};
|
||||
|
||||
static dCcD_SrcSph sSrcSph1 = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {AT_TYPE_DAMAGE, 0x2008D, {0, 0, 0}, 4, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{0, 0, {0, 0x0, 0x407}, 0, 0},
|
||||
/* mObjCo */ {0}},
|
||||
/* mSphInf */
|
||||
{100.0f}
|
||||
};
|
||||
|
||||
static dCcD_SrcSph sSrcSph2 = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {AT_TYPE_DAMAGE, 0x22008D, {0, 0, 4}, 8, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{AT_TYPE_0x800000 | AT_TYPE_BUGNET, 0x103, {0, 0x19, 0x407}, 0, 0},
|
||||
/* mObjCo */ {0}},
|
||||
/* mSphInf */
|
||||
{100.0f}
|
||||
};
|
||||
|
||||
static dCcD_SrcSph sSrcSph = {
|
||||
/* mObjInf */
|
||||
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
|
||||
/* mObjTg */
|
||||
{AT_TYPE_BELLOWS, 0x4103, {0, 0x0, 0x40F}, 0, 0},
|
||||
/* mObjCo */ {0}},
|
||||
/* mSphInf */
|
||||
{30.0f}
|
||||
};
|
||||
|
||||
s32 useUnused() {
|
||||
static const f32 a1[] = {
|
||||
0.95f,
|
||||
1.05f,
|
||||
0.0f,
|
||||
};
|
||||
return (s32)a1;
|
||||
}
|
||||
|
||||
bool dAcBlastboss_c::createHeap() {
|
||||
bool result;
|
||||
void *pData = getOarcResFile("BLastBoss");
|
||||
|
||||
TRY_CREATE2(mMdl.create3(*this, pData, "LastBoss", "Wait", 0x334));
|
||||
mScnCallback.attach(mMdl.getModel());
|
||||
|
||||
nw4r::g3d::ResFile res(pData);
|
||||
|
||||
TRY_CREATE2(mAnmTexSrt.create(mMdl.getModel().getResMdl(), res.GetResAnmTexSrt("Hair"), &mAllocator, nullptr, 1));
|
||||
mMdl.getModel().setAnm(mAnmTexSrt);
|
||||
|
||||
TRY_CREATE2(mAnmMatClr1.create(mMdl.getModel().getResMdl(), res.GetResAnmClr("Wait"), &mAllocator, nullptr, 2));
|
||||
mAnmMatClr1.setAnm(mMdl.getModel(), res.GetResAnmClr("Hair"), 1, m3d::PLAY_MODE_0);
|
||||
mMdl.getModel().setAnm(mAnmMatClr1);
|
||||
|
||||
mMdl.getModel().setCallback(&mMdlCallback);
|
||||
mMdlCallback.mpOwner = this;
|
||||
|
||||
TRY_CREATE2(mSwordMdl.create(
|
||||
&mAllocator, pData, "LastBossSword", 0x130, mVec3_c(0.0f, 0.0f, 0.0f), mVec3_c(0.0f, -230.0f, 0.0f), mStts,
|
||||
nullptr, 1, nullptr
|
||||
));
|
||||
// TODO I'm not going to try and make sense of this for now
|
||||
mSwordMdl.fn_8006B660(4, 1, 0, 0x10000, 0, 0, 0, 0x400, 0xc, 60.0f);
|
||||
mSwordMdl.mProc.setColor1(mColor(0xFF, 0xFF, 0xFF, 0x14));
|
||||
mSwordMdl.mProc.setColor2(mColor(0xFF, 0xFF, 0xFF, 0x14));
|
||||
|
||||
TRY_CREATE2(mThunderMdl.create(res.GetResMdl("FX_LBThunder"), &mAllocator, 0x120));
|
||||
|
||||
TRY_CREATE2(
|
||||
mThunderAnmMatClr.create(mThunderMdl.getResMdl(), res.GetResAnmClr("FX_LBThunder"), &mAllocator, nullptr, 1)
|
||||
);
|
||||
mThunderMdl.setAnm(mThunderAnmMatClr);
|
||||
|
||||
dBase_c::createBase(fProfile::LYT_BOSS_CAPTION, this, 0, OTHER);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int dAcBlastboss_c::create() {
|
||||
field_0x1130 = getFromParams(0, 0xFF);
|
||||
if (MinigameManager::GetInstance()->checkInBossRush()) {
|
||||
field_0x114D = 1;
|
||||
}
|
||||
CREATE_ALLOCATOR(dAcBlastboss_c);
|
||||
|
||||
mStts.SetRank(10);
|
||||
mCcList.addCc(mCc1, sSrcCyl1);
|
||||
mCcList.addCc(mCc2, sSrcCyl2);
|
||||
mCcList.addCc(mCc3, sSrcCyl3);
|
||||
|
||||
for (int i = 0; i < (int)ARRAY_LENGTH(field_0x1260); i++) {
|
||||
field_0x1260[i].field_0x000 = i;
|
||||
field_0x1260[i].field_0x002 = cM::rndF(65536.0f);
|
||||
mCcList.addCc(field_0x1260[i].mCc, sSrcSph);
|
||||
for (int j = 0; j < (int)ARRAY_LENGTH(field_0x1260[j].field_0x014); j++) {
|
||||
field_0x1260[i].field_0x014[j] = mPosition;
|
||||
}
|
||||
field_0x1260[i].field_0x008 = i * 15000;
|
||||
}
|
||||
|
||||
// TODO loop of length 1 might not exist
|
||||
for (int i = 0; i < (int)ARRAY_LENGTH(field_0x2948); i++) {
|
||||
mCcList.addCc(field_0x2948[i].mCc, sSrcSph);
|
||||
for (int j = 0; j < (int)ARRAY_LENGTH(field_0x2948[j].field_0x008); j++) {
|
||||
field_0x2948[i].field_0x008[j] = mPosition;
|
||||
}
|
||||
}
|
||||
|
||||
mCcList.SetStts(mStts);
|
||||
|
||||
mCc4.Set(sSrcSph1);
|
||||
mCc4.SetStts(mStts);
|
||||
|
||||
mCc5.Set(sSrcSph2);
|
||||
mCc5.mTg.Set_0x4C(-1);
|
||||
mCc5.SetStts(mStts);
|
||||
|
||||
mAcceleration = -5.0f;
|
||||
mMaxSpeed = -80.0f;
|
||||
|
||||
mBoundingBox.Set(mVec3_c(-200.0f, -300.0f, -200.0f), mVec3_c(200.0f, 300.0f, 200.0f));
|
||||
mStateMgr.changeState(StateID_Fight);
|
||||
|
||||
field_0x1132 = 1;
|
||||
field_0x1164 = cM::rndF(65536.0f);
|
||||
|
||||
mHealth = 400;
|
||||
mPositionCopy3 = mPosition;
|
||||
|
||||
field_0x11D4 = field_0x11D8 = -1;
|
||||
|
||||
mEmitter1.init(this);
|
||||
mEmitter2.init(this);
|
||||
// mEmitter3.init(this); // TODO why not this one...
|
||||
mEmitter4.init(this);
|
||||
mEmitter5.init(this);
|
||||
mEmitter6.init(this);
|
||||
mEmitter7.init(this);
|
||||
|
||||
mLightInfo.SetPosition(mPosition);
|
||||
mLightInfo.mClr.Set(100, 150, 255, 255);
|
||||
dLightEnv_c::GetPInstance()->plight_set(&mLightInfo);
|
||||
fn_143_A110(100);
|
||||
|
||||
if (!field_0x114D) {
|
||||
field_0x2CEC = 200;
|
||||
setActorProperty(AC_PROP_0x4);
|
||||
}
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dAcBlastboss_c::doDelete() {
|
||||
dLightEnv_c::GetPInstance()->plight_cut(&mLightInfo);
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dAcBlastboss_c::actorExecute() {
|
||||
if (field_0x114D && mpSwordBattleGame == nullptr) {
|
||||
mpSwordBattleGame = static_cast<dTgSwordBattleGame_c *>(
|
||||
fManager_c::searchBaseByProfName(fProfile::TAG_SWORD_BATTLE_GAME, mpSwordBattleGame)
|
||||
);
|
||||
}
|
||||
dAcPy_c *link = dAcPy_c::GetLinkM();
|
||||
|
||||
field_0x1164++;
|
||||
|
||||
field_0x1133 = 0;
|
||||
field_0x1131 = 0;
|
||||
field_0x1141 = 0;
|
||||
field_0x114E = 0;
|
||||
|
||||
field_0x11A4 = 0.0f;
|
||||
mLightInfo.mScale = 0.0f;
|
||||
field_0x11B0 = 0.7f;
|
||||
|
||||
if (field_0x1156 != 0) {
|
||||
field_0x1156--;
|
||||
}
|
||||
|
||||
if (field_0x1158 != 0) {
|
||||
field_0x1158--;
|
||||
}
|
||||
|
||||
if (field_0x115A != 0) {
|
||||
field_0x115A--;
|
||||
}
|
||||
|
||||
if (field_0x115C != 0) {
|
||||
field_0x115C--;
|
||||
}
|
||||
|
||||
if (field_0x115E != 0) {
|
||||
field_0x115E--;
|
||||
}
|
||||
|
||||
if (field_0x1160 != 0) {
|
||||
field_0x1160--;
|
||||
}
|
||||
|
||||
if (mMdlCallback.field_0x04 != 0) {
|
||||
mMdlCallback.field_0x04--;
|
||||
}
|
||||
|
||||
if (field_0x117C != 0) {
|
||||
field_0x117C--;
|
||||
}
|
||||
|
||||
if (field_0x113D != 0) {
|
||||
field_0x113D--;
|
||||
}
|
||||
|
||||
if (field_0x113F != 0) {
|
||||
field_0x113F--;
|
||||
}
|
||||
|
||||
if (field_0x113E != 0) {
|
||||
field_0x113E--;
|
||||
}
|
||||
|
||||
mVec3_c linkPos = link->getPosition();
|
||||
field_0x116A = cLib::targetAngleY(mPosition, linkPos);
|
||||
// TODO maybe inline
|
||||
mVec3_c posDiff = link->getPosition() - mPosition;
|
||||
field_0x1190 = posDiff.absXZ();
|
||||
|
||||
|
||||
field_0x1186 = field_0x116A - mRotation.y;
|
||||
mSwordMdl.setAttackActive(false);
|
||||
|
||||
mCc4.ClrAtSet();
|
||||
mCc5.ClrAtSet();
|
||||
|
||||
fn_143_6720();
|
||||
if (mpSwordBattleGame == nullptr || mpSwordBattleGame->checkFightStarted() == true) {
|
||||
mStateMgr.executeState();
|
||||
}
|
||||
|
||||
mRotation.x = mRotationCopy.x;
|
||||
mRotation.z = mRotationCopy.z;
|
||||
sLib::addCalcAngle(&mRotation.y.mVal, mRotationCopy.y, 2, 0x800);
|
||||
|
||||
mMdl.play();
|
||||
if (!field_0x114F) {
|
||||
mAnmMatClr1.play();
|
||||
}
|
||||
|
||||
calcVelocity();
|
||||
mPosition += mVelocity;
|
||||
mPosition += mStts.GetCcMove();
|
||||
mPosition.x += field_0x119C;
|
||||
mPosition.z += field_0x11A0;
|
||||
|
||||
field_0x119C *= 0.6f;
|
||||
field_0x11A0 *= 0.6f;
|
||||
|
||||
f32 f5 = 0.0f;
|
||||
if (mRotation.x != 0) {
|
||||
f5 += field_0x11C0 * mRotation.x.sin();
|
||||
}
|
||||
|
||||
field_0x1140 = 0;
|
||||
if (mPosition.y <= f5) {
|
||||
mPosition.y = f5;
|
||||
field_0x11BC = mVelocity.y;
|
||||
mVelocity.y = 0.0f;
|
||||
field_0x1140 = 1;
|
||||
}
|
||||
|
||||
fn_143_7B00();
|
||||
|
||||
mWorldMtx.transS(mPosition);
|
||||
mWorldMtx.ZXYrotM(mRotation);
|
||||
mScale.set(0.95f, 0.95f, 0.95f);
|
||||
mMdl.getModel().setScale(mScale);
|
||||
mMdl.getModel().setLocalMtx(mWorldMtx);
|
||||
if (!field_0x114F) {
|
||||
mAnmTexSrt.play();
|
||||
}
|
||||
|
||||
mMdl.getModel().calc(false);
|
||||
|
||||
nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl();
|
||||
mMtx_c nodeMtx;
|
||||
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("loc_sword01").GetID(), nodeMtx);
|
||||
mMtx_c scaleMtx;
|
||||
scaleMtx.scaleS(1.05f, 1.05f, 1.05f);
|
||||
MTXConcat(nodeMtx, scaleMtx, nodeMtx);
|
||||
|
||||
// TODO - inline?
|
||||
mVec3_c v(mRotation.y.sin(), 0.0f, mRotation.y.cos());
|
||||
mSwordMdl.calc(nodeMtx, v, false);
|
||||
|
||||
mVec3_c vEff(0.0f, -120.0f, 0.0f);
|
||||
if ((s32)field_0x1144 == 9) {
|
||||
vEff.y = -80.0f;
|
||||
if (field_0x1190 > 300.0f) {
|
||||
vEff.y -= (field_0x1190 - 300.0f);
|
||||
if (vEff.y < -280.0f) {
|
||||
vEff.y = -280.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
MTXMultVec(nodeMtx, vEff, field_0x1208);
|
||||
|
||||
if (mIsSwordEmpowered) {
|
||||
mEmitter4.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_619_, nodeMtx, nullptr, nullptr);
|
||||
mLightInfo.mPos = field_0x1208;
|
||||
if (dScGame_c::getUpdateFrameCount() & 2) {
|
||||
mLightInfo.SetScale(300.0f);
|
||||
} else {
|
||||
mLightInfo.SetScale(200.0f);
|
||||
}
|
||||
holdSound(SE_BLasBos_SwordEnpowered);
|
||||
}
|
||||
|
||||
if (field_0x114B != 0) {
|
||||
if (field_0x114B == 1) {
|
||||
mEmitter7.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_852_, nodeMtx, nullptr, nullptr);
|
||||
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx);
|
||||
mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr);
|
||||
holdSound(SE_BLasBos_UnderElecShock);
|
||||
} else if (field_0x114B == 2) {
|
||||
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx);
|
||||
dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_851_, nodeMtx, nullptr, nullptr, 0, 0);
|
||||
mMtx_c transMtx;
|
||||
transMtx.transS(0.0f, -100000.0f, 0.0f);
|
||||
MTXConcat(nodeMtx, transMtx, nodeMtx);
|
||||
mEmitter7.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_852_, nodeMtx, nullptr, nullptr);
|
||||
mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr);
|
||||
holdSound(SE_BLasBos_KillOffElecShock);
|
||||
}
|
||||
mLightInfo.mPos = field_0x1208;
|
||||
if (dScGame_c::getUpdateFrameCount() & 2) {
|
||||
mLightInfo.SetScale(400.0f);
|
||||
} else {
|
||||
mLightInfo.SetScale(300.0f);
|
||||
}
|
||||
field_0x114B = 0;
|
||||
}
|
||||
|
||||
// TODO NODE IDs
|
||||
mMdl.getModel().getNodeWorldMtx(0x26, nodeMtx);
|
||||
nodeMtx.getTranslation(field_0x11E4);
|
||||
mMdl.getModel().getNodeWorldMtx(1, nodeMtx);
|
||||
nodeMtx.getTranslation(field_0x11F0);
|
||||
mMdl.getModel().getNodeWorldMtx(3, nodeMtx);
|
||||
nodeMtx.getTranslation(field_0x11FC);
|
||||
mMdl.getModel().getNodeWorldMtx(0x3C, nodeMtx);
|
||||
nodeMtx.getTranslation(field_0x1238[0]);
|
||||
mMdl.getModel().getNodeWorldMtx(0x40, nodeMtx);
|
||||
nodeMtx.getTranslation(field_0x1238[1]);
|
||||
|
||||
mMdl.getModel().getNodeWorldMtx(5, nodeMtx);
|
||||
mVec3_c tmp1(0.0f, 0.0f, 0.0f);
|
||||
MTXMultVec(nodeMtx, tmp1, mPositionCopy2);
|
||||
// TODO
|
||||
mPositionCopy3 = mVec3_c(mPositionCopy2.x, mPositionCopy2.y + 50.0f, mPositionCopy2.z);
|
||||
|
||||
if (field_0x1132) {
|
||||
fn_80030c20(0, 1500.0f, 50.0f, -200.0f, 200.0f);
|
||||
}
|
||||
|
||||
nodeMtx.YrotS(mRotation.y);
|
||||
mVec3_c tmpCc;
|
||||
if (link->isAttacking() && *mStateMgr.getStateID() == StateID_Guard) {
|
||||
if (field_0x1144 == 9) {
|
||||
tmpCc.z = 100.0f;
|
||||
// TODO - ...
|
||||
}
|
||||
}
|
||||
|
||||
MTXMultVec(nodeMtx, tmpCc, tmpCc);
|
||||
tmpCc += mPosition;
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
void dAcBlastboss_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *manip, nw4r::g3d::ResMdl mdl) {}
|
||||
|
||||
void dAcBlastboss_c::initializeState_Fight() {}
|
||||
void dAcBlastboss_c::executeState_Fight() {}
|
||||
void dAcBlastboss_c::finalizeState_Fight() {}
|
||||
@@ -59,3 +496,12 @@ void dAcBlastboss_c::finalizeState_Stun() {}
|
||||
void dAcBlastboss_c::initializeState_ThunderWait() {}
|
||||
void dAcBlastboss_c::executeState_ThunderWait() {}
|
||||
void dAcBlastboss_c::finalizeState_ThunderWait() {}
|
||||
|
||||
int dAcBlastboss_c::draw() {
|
||||
drawModelType1(&mMdl.getModel());
|
||||
mSwordMdl.entry(this, nullptr, nullptr);
|
||||
if (field_0x114C) {
|
||||
drawModelType1(&mThunderMdl);
|
||||
}
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ void cM3dGCps::SetR(f32 r) {
|
||||
r = 0.0f;
|
||||
}
|
||||
mRadius = r;
|
||||
field_0x1C = (double)r; // huh
|
||||
field_0x1C = mRadius;
|
||||
}
|
||||
|
||||
void cM3dGCps::Set_0x1C(f32 f) {
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
#include "toBeSorted/d_enemy_sword_mdl.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/col/cc/d_cc_s.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "m/m3d/m_shadow.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "nw4r/g3d/res/g3d_resmdl.h"
|
||||
|
||||
dCcD_SrcCps sCcSrc = {
|
||||
{
|
||||
{0x400, 0x8D, {1, 0, 0}, 1, 0, 0, 0, 0, 0},
|
||||
{0, 0, {0, 0, 0x407}, 0, 0},
|
||||
{0},
|
||||
},
|
||||
{30.0f},
|
||||
};
|
||||
|
||||
// Yeah these two functions do the same thing. Could've made one call the other...
|
||||
|
||||
bool dEnemySwordMdl_c::create(
|
||||
mAllocator_c *alloc, void *pData, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2,
|
||||
cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
|
||||
) {
|
||||
nw4r::g3d::ResMdl mdl = nw4r::g3d::ResFile(pData).GetResMdl(mdlName);
|
||||
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!mProc.create(100, alloc, pImg, 0.015f)) {
|
||||
mMdl.remove();
|
||||
return false;
|
||||
}
|
||||
|
||||
field_0x074.set(v1.x, v1.y, v1.z);
|
||||
field_0x080.set(v2.x, v2.y, v2.z);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
mCcList.addCc(mCcs[i], sCcSrc);
|
||||
}
|
||||
mCcList.SetStts(stts);
|
||||
mCcList.ClrAt();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dEnemySwordMdl_c::create(
|
||||
mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1,
|
||||
const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
|
||||
) {
|
||||
nw4r::g3d::ResMdl mdl = resFile.GetResMdl(mdlName);
|
||||
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!mProc.create(100, alloc, pImg, 0.015f)) {
|
||||
mMdl.remove();
|
||||
return false;
|
||||
}
|
||||
|
||||
field_0x074.set(v1.x, v1.y, v1.z);
|
||||
field_0x080.set(v2.x, v2.y, v2.z);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
mCcList.addCc(mCcs[i], sCcSrc);
|
||||
}
|
||||
mCcList.SetStts(stts);
|
||||
mCcList.ClrAt();
|
||||
return true;
|
||||
}
|
||||
|
||||
void dEnemySwordMdl_c::fn_8006B640() {
|
||||
mCcs[0].OnAtSet();
|
||||
field_0x070 = true;
|
||||
field_0x071 = false;
|
||||
}
|
||||
|
||||
// TODO - ...
|
||||
|
||||
void dEnemySwordMdl_c::calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass) {
|
||||
mMdl.setLocalMtx(mtx);
|
||||
mMdl.calc(false);
|
||||
MTXMultVec(mtx, field_0x074, field_0x08C);
|
||||
MTXMultVec(mtx, field_0x080, field_0x098);
|
||||
|
||||
if (field_0x070) {
|
||||
mVec3_c v = field_0x098 - field_0x08C;
|
||||
v.normalize();
|
||||
|
||||
mVec3_c hi = field_0x098 + v * field_0x0A8;
|
||||
|
||||
mCcs[1].Set(mCcs[0].mEnd, hi);
|
||||
mCcs[2].Set(mCcs[0].mStart, hi);
|
||||
mCcs[0].Set(field_0x08C - v * field_0x0A4, hi);
|
||||
|
||||
mCcs[0].SetAtVec(v1);
|
||||
mCcs[1].SetAtVec(v1);
|
||||
mCcs[2].SetAtVec(v1);
|
||||
|
||||
if (field_0x071 && !mCcs[1].ChkAtSet()) {
|
||||
mCcs[1].OnAtSet();
|
||||
mCcs[2].OnAtSet();
|
||||
} else {
|
||||
field_0x071 = true;
|
||||
}
|
||||
|
||||
mCcList.registerColliders();
|
||||
if (mass) {
|
||||
dCcS::GetInstance()->GetMassMng().SetObj(&mCcs[0], 2);
|
||||
}
|
||||
} else {
|
||||
field_0x071 = false;
|
||||
if (mCcs[0].ChkAtSet()) {
|
||||
mCcList.ClrAt();
|
||||
}
|
||||
}
|
||||
mProc.calc(field_0x098, field_0x08C);
|
||||
}
|
||||
|
||||
bool dEnemySwordMdl_c::entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat) {
|
||||
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
|
||||
obj->fn_8002ECD0(&mMdl, 7);
|
||||
} else {
|
||||
obj->drawModelType1(&mMdl);
|
||||
}
|
||||
mProc.entry();
|
||||
if (shadow != nullptr && quat != nullptr) {
|
||||
m3d::mShadow_c::GetInstance()->addMdlToCircle(shadow, mMdl, *quat);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
#include "toBeSorted/d_sword_swing_effect.h"
|
||||
|
||||
#include "d/d_stage_mgr.h"
|
||||
#include "egg/gfx/eggDrawGX.h"
|
||||
#include "m/m3d/m3d.h"
|
||||
#include "m/m3d/m_proc.h"
|
||||
#include "m/m3d/m_scnleaf.h"
|
||||
#include "nw4r/g3d/g3d_scnobj.h"
|
||||
#include "nw4r/math/math_types.h"
|
||||
|
||||
void dSwordSwingEffectProcBase_c::remove() {
|
||||
if (mpEntries != nullptr) {
|
||||
delete[] mpEntries;
|
||||
mpEntries = nullptr;
|
||||
}
|
||||
m3d::scnLeaf_c::remove();
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcBase_c::drawXlu() {
|
||||
m3d::resetMaterial();
|
||||
GXSetNumChans(1);
|
||||
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
|
||||
GXSetNumTexGens(0);
|
||||
GXSetNumTevStages(1);
|
||||
GXSetNumIndStages(0);
|
||||
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
|
||||
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
|
||||
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
|
||||
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
||||
GXSetZCompLoc(1);
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
|
||||
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
|
||||
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
||||
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
|
||||
GXSetFogRangeAdj(0, 0, 0);
|
||||
GXSetCullMode(GX_CULL_NONE);
|
||||
nw4r::math::MTX34 mtx;
|
||||
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
|
||||
cam.GetCameraMtx(&mtx);
|
||||
GXLoadPosMtxImm(mtx, 0);
|
||||
GXSetCurrentMtx(0);
|
||||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
|
||||
|
||||
swing_entry *entry = &mpEntries[mHead];
|
||||
for (u16 i = 0; i < mCount; i++) {
|
||||
if (entry == &mpEntries[0]) {
|
||||
entry = &mpEntries[mNum];
|
||||
}
|
||||
entry--;
|
||||
|
||||
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
|
||||
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime);
|
||||
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
|
||||
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime);
|
||||
}
|
||||
|
||||
GXEnd();
|
||||
}
|
||||
|
||||
bool dSwordSwingEffectProcBase_c::hasSwings() const {
|
||||
return mCount != 0;
|
||||
}
|
||||
|
||||
int dSwordSwingEffectProcBase_c::entry() {
|
||||
if (hasSwings()) {
|
||||
return m3d::pushBack(mpScnLeaf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool dSwordSwingEffectProcBase_c::create(s32 num, mAllocator_c *alloc) {
|
||||
if (!m3d::proc_c::create(alloc, nullptr)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mpEntries = new (alloc->getHeap(), 4) swing_entry[num]();
|
||||
if (mpEntries == nullptr) {
|
||||
remove();
|
||||
return false;
|
||||
}
|
||||
|
||||
mNum = num;
|
||||
setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcBase_c::addSwing(
|
||||
const mVec3_c &pos1, mColor c1, const mVec3_c &pos2, mColor c2
|
||||
) {
|
||||
mpEntries[mHead].set(pos1, c1, pos2, c2);
|
||||
mHead++;
|
||||
if (mHead >= mNum) {
|
||||
mHead = 0;
|
||||
}
|
||||
if (mCount < mNum) {
|
||||
mCount++;
|
||||
}
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcBase_c::calc(f32 f) {
|
||||
s32 count = mCount;
|
||||
if (count == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
swing_entry *entry = &mpEntries[mHead];
|
||||
for (u16 i = 0; i < mCount; i++) {
|
||||
if (entry == &mpEntries[0]) {
|
||||
entry = &mpEntries[mNum];
|
||||
}
|
||||
entry--;
|
||||
entry->mLifetime -= f;
|
||||
if (entry->mLifetime <= 0.0f) {
|
||||
entry->mLifetime = 0.0f;
|
||||
count--;
|
||||
}
|
||||
}
|
||||
if (mCount != 0 && count == 0) {
|
||||
mHead = 0;
|
||||
}
|
||||
mCount = count;
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProc_c::drawXlu() {
|
||||
if (mpImg == nullptr) {
|
||||
dSwordSwingEffectProcBase_c::drawXlu();
|
||||
} else {
|
||||
EGG::DrawGX::LoadTexture(mpImg, GX_TEXMAP0);
|
||||
GXSetNumChans(1);
|
||||
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
|
||||
GXSetNumTexGens(1);
|
||||
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d);
|
||||
GXSetNumTevStages(1);
|
||||
GXSetNumIndStages(0);
|
||||
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
|
||||
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
|
||||
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_RASA, GX_CA_TEXA, GX_CA_ZERO);
|
||||
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV);
|
||||
GXSetZCompLoc(0);
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
|
||||
GXSetZMode(true, GX_LEQUAL, false);
|
||||
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
||||
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
|
||||
GXSetFogRangeAdj(0, 0, 0);
|
||||
GXSetCullMode(GX_CULL_NONE);
|
||||
nw4r::math::MTX34 mtx;
|
||||
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
|
||||
cam.GetCameraMtx(&mtx);
|
||||
GXLoadPosMtxImm(mtx, 0);
|
||||
GXSetCurrentMtx(0);
|
||||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
|
||||
|
||||
u8 alpha = dStageMgr_c::GetInstance()->getGlobalAlpha();
|
||||
f32 fAlpha = alpha * (1.0f / 255.0f);
|
||||
|
||||
s32 idx = mHead - mCount;
|
||||
if (idx < 0) {
|
||||
idx += mNum;
|
||||
}
|
||||
|
||||
f32 texCoordOffset = mTexScale * idx;
|
||||
|
||||
swing_entry *entry = &mpEntries[idx];
|
||||
swing_entry *last = &mpEntries[mNum];
|
||||
|
||||
for (u16 i = 0; i < mCount; i++) {
|
||||
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
|
||||
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime * fAlpha);
|
||||
GXTexCoord2f32(texCoordOffset, 0.0f);
|
||||
|
||||
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
|
||||
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime * fAlpha);
|
||||
GXTexCoord2f32(texCoordOffset, 1.0f);
|
||||
|
||||
texCoordOffset += mTexScale;
|
||||
entry++;
|
||||
if (entry == last) {
|
||||
entry = &mpEntries[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool dSwordSwingEffectProc_c::create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale) {
|
||||
if (!dSwordSwingEffectProcBase_c::create(num, alloc)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mpImg = pImg;
|
||||
mTexScale = scale;
|
||||
return true;
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcBase_c::swing_entry::set(
|
||||
const mVec3_c &pos1, const mColor &c1, const mVec3_c &pos2, const mColor &c2
|
||||
) {
|
||||
mLifetime = 1.0f;
|
||||
mv1 = pos1;
|
||||
mv2 = pos2;
|
||||
mc1 = c1;
|
||||
mc2 = c2;
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
#include "toBeSorted/d_sword_swing_effect_mgr.h"
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "egg/math/eggMatrix.h"
|
||||
#include "m/m_vec.h"
|
||||
|
||||
// TODO: can't use EGG::Vector3f::cross because the Vector3f -> mVec3_c conversion
|
||||
// forces additional stack stores. An open-coded cross function works too in this
|
||||
// file but maybe pattern comes up in more files and then we can move it to d_vec?
|
||||
inline void cross(mVec3_c &result, const mVec3_c &left, const mVec3_c &right) {
|
||||
result.set(
|
||||
(left.y * right.z) - (left.z * right.y), (left.z * right.x) - (left.x * right.z),
|
||||
(left.x * right.y) - (left.y * right.x)
|
||||
);
|
||||
}
|
||||
|
||||
static bool fn_8006A8D0(const mVec2_c &v1, const mVec2_c &v2, const mVec2_c &v3, const mVec2_c &v4, mVec2_c &result) {
|
||||
mVec2_c t1 = v2 - v1;
|
||||
mVec2_c t2 = v4 - v3;
|
||||
|
||||
if (cM::isZero(t1.x)) {
|
||||
if (cM::isZero(t2.x)) {
|
||||
return false;
|
||||
} else {
|
||||
result.x = v1.x;
|
||||
result.y = v3.y + (t2.y / t2.x) * (v1.x - v3.x);
|
||||
}
|
||||
} else {
|
||||
if (cM::isZero(t2.x)) {
|
||||
result.x = v3.x;
|
||||
} else {
|
||||
f32 tmp = t1.y / t1.x - t2.y / t2.x;
|
||||
if (cM::isZero(tmp)) {
|
||||
return false;
|
||||
}
|
||||
result.x = (v3.x + (((t1.y / t1.x) * v1.x - v1.y) - (t2.y / t2.x) * v3.x)) / tmp;
|
||||
}
|
||||
result.y = v1.y + (t1.y / t1.x) * (result.x - v1.x);
|
||||
}
|
||||
|
||||
mVec2_c diff = result - v1;
|
||||
if (diff.x * t1.x + diff.y * t1.y >= 0.0f) {
|
||||
return false;
|
||||
}
|
||||
|
||||
diff = result - v3;
|
||||
if (diff.x * t2.x + diff.y * t2.y >= 0.0f) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcMgr_c::createSwingEntries(const mVec3_c &v1, const mVec3_c &v2) {
|
||||
mVec3_c lastDiff = field_0x44 - field_0x38;
|
||||
mVec3_c diff = v1 - v2;
|
||||
|
||||
mVec3_c cross_;
|
||||
cross(cross_, lastDiff, diff);
|
||||
|
||||
f32 diffMag = diff.mag();
|
||||
|
||||
lastDiff.normalize();
|
||||
|
||||
diff /= diffMag;
|
||||
|
||||
cross_.normalize();
|
||||
|
||||
// Same code as in dowsing_target...
|
||||
f32 dot = lastDiff.dot(diff);
|
||||
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
|
||||
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
|
||||
EGG::Matrix34f mat;
|
||||
mat.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
|
||||
|
||||
mVec2_c p1, p2, p3, p4;
|
||||
mVec2_c res1, res2, res3;
|
||||
|
||||
p1.set(field_0x38.x, field_0x38.y);
|
||||
p2.set(field_0x44.x, field_0x44.y);
|
||||
p3.set(v2.x, v2.y);
|
||||
p4.set(v1.x, v1.y);
|
||||
bool b1 = fn_8006A8D0(p1, p2, p3, p4, res1);
|
||||
|
||||
p1.set(field_0x38.y, field_0x38.z);
|
||||
p2.set(field_0x44.y, field_0x44.z);
|
||||
p3.set(v2.y, v2.z);
|
||||
p4.set(v1.y, v1.z);
|
||||
bool b2 = fn_8006A8D0(p1, p2, p3, p4, res2);
|
||||
|
||||
p1.set(field_0x38.z, field_0x38.x);
|
||||
p2.set(field_0x44.z, field_0x44.x);
|
||||
p3.set(v2.z, v2.x);
|
||||
p4.set(v1.z, v1.x);
|
||||
bool b3 = fn_8006A8D0(p1, p2, p3, p4, res3);
|
||||
|
||||
bool b;
|
||||
mVec3_c local_124 = (v2 + field_0x38) * 0.5f;
|
||||
mVec3_c diff1;
|
||||
mVec3_c v;
|
||||
f32 f_29;
|
||||
f32 f_28;
|
||||
EGG::Matrix34f mat2;
|
||||
int i = 0;
|
||||
if (!b1) {
|
||||
i += 1;
|
||||
}
|
||||
if (!b2) {
|
||||
i += 1;
|
||||
}
|
||||
|
||||
if (!b3) {
|
||||
i += 1;
|
||||
}
|
||||
|
||||
if (i >= 2) {
|
||||
v = (v2 - field_0x38) * 0.1f;
|
||||
b = false;
|
||||
} else {
|
||||
if (b1 && b3) {
|
||||
local_124.x = (res1.x + res3.y) * 0.5f;
|
||||
} else if (b1) {
|
||||
local_124.x = res1.x;
|
||||
} else if (b3) {
|
||||
local_124.x = res3.y;
|
||||
}
|
||||
|
||||
if (b2 && b1) {
|
||||
local_124.y = (res2.x + res1.y) * 0.5f;
|
||||
} else if (b2) {
|
||||
local_124.y = res2.x;
|
||||
} else if (b1) {
|
||||
local_124.y = res1.y;
|
||||
}
|
||||
|
||||
if (b3 && b2) {
|
||||
local_124.z = (res3.x + res2.y) * 0.5f;
|
||||
} else if (b3) {
|
||||
local_124.z = res3.x;
|
||||
} else if (b2) {
|
||||
local_124.z = res2.y;
|
||||
}
|
||||
|
||||
diff1 = field_0x38 - local_124;
|
||||
mVec3_c diff2 = v2 - local_124;
|
||||
|
||||
f_29 = diff1.mag();
|
||||
f_28 = (diff2.mag() - f_29) * 0.1f;
|
||||
|
||||
diff2.normalize();
|
||||
diff1.normalize();
|
||||
|
||||
cross(cross_, diff1, diff2);
|
||||
cross_.normalize();
|
||||
|
||||
// Same code as in dowsing_target...
|
||||
f32 dot = diff1.dot(diff2);
|
||||
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
|
||||
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
|
||||
mat2.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
|
||||
|
||||
b = true;
|
||||
}
|
||||
|
||||
f32 blub = 0.1f;
|
||||
for (int i = 1; i <= 10; i++) {
|
||||
mVec3_c a;
|
||||
mVec3_c t;
|
||||
if (b) {
|
||||
MTXMultVecSR(mat2.m, diff1, diff1);
|
||||
t = local_124 + (diff1 * (f_29 + (f_28 * i)));
|
||||
} else {
|
||||
t = field_0x38 + v * i;
|
||||
}
|
||||
|
||||
MTXMultVecSR(mat.m, lastDiff, lastDiff);
|
||||
a = t + lastDiff * diffMag;
|
||||
|
||||
mProc.addSwing(a, mC1, t, mC2);
|
||||
// Unused
|
||||
blub += 0.1f;
|
||||
}
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcMgr_c::calc(const mVec3_c &v1, const mVec3_c &v2) {
|
||||
mProc.calc(0.1f);
|
||||
if (mIsActive) {
|
||||
createSwingEntries(v1, v2);
|
||||
}
|
||||
field_0x44 = v1;
|
||||
field_0x38 = v2;
|
||||
}
|
||||
|
||||
void dSwordSwingEffectProcMgr_c::entry() {
|
||||
mProc.entry();
|
||||
}
|
||||
@@ -174,6 +174,7 @@ DowsingTarget *DowsingTarget::getDowsingInfo(
|
||||
|
||||
targetDir.normalize();
|
||||
|
||||
// Same code as in d_sword_swing_effect_mgr...
|
||||
f32 dot = dwsDir.dot(targetDir);
|
||||
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
|
||||
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
|
||||
|
||||
Reference in New Issue
Block a user