mirror of
https://github.com/zeldaret/ss
synced 2026-08-01 16:19:28 -04:00
Merge branch 'main' into d_lyt_shop
This commit is contained in:
+3310
-30
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ STATE_DEFINE(dAcKanban_c, Wait);
|
||||
STATE_DEFINE(dAcKanban_c, Message);
|
||||
STATE_DEFINE(dAcKanban_c, PullOut);
|
||||
|
||||
dAcKanban_c::dAcKanban_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcKanban_c::dAcKanban_c() : mStateMgr(*this) {}
|
||||
dAcKanban_c::~dAcKanban_c() {}
|
||||
|
||||
void dAcKanban_c::initializeState_Wait() {}
|
||||
|
||||
@@ -265,7 +265,7 @@ int dAcEsm_c::actorCreate() {
|
||||
|
||||
mAnmTexPat.setFrame(anim_frame, 0);
|
||||
|
||||
setInteractionFlags(0x40);
|
||||
setInteractionFlags(INTERACT_0x40);
|
||||
|
||||
fn_187_44C0();
|
||||
|
||||
@@ -369,7 +369,7 @@ int dAcEsm_c::actorExecute() {
|
||||
|
||||
if (timeCheck != 0) {
|
||||
if (field_0xBBF == 3) {
|
||||
if (checkInteractionFlags(4)) {
|
||||
if (checkInteractionFlags(INTERACT_0x4)) {
|
||||
fn_800306d0();
|
||||
}
|
||||
return SUCCEEDED;
|
||||
@@ -400,7 +400,7 @@ int dAcEsm_c::actorExecute() {
|
||||
}
|
||||
|
||||
if (field_0xBBF == 3 && mTimeArea.isNearZero()) {
|
||||
if (checkInteractionFlags(4)) {
|
||||
if (checkInteractionFlags(INTERACT_0x4)) {
|
||||
fn_800306d0();
|
||||
}
|
||||
return SUCCEEDED;
|
||||
@@ -1430,7 +1430,7 @@ void dAcEsm_c::fn_187_6C20(bool param0) {
|
||||
|
||||
mSph.SetAtFlagsUpper(0);
|
||||
sTimer = 0;
|
||||
setInteractionFlags(4);
|
||||
setInteractionFlags(INTERACT_0x4);
|
||||
fn_187_44C0();
|
||||
field_0xBAC = 60;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ STATE_DEFINE(dAcObamboo_c, Wait);
|
||||
STATE_DEFINE(dAcObamboo_c, Fall);
|
||||
STATE_DEFINE(dAcObamboo_c, CutMark);
|
||||
|
||||
dAcObamboo_c::dAcObamboo_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcObamboo_c::dAcObamboo_c() : mStateMgr(*this) {}
|
||||
dAcObamboo_c::~dAcObamboo_c() {}
|
||||
|
||||
void dAcObamboo_c::initializeState_Wait() {}
|
||||
|
||||
@@ -8,7 +8,7 @@ STATE_DEFINE(dAcOcannonCover_c, Shake);
|
||||
STATE_DEFINE(dAcOcannonCover_c, Close);
|
||||
STATE_DEFINE(dAcOcannonCover_c, Play);
|
||||
|
||||
dAcOcannonCover_c::dAcOcannonCover_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOcannonCover_c::dAcOcannonCover_c() : mStateMgr(*this) {}
|
||||
dAcOcannonCover_c::~dAcOcannonCover_c() {}
|
||||
|
||||
void dAcOcannonCover_c::initializeState_Wait() {}
|
||||
|
||||
@@ -10,7 +10,7 @@ STATE_DEFINE(dAcOClef_c, PathMove);
|
||||
STATE_DEFINE(dAcOClef_c, Gravitate);
|
||||
STATE_DEFINE(dAcOClef_c, Die);
|
||||
|
||||
dAcOClef_c::dAcOClef_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOClef_c::dAcOClef_c() : mStateMgr(*this) {}
|
||||
dAcOClef_c::~dAcOClef_c() {}
|
||||
|
||||
void dAcOClef_c::initializeState_WaitPhantom() {}
|
||||
|
||||
@@ -12,7 +12,7 @@ STATE_DEFINE(dAcOFence_c, WaitClose);
|
||||
STATE_DEFINE(dAcOFence_c, Close);
|
||||
STATE_DEFINE(dAcOFence_c, RequestConfineEvent);
|
||||
|
||||
dAcOFence_c::dAcOFence_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOFence_c::dAcOFence_c() : mStateMgr(*this) {}
|
||||
dAcOFence_c::~dAcOFence_c() {}
|
||||
|
||||
void dAcOFence_c::initializeState_WaitOpen() {}
|
||||
|
||||
@@ -5,7 +5,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_FORTUNE_RING, dAcOfortuneRing_c, fProfile::OBJ_FORTUNE
|
||||
STATE_DEFINE(dAcOfortuneRing_c, Wait);
|
||||
STATE_DEFINE(dAcOfortuneRing_c, Play);
|
||||
|
||||
dAcOfortuneRing_c::dAcOfortuneRing_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOfortuneRing_c::dAcOfortuneRing_c() : mStateMgr(*this) {}
|
||||
dAcOfortuneRing_c::~dAcOfortuneRing_c() {}
|
||||
|
||||
void dAcOfortuneRing_c::initializeState_Wait() {}
|
||||
|
||||
@@ -10,7 +10,7 @@ STATE_DEFINE(dAcOgroundCover_c, AppearClose);
|
||||
STATE_DEFINE(dAcOgroundCover_c, Fight);
|
||||
STATE_DEFINE(dAcOgroundCover_c, Sealed);
|
||||
|
||||
dAcOgroundCover_c::dAcOgroundCover_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOgroundCover_c::dAcOgroundCover_c() : mStateMgr(*this) {}
|
||||
dAcOgroundCover_c::~dAcOgroundCover_c() {}
|
||||
|
||||
void dAcOgroundCover_c::initializeState_Wait() {}
|
||||
|
||||
@@ -13,7 +13,7 @@ STATE_DEFINE(dAcOItemHeartContainer_c, Fall);
|
||||
STATE_DEFINE(dAcOItemHeartContainer_c, WaitGet);
|
||||
STATE_DEFINE(dAcOItemHeartContainer_c, WaitGetQuake);
|
||||
|
||||
dAcOItemHeartContainer_c::dAcOItemHeartContainer_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOItemHeartContainer_c::dAcOItemHeartContainer_c() : mStateMgr(*this) {}
|
||||
dAcOItemHeartContainer_c::~dAcOItemHeartContainer_c() {}
|
||||
|
||||
void dAcOItemHeartContainer_c::initializeState_Hide() {}
|
||||
|
||||
@@ -5,7 +5,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_ROULETTE_ISLAND_C, dAcOrouletteIslandC_c, fProfile::OB
|
||||
STATE_DEFINE(dAcOrouletteIslandC_c, Wait);
|
||||
STATE_DEFINE(dAcOrouletteIslandC_c, Play);
|
||||
|
||||
dAcOrouletteIslandC_c::dAcOrouletteIslandC_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOrouletteIslandC_c::dAcOrouletteIslandC_c() : mStateMgr(*this) {}
|
||||
dAcOrouletteIslandC_c::~dAcOrouletteIslandC_c() {}
|
||||
|
||||
void dAcOrouletteIslandC_c::initializeState_Wait() {}
|
||||
|
||||
@@ -7,7 +7,7 @@ STATE_DEFINE(dAcOrouletteIslandR_c, Move);
|
||||
STATE_DEFINE(dAcOrouletteIslandR_c, Reduce);
|
||||
STATE_DEFINE(dAcOrouletteIslandR_c, End);
|
||||
|
||||
dAcOrouletteIslandR_c::dAcOrouletteIslandR_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOrouletteIslandR_c::dAcOrouletteIslandR_c() : mStateMgr(*this) {}
|
||||
dAcOrouletteIslandR_c::~dAcOrouletteIslandR_c() {}
|
||||
|
||||
void dAcOrouletteIslandR_c::initializeState_Wait() {}
|
||||
|
||||
@@ -9,7 +9,7 @@ STATE_DEFINE(dAcOSave_c, Query);
|
||||
STATE_DEFINE(dAcOSave_c, LightShaft);
|
||||
STATE_DEFINE(dAcOSave_c, Escape);
|
||||
|
||||
dAcOSave_c::dAcOSave_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOSave_c::dAcOSave_c() : mStateMgr(*this) {}
|
||||
dAcOSave_c::~dAcOSave_c() {}
|
||||
|
||||
void dAcOSave_c::initializeState_Moss() {}
|
||||
|
||||
@@ -13,7 +13,7 @@ STATE_DEFINE(dAcOSwrdPrj, SWWaitCross);
|
||||
STATE_DEFINE(dAcOSwrdPrj, SWChkTri);
|
||||
STATE_DEFINE(dAcOSwrdPrj, SWEnd);
|
||||
|
||||
dAcOSwrdPrj::dAcOSwrdPrj() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOSwrdPrj::dAcOSwrdPrj() : mStateMgr(*this) {}
|
||||
dAcOSwrdPrj::~dAcOSwrdPrj() {}
|
||||
|
||||
void dAcOSwrdPrj::initializeState_WaitHarp() {}
|
||||
|
||||
@@ -4,7 +4,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_TRUCK_RAIL_COL, dAcOTruckRailCol_c, fProfile::OBJ_TRUC
|
||||
|
||||
STATE_DEFINE(dAcOTruckRailCol_c, Wait);
|
||||
|
||||
dAcOTruckRailCol_c::dAcOTruckRailCol_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dAcOTruckRailCol_c::dAcOTruckRailCol_c() : mStateMgr(*this) {}
|
||||
dAcOTruckRailCol_c::~dAcOTruckRailCol_c() {}
|
||||
|
||||
void dAcOTruckRailCol_c::initializeState_Wait() {}
|
||||
|
||||
@@ -86,7 +86,7 @@ int dAcOwarpHole_c::actorExecuteInEvent() {
|
||||
if (EventManager::isCurrentEvent("BeforeLastBossBattleChicken")) {
|
||||
dAcPy_c* player = dAcPy_c::GetLinkM();
|
||||
player->vt_0x2AC();
|
||||
player->triggerMoveEventMaybe(2, 0, 0, mLinkPos, 0, 0, 0);
|
||||
player->triggerMoveEventMaybe(2, 0, 0, &mLinkPos, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
if (dAcPy_c::GetLinkM()->mPosition.absXZTo(mLinkPos) < 10.0f) {
|
||||
|
||||
@@ -15,7 +15,7 @@ STATE_DEFINE(dLytSeekerStone_c, MovieFadeOut);
|
||||
STATE_DEFINE(dLytSeekerStone_c, MovieFadeIn);
|
||||
STATE_DEFINE(dLytSeekerStone_c, Out);
|
||||
|
||||
dLytSeekerStone_c::dLytSeekerStone_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dLytSeekerStone_c::dLytSeekerStone_c() : mStateMgr(*this) {}
|
||||
dLytSeekerStone_c::~dLytSeekerStone_c() {}
|
||||
|
||||
void dLytSeekerStone_c::initializeState_None() {}
|
||||
|
||||
@@ -415,7 +415,7 @@ void dScBoot_c::strap_c::init() {
|
||||
field_0x4F0 = 0;
|
||||
}
|
||||
|
||||
dScBoot_c::dScBoot_c() : mStateMgr(*this, sStateID::null), mPhases(this, sCallbacks), mpDvdCallback(nullptr) {
|
||||
dScBoot_c::dScBoot_c() : mStateMgr(*this), mPhases(this, sCallbacks), mpDvdCallback(nullptr) {
|
||||
mObjectDataLoaded = false;
|
||||
sInstance = this;
|
||||
mStrapScreenVisible = false;
|
||||
|
||||
@@ -9,7 +9,7 @@ STATE_DEFINE(dTitleMgr_c, Title);
|
||||
STATE_DEFINE(dTitleMgr_c, FileSelect);
|
||||
STATE_DEFINE(dTitleMgr_c, Input);
|
||||
|
||||
dTitleMgr_c::dTitleMgr_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dTitleMgr_c::dTitleMgr_c() : mStateMgr(*this) {}
|
||||
dTitleMgr_c::~dTitleMgr_c() {}
|
||||
|
||||
void dTitleMgr_c::initializeState_Init() {}
|
||||
|
||||
@@ -320,7 +320,7 @@ STATE_DEFINE(dAcItem_c, WaitTurnOff);
|
||||
STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect);
|
||||
|
||||
dAcItem_c::dAcItem_c()
|
||||
: mStateMgr(*this, sStateID::null),
|
||||
: mStateMgr(*this),
|
||||
mEff_0x8F4(this),
|
||||
mEff_0x928(this),
|
||||
mEff_0x95C(this),
|
||||
|
||||
@@ -144,7 +144,7 @@ SizedString<128> sNpcStr2;
|
||||
SizedString<128> sNpcStr3;
|
||||
SizedString<128> sNpcStr4;
|
||||
|
||||
dAcNpc_c::dAcNpc_c() : mFlow(this), mStateMgr(*this, sStateID::null), mActorListEntry(this) {}
|
||||
dAcNpc_c::dAcNpc_c() : mFlow(this), mStateMgr(*this), mActorListEntry(this) {}
|
||||
|
||||
dAcNpc_c::~dAcNpc_c() {
|
||||
// TODO
|
||||
|
||||
@@ -813,7 +813,7 @@ bool dAcTbox_c::isBelowGroundAtPos(f32 height, const mVec3_c &pos) {
|
||||
}
|
||||
|
||||
dAcTbox_c::dAcTbox_c()
|
||||
: mStateMgr(*this, sStateID::null),
|
||||
: mStateMgr(*this),
|
||||
mScnCallback(this),
|
||||
mEvent(*this, nullptr),
|
||||
mTboxListNode(this),
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -33,7 +33,7 @@ STATE_DEFINE(dStageMgr_c, SceneChangeSave);
|
||||
STATE_DEFINE(dStageMgr_c, RestartSceneWait);
|
||||
STATE_DEFINE(dStageMgr_c, RestartScene);
|
||||
|
||||
dStageMgr_c::dStageMgr_c() : mStateMgr(*this, sStateID::null), mPhase(this, sCallbacks) {
|
||||
dStageMgr_c::dStageMgr_c() : mStateMgr(*this), mPhase(this, sCallbacks) {
|
||||
sInstance = this;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ static const d2d::LytBrlanMapping brlanMap[] = {
|
||||
|
||||
#define NUM_ANIMS 9
|
||||
|
||||
dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this) {}
|
||||
|
||||
bool dLytCommonArrow_c::build() {
|
||||
void *data = LayoutArcManager::GetInstance()->getLoadedData("CommonArrow");
|
||||
|
||||
@@ -96,7 +96,7 @@ static const char *sPaneNames[] = {
|
||||
#define PAUSE_DISP_01_NUM_COMBINED_PANES (PAUSE_DISP_01_NUM_MY_PANES + PAUSE_DISP_01_NUM_SUBPANES)
|
||||
#define PAUSE_DISP_01_OFFSET_MY_PANES PAUSE_DISP_01_NUM_SUBPANES
|
||||
|
||||
dLytPauseDisp01_c::dLytPauseDisp01_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dLytPauseDisp01_c::dLytPauseDisp01_c() : mStateMgr(*this) {}
|
||||
|
||||
bool dLytPauseDisp01_c::build() {
|
||||
dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance();
|
||||
|
||||
@@ -13,7 +13,7 @@ STATE_DEFINE(dLytSaveMsgWindow_c, In);
|
||||
STATE_DEFINE(dLytSaveMsgWindow_c, Wait);
|
||||
STATE_DEFINE(dLytSaveMsgWindow_c, Out);
|
||||
|
||||
dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this, sStateID::null) {
|
||||
dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this) {
|
||||
resetProperties();
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ void dLytSkyGaugeMain_c::executeState_ModeOut() {
|
||||
}
|
||||
void dLytSkyGaugeMain_c::finalizeState_ModeOut() {}
|
||||
|
||||
dLytSkyGaugeMain_c::dLytSkyGaugeMain_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dLytSkyGaugeMain_c::dLytSkyGaugeMain_c() : mStateMgr(*this) {}
|
||||
|
||||
bool dLytSkyGaugeMain_c::build(d2d::ResAccIf_c *resAcc) {
|
||||
mLyt.setResAcc(resAcc);
|
||||
|
||||
@@ -49,7 +49,7 @@ void dLytWipeMain_c::executeState_ModeOut() {
|
||||
}
|
||||
void dLytWipeMain_c::finalizeState_ModeOut() {}
|
||||
|
||||
dLytWipeMain_c::dLytWipeMain_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dLytWipeMain_c::dLytWipeMain_c() : mStateMgr(*this) {}
|
||||
|
||||
static const d2d::LytBrlanMapping brlanMap[] = {
|
||||
{"wipe_00_inOut.brlan", "G_inOut_00"},
|
||||
|
||||
@@ -489,7 +489,7 @@ static const char *sWindowNames[] = {
|
||||
|
||||
static const char *sGroupName = "G_ref_00";
|
||||
|
||||
dLytMeterItemSelect_c::dLytMeterItemSelect_c() : mStateMgr(*this, sStateID::null) {
|
||||
dLytMeterItemSelect_c::dLytMeterItemSelect_c() : mStateMgr(*this) {
|
||||
field_0x574C = I_INVALID;
|
||||
field_0x5750 = I_INVALID;
|
||||
field_0x5754 = 0;
|
||||
|
||||
@@ -472,8 +472,7 @@ bool dSoundSource_c::startBgHitSound(
|
||||
return startBgHitSound(soundLabelToSoundId(label), polyAttr0, polyAttr1, position);
|
||||
}
|
||||
|
||||
// exact copy of startSoundAtPosition - used only for when the hookshot
|
||||
// hits the water level
|
||||
// exact copy of startSoundAtPosition
|
||||
bool dSoundSource_c::startSoundAtPosition2(u32 soundId, const nw4r::math::VEC3 *position) {
|
||||
if (!d_s_vt_0x1AC(soundId)) {
|
||||
return false;
|
||||
|
||||
@@ -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 = {
|
||||
{
|
||||
{AT_TYPE_DAMAGE, 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::enableAttack() {
|
||||
mCcs[0].OnAtSet();
|
||||
mIsActive = true;
|
||||
mFirstFramePassed = 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 (mIsActive) {
|
||||
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 (mFirstFramePassed && !mCcs[1].ChkAtSet()) {
|
||||
mCcs[1].OnAtSet();
|
||||
mCcs[2].OnAtSet();
|
||||
} else {
|
||||
mFirstFramePassed = true;
|
||||
}
|
||||
|
||||
mCcList.registerColliders();
|
||||
if (mass) {
|
||||
dCcS::GetInstance()->GetMassMng().SetObj(&mCcs[0], 2);
|
||||
}
|
||||
} else {
|
||||
mFirstFramePassed = 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()) 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