mirror of
https://github.com/zeldaret/ss
synced 2026-08-11 03:26:06 -04:00
Merge pull request #278 from elijah-thomas774/free-percent-lol
Some Easy Actors
This commit is contained in:
@@ -84,7 +84,7 @@ void dTgBarrel_c::executeState_Wait() {
|
||||
mStateMgr.changeState(StateID_Stop);
|
||||
return;
|
||||
}
|
||||
dAcOstageSink_c *pStage = mStageRef.get();
|
||||
dAcObjBase_c *pStage = mStageRef.get();
|
||||
|
||||
mVec3_c pos = pStage->mPosition;
|
||||
mAng3_c rot = pStage->mRotation;
|
||||
|
||||
+261
-1
@@ -1,9 +1,269 @@
|
||||
#include "d/t/d_t_spore.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_camera.h"
|
||||
#include "d/d_light_env.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/t/d_t_siren.h"
|
||||
#include "egg/egg_types.h"
|
||||
#include "egg/gfx/eggDrawGX.h"
|
||||
#include "f/f_base.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_color.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "nw4r/g3d/g3d_scnobj.h"
|
||||
#include "rvl/GX/GXGeometry.h"
|
||||
#include "rvl/GX/GXTev.h"
|
||||
#include "rvl/GX/GXTransform.h"
|
||||
#include "rvl/GX/GXTypes.h"
|
||||
#include "rvl/MTX/mtxvec.h"
|
||||
#include "s/s_Math.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(SPORE_TAG, dSporeTag_c, fProfile::SPORE_TAG, 0xD, 0, 388);
|
||||
|
||||
STATE_DEFINE(dSporeTag_c, Wait);
|
||||
|
||||
bool dSporeTag_c::createHeap() {
|
||||
u32 size = 0;
|
||||
if (!mProc.create(&mAllocator, &size)) {
|
||||
return true;
|
||||
}
|
||||
mProc.mpTexture = static_cast<EGG::ResTIMG *>(dAcObjBase_c::getOarcFile("Common", "tex/WK2_Houshi.bti"));
|
||||
return true;
|
||||
}
|
||||
|
||||
int dSporeTag_c::create() {
|
||||
CREATE_ALLOCATOR(dSporeTag_c);
|
||||
|
||||
mProc.setPriorityDraw(0, 142);
|
||||
mProc.setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true);
|
||||
mStateMgr.changeState(StateID_Wait);
|
||||
mProc.field_0x39ED = true;
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dSporeTag_c::doDelete() {
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dSporeTag_c::actorExecuteInEvent() {
|
||||
mStateMgr.executeState();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dSporeTag_c::actorExecute() {
|
||||
mStateMgr.executeState();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dSporeTag_c::draw() {
|
||||
mProc.entry();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
void dSporeProc_c::execute() {
|
||||
// NONMATCHING
|
||||
// I dont feel like it
|
||||
mVec3_c _playerPos = dAcPy_c::GetLink()->mPosition;
|
||||
dLightEnv_c &env = dLightEnv_c::GetInstance();
|
||||
dCamera_c *pCam = dScGame_c::getCamera();
|
||||
|
||||
mVec3_c camPos;
|
||||
mVec3_c camTowards;
|
||||
|
||||
camPos = pCam->getPositionMaybe();
|
||||
camTowards = pCam->getField_0x78() - camPos;
|
||||
|
||||
if (pCam != nullptr && camTowards.normalizeRS()) {
|
||||
mVec3_c v;
|
||||
mVec3_c pos = camPos + camTowards * 1000.f;
|
||||
if (!field_0x39EC) {
|
||||
for (s32 i = 0; i < 400; ++i) {
|
||||
mSporesPos[i].x = pos.x + cM::rndFX(1100.f);
|
||||
mSporesPos[i].y = pos.y + cM::rndFX(1100.f);
|
||||
mSporesPos[i].z = pos.z + cM::rndFX(1100.f);
|
||||
|
||||
field_0x1F58[i] = 0.f;
|
||||
field_0x1918[i] = 1.f;
|
||||
|
||||
field_0x3218[i] = cM::rnd() * 65535.f;
|
||||
field_0x3538[i] = cM::rnd() * 65535.f;
|
||||
|
||||
field_0x3858[i] = 0;
|
||||
|
||||
field_0x2598[i] = cM::rndF(45.f) + 90.f;
|
||||
field_0x2BD8[i] = cM::rndF(360.f);
|
||||
|
||||
field_0x12D8[i] = cM::rndF(0.9f) + 0.1f;
|
||||
|
||||
field_0x3A02 += 200;
|
||||
field_0x3A04 += 50;
|
||||
field_0x3A06 += 400;
|
||||
}
|
||||
field_0x3A02 = 0;
|
||||
field_0x3A04 = 0;
|
||||
field_0x3A06 = 0;
|
||||
field_0x39EC = true;
|
||||
}
|
||||
|
||||
f32 f0 = 1050.f;
|
||||
f32 f1 = 13.f;
|
||||
f32 end = -1e9f;
|
||||
f32 f3 = 900.f;
|
||||
f32 f4 = 100.f;
|
||||
f32 f5 = 3.f;
|
||||
|
||||
for (s32 i = 0; i < 400; ++i) {
|
||||
mVec3_c playerPos = dAcPy_c::GetLink()->mPosition;
|
||||
mVec3_c point;
|
||||
env.sphere_to_cartesian(field_0x2598[i], field_0x2BD8[i], &point);
|
||||
|
||||
switch (field_0x3858[i]) {
|
||||
case 0: {
|
||||
field_0x3858[i] = 2;
|
||||
} break;
|
||||
case 1: {
|
||||
if (playerPos.distance(mSporesPos[i]) < 150.f || dTgSiren_c::isOutOfTime()) {
|
||||
field_0x3858[i]++;
|
||||
} else {
|
||||
mSporesPos[i].y += cM::rndF(30.f);
|
||||
}
|
||||
} break;
|
||||
case 2: {
|
||||
sLib::addCalc(&field_0x1918[i], 1.f, 0.5f, 0.1f, 0.001f);
|
||||
f32 sin = field_0x3218[i].sin();
|
||||
field_0x3218[i] += sin * 90.f + 10.f;
|
||||
|
||||
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
|
||||
if (dTgSiren_c::isOutOfTime()) {
|
||||
mSporesPos[i].y += field_0x12D8[i] * 16.f;
|
||||
field_0x2598[i] += sin * (field_0x12D8[i] - 0.5f) * 48.f;
|
||||
field_0x2BD8[i] += sin * (field_0x12D8[i] - 0.5f) * 48.f;
|
||||
mSporesPos[i] += point * ((field_0x12D8[i] * 0.5f) * 32.f + 0.5f);
|
||||
} else {
|
||||
mSporesPos[i].y += field_0x12D8[i] * 1.5f;
|
||||
field_0x2598[i] += sin * (field_0x12D8[i] - 0.5f) * 12.f;
|
||||
field_0x2BD8[i] += sin * (field_0x12D8[i] - 0.5f) * 12.f;
|
||||
mSporesPos[i] += point * (field_0x12D8[i] * 4.f);
|
||||
}
|
||||
} else {
|
||||
mSporesPos[i].y += field_0x12D8[i] * -0.5f;
|
||||
field_0x2598[i] += sin * (field_0x12D8[i] - 0.5f) * 14.f;
|
||||
field_0x2BD8[i] += sin * (field_0x12D8[i] - 0.5f) * f1;
|
||||
mSporesPos[i] += point * (field_0x12D8[i] * 5.f);
|
||||
}
|
||||
|
||||
f32 camY = pCam->getField_0x2A8();
|
||||
if (end != camY && mSporesPos[i].y < camY) {
|
||||
mSporesPos[i].y = camY;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
||||
v = mSporesPos[i];
|
||||
if (v.distance(pos) > 1050.f) {
|
||||
mSporesPos[i].x = pos.x + cM::rndFX(1100.f);
|
||||
mSporesPos[i].y = pos.y + cM::rndFX(1100.f);
|
||||
mSporesPos[i].z = pos.z + cM::rndFX(1100.f);
|
||||
} else if (v.distance(pos) > 1000.f) {
|
||||
mVec3_c out;
|
||||
env.get_vectle_calc(&v, &pos, &out);
|
||||
mSporesPos[i].x = pos.x + out.x * 1000.f;
|
||||
mSporesPos[i].y = pos.y + out.y * 1000.f;
|
||||
mSporesPos[i].z = pos.z + out.z * 1000.f;
|
||||
|
||||
if (!dTgSiren_c::isOutOfTime()) {
|
||||
field_0x3858[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
v = mSporesPos[i];
|
||||
f32 minDist = nw4r::ut::Min(v.distance(pos) / 1000.f, 1.f);
|
||||
|
||||
f32 sin = (1.f - minDist) * field_0x3538[i].sin();
|
||||
field_0x3538[i] += f4 + f3 * field_0x12D8[i];
|
||||
field_0x1F58[i] = sin;
|
||||
if (sin < 0.f) {
|
||||
field_0x1F58[i] = 0.f;
|
||||
}
|
||||
|
||||
field_0x1918[i] = f5 * v.distance(camPos) / 1000.f + 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dSporeProc_c::drawXlu() {
|
||||
using namespace EGG;
|
||||
|
||||
DrawGX::LoadTexture(mpTexture, GX_TEXMAP0);
|
||||
mColor color0(0x78, 0xB4, 0xFF, 1); // #78B4FF
|
||||
mColor color1(0x2D, 0x50, 0x41, 0xFF); // #2D5041FF
|
||||
|
||||
Matrix34f matrix(
|
||||
EGG::DrawGX::s_cameraMtx._00, EGG::DrawGX::s_cameraMtx._01, EGG::DrawGX::s_cameraMtx._02,
|
||||
EGG::DrawGX::s_cameraMtx._03, EGG::DrawGX::s_cameraMtx._10, EGG::DrawGX::s_cameraMtx._11,
|
||||
EGG::DrawGX::s_cameraMtx._12, EGG::DrawGX::s_cameraMtx._13, EGG::DrawGX::s_cameraMtx._20,
|
||||
EGG::DrawGX::s_cameraMtx._21, EGG::DrawGX::s_cameraMtx._22, EGG::DrawGX::s_cameraMtx._23
|
||||
);
|
||||
|
||||
dCamera_c *pCam = dScGame_c::getCamera();
|
||||
mVec3_c pos = pCam->getPositionMaybe();
|
||||
|
||||
if (dTgSiren_c::isOutOfTime()) {
|
||||
color0.r = 0xFF;
|
||||
color0.g = 0xDB;
|
||||
color0.b = 0xA5;
|
||||
}
|
||||
|
||||
GXSetCullMode(GX_CULL_NONE);
|
||||
GXSetClipMode(GX_CLIP_DISABLE);
|
||||
|
||||
f32 scaleMult = 12.f;
|
||||
|
||||
DrawGX::BeginDrawQuad(DrawGX::COLORCHAN_1, DrawGX::ZMODE_2, DrawGX::BLEND_3, true, false);
|
||||
GXSetTevColor(GX_TEVREG1, color1);
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
|
||||
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, 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_A0, GX_CA_TEXA, GX_CA_ZERO);
|
||||
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV);
|
||||
|
||||
GXColor c = EGG::DrawGX::WHITE;
|
||||
s16 zRot;
|
||||
s32 i;
|
||||
mVec3_c *sporePos = mSporesPos;
|
||||
for (i = 0, zRot = 0; i < 400; i++, zRot += 10) {
|
||||
mVec3_c b;
|
||||
mVec3_c a = mSporesPos[i];
|
||||
MTXMultVec(*matrix, a, b);
|
||||
|
||||
mMtx_c m;
|
||||
m.transS(b);
|
||||
|
||||
color0.a = field_0x1F58[i] * 255.f;
|
||||
if (color0.a != 0) {
|
||||
m.ZrotM(field_0x3A02 + zRot);
|
||||
|
||||
mMtx_c scale;
|
||||
f32 scaleX = field_0x1918[i] * scaleMult * field_0x1F58[i];
|
||||
scale.scaleS(scaleX, scaleX, 1.f);
|
||||
|
||||
m += scale;
|
||||
GXSetTevColor(GX_TEVREG0, color0);
|
||||
DrawGX::DrawDL(EGG::DrawGX::DL_13, m, c);
|
||||
}
|
||||
}
|
||||
|
||||
GXSetClipMode(GX_CLIP_ENABLE);
|
||||
}
|
||||
|
||||
void dSporeTag_c::initializeState_Wait() {}
|
||||
void dSporeTag_c::executeState_Wait() {}
|
||||
void dSporeTag_c::executeState_Wait() {
|
||||
mProc.execute();
|
||||
}
|
||||
void dSporeTag_c::finalizeState_Wait() {}
|
||||
|
||||
@@ -1,3 +1,66 @@
|
||||
#include "d/t/d_t_stream.h"
|
||||
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_list_mg.h"
|
||||
#include "toBeSorted/area_math.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(TAG_STREAM, dTgStream_c, fProfile::TAG_STREAM, 0x29D, 0, 0);
|
||||
|
||||
void dTgStream_c::addToList(fLiMgBa_c &list) {
|
||||
// Upcasting for simplicity of the mOrder check.
|
||||
dAcRef_c<dTgStream_c> *pIt = static_cast<dAcRef_c<dTgStream_c> *>(list.getFirst());
|
||||
if (pIt != nullptr) {
|
||||
while (pIt != nullptr) {
|
||||
if (pIt->get()->mOrder <= mOrder) {
|
||||
pIt = pIt->getNext();
|
||||
continue;
|
||||
}
|
||||
|
||||
list.insertAfter(&mStreamNode, pIt->getPrev());
|
||||
return;
|
||||
}
|
||||
list.append(&mStreamNode);
|
||||
}
|
||||
|
||||
else {
|
||||
list.append(&mStreamNode);
|
||||
}
|
||||
}
|
||||
|
||||
int dTgStream_c::create() {
|
||||
mSceneflag = getFromParams(0, 0xFF);
|
||||
mAreaIdx = getFromParams(8, 0xFF);
|
||||
mSpeed = getFromParams(16, 0xFF);
|
||||
if (mSpeed == 0xFF) {
|
||||
mSpeed = 0;
|
||||
}
|
||||
|
||||
mOrder = getFromParams(28, 0xFF);
|
||||
mIsSand = getFromParams(24, 0xF);
|
||||
field_0x101 = (mRotation.z & 0x3) == 1;
|
||||
mRotation.z = 0;
|
||||
|
||||
if (mIsSand == 1) {
|
||||
addToList(sSandStreamList);
|
||||
} else {
|
||||
addToList(sStreamList);
|
||||
}
|
||||
|
||||
matrixCreateFromPosRotYScale(mArea, mPosition, mRotation.y, mScale, nullptr, 0.f);
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dTgStream_c::doDelete() {
|
||||
if (mIsSand == 1) {
|
||||
sSandStreamList.remove(&mStreamNode);
|
||||
} else {
|
||||
sStreamList.remove(&mStreamNode);
|
||||
}
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dTgStream_c::actorExecute() {
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,391 @@
|
||||
#include "d/t/d_t_sword_battle_game.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/flag/storyflag_manager.h"
|
||||
#include "d/lyt/d_lyt_mini_game.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "sized_string.h"
|
||||
#include "toBeSorted/event.h"
|
||||
#include "toBeSorted/event_manager.h"
|
||||
#include "toBeSorted/minigame_mgr.h"
|
||||
|
||||
const char *sGameEvents[] = {"StartSwordBattleGame", "EndSwordBattleGame", "EndSwordBattleGame2"};
|
||||
const char *sEndEventNames[] = {
|
||||
"dAcBvd_c_DeadDEMO", "MG_end", "AsuraDeadB", "BKR_end", "BBossEvac", "BBoss2Evac", "BBoss3Evac", "BLS_end",
|
||||
};
|
||||
|
||||
STATE_VIRTUAL_DEFINE(dTgSwordBattleGame_c, Wait);
|
||||
STATE_VIRTUAL_DEFINE(dTgSwordBattleGame_c, Manage);
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(TAG_SWORD_BATTLE_GAME, dTgSwordBattleGame_c, fProfile::TAG_SWORD_BATTLE_GAME, 0x6F, 0, 4);
|
||||
|
||||
int dTgSwordBattleGame_c::create() {
|
||||
if (!checkInBossRushFlag() && !MinigameManager::GetInstance()->checkInBossRush()) {
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
init();
|
||||
mStateMgr.changeState(StateID_Wait);
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dTgSwordBattleGame_c::doDelete() {
|
||||
fBase_c::doDelete();
|
||||
mTimer.vt_0x10();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dTgSwordBattleGame_c::actorExecute() {
|
||||
if (EventManager::isInEvent()) {
|
||||
static const char *l_currentEvent = EventManager::getCurrentEventName();
|
||||
|
||||
if (strequals(l_currentEvent, sEndEventNames[0]) || strequals(l_currentEvent, sEndEventNames[1]) ||
|
||||
strequals(l_currentEvent, sEndEventNames[2]) || strequals(l_currentEvent, sEndEventNames[3]) ||
|
||||
strequals(l_currentEvent, sEndEventNames[4]) || strequals(l_currentEvent, sEndEventNames[5]) ||
|
||||
strequals(l_currentEvent, sEndEventNames[6]) || strequals(l_currentEvent, sEndEventNames[7])) {
|
||||
field_0x1AB = true;
|
||||
}
|
||||
}
|
||||
mStateMgr.executeState();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dTgSwordBattleGame_c::actorExecuteInEvent() {
|
||||
bool advance = mEventRelated.isAdvance();
|
||||
|
||||
int ret = NOT_READY;
|
||||
switch (mEventRelated.getCurrentEventCommand()) {
|
||||
case 'none': {
|
||||
mEventRelated.advanceNext();
|
||||
ret = SUCCEEDED;
|
||||
} break;
|
||||
case 'gini': {
|
||||
mEventRelated.advanceNext();
|
||||
ret = SUCCEEDED;
|
||||
} break;
|
||||
case 'cndn': {
|
||||
if (advance) {
|
||||
dLytMiniGame_c::GetInstance()->fn_80295940();
|
||||
|
||||
} else if (dLytMiniGame_c::GetInstance()->fn_80295AB0()) {
|
||||
dLytMiniGame_c::GetInstance()->timeRelatedExecute();
|
||||
dLytMiniGame_c::GetInstance()->setHighscore(getBossHighscore());
|
||||
dLytMiniGame_c::GetInstance()->fn_80295CB0(true);
|
||||
mTimer.initUpCounter();
|
||||
field_0x1A8 = true;
|
||||
field_0x1AC = true;
|
||||
mEventRelated.advanceNext();
|
||||
}
|
||||
ret = SUCCEEDED;
|
||||
} break;
|
||||
case 'fnsh': {
|
||||
if (advance) {
|
||||
dLytMiniGame_c::GetInstance()->fn_80295980();
|
||||
} else if (dLytMiniGame_c::GetInstance()->fn_80295AD0()) {
|
||||
mEventRelated.advanceNext();
|
||||
}
|
||||
ret = SUCCEEDED;
|
||||
} break;
|
||||
case 'gend': {
|
||||
if (advance) {
|
||||
dScGame_c::GetInstance()->triggerExit(mRoomID, getFromParams(0, 0xFF));
|
||||
}
|
||||
ret = SUCCEEDED;
|
||||
} break;
|
||||
default: {
|
||||
if (dAcPy_c::GetLink()->checkFlags0x340(0x200) && !field_0x1AD &&
|
||||
MinigameManager::endMinigame(MinigameManager::BOSS_RUSH)) {
|
||||
field_0x1AD = true;
|
||||
unsetInBossRushFlag();
|
||||
unsetEarlyFightFlags();
|
||||
unsetImprisonedFightFlags();
|
||||
unsetDemiseFightFlag();
|
||||
setCurrentBossNumber(0);
|
||||
}
|
||||
|
||||
if (!field_0x1AE && field_0x1A9 && !field_0x1AA) {
|
||||
field_0x1AE = true;
|
||||
saveCurrentTime(getCurrentTime());
|
||||
setInBossRushFlag();
|
||||
setCurrentBossNumber(mBossNumber + 1);
|
||||
if (MinigameManager::endMinigame(MinigameManager::BOSS_RUSH)) {
|
||||
dLytMiniGame_c::GetInstance()->fn_80295980();
|
||||
dLytMiniGame_c::GetInstance()->timeRelated();
|
||||
}
|
||||
}
|
||||
} break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dTgSwordBattleGame_c::draw() {
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::initializeState_Wait() {}
|
||||
void dTgSwordBattleGame_c::executeState_Wait() {
|
||||
if (MinigameManager::GetInstance()->checkInBossRush()) {
|
||||
if (field_0x1A8) {
|
||||
mStateMgr.changeState(StateID_Manage);
|
||||
} else {
|
||||
checkInEvent(sGameEvents[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void dTgSwordBattleGame_c::finalizeState_Wait() {}
|
||||
|
||||
void dTgSwordBattleGame_c::initializeState_Manage() {}
|
||||
void dTgSwordBattleGame_c::executeState_Manage() {
|
||||
if (!field_0x1A9) {
|
||||
mTimer.vt_0x14();
|
||||
}
|
||||
|
||||
s32 time = getCurrentTime();
|
||||
dLytMiniGame_c::GetInstance()->setDisplayedTime(time);
|
||||
|
||||
if (!field_0x1AE && field_0x1A9 && field_0x1AA) {
|
||||
saveCurrentTime(time);
|
||||
setInBossRushFlag();
|
||||
setCurrentBossNumber(mBossNumber + 1);
|
||||
if (MinigameManager::endMinigame(MinigameManager::BOSS_RUSH) && checkInEvent(sGameEvents[1])) {
|
||||
field_0x1AE = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (field_0x1AB && checkInEvent(sGameEvents[2])) {
|
||||
field_0x1AB = false;
|
||||
}
|
||||
}
|
||||
void dTgSwordBattleGame_c::finalizeState_Manage() {}
|
||||
|
||||
void dTgSwordBattleGame_c::init() {
|
||||
if (MinigameManager::GetInstance()->checkInBossRush()) {
|
||||
createBase(fProfile::LYT_MINI_GAME, this, 8, OTHER);
|
||||
}
|
||||
mTimer.vt_0x0C();
|
||||
|
||||
field_0x1A8 = false;
|
||||
field_0x1A9 = false;
|
||||
field_0x1AA = false;
|
||||
field_0x1AB = false;
|
||||
field_0x1AC = false;
|
||||
field_0x1AD = false;
|
||||
field_0x1AE = false;
|
||||
|
||||
mBossNumber = getCurrentBossNumber();
|
||||
}
|
||||
|
||||
bool dTgSwordBattleGame_c::checkInEvent(const char *eventName) {
|
||||
if (EventManager::isInEvent() && strequals(EventManager::getCurrentEventName(), eventName)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (EventManager::isInEvent0Or7()) {
|
||||
static volatile u32 FLAGS_1 = 0x00000001;
|
||||
static u32 FLAGS_2 = 0x00100001;
|
||||
u32 f1 = FLAGS_1;
|
||||
u32 f2 = FLAGS_2;
|
||||
u32 eventFlag = f2 & ~f1;
|
||||
Event event = Event(eventName, 100, eventFlag, nullptr, nullptr);
|
||||
EventManager::alsoSetAsCurrentEvent(this, &event, nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getCurrentTime() const {
|
||||
s32 time = mTimer.getTime();
|
||||
if (time > TIME_CONVERT(59, 59, 99)) {
|
||||
time = TIME_CONVERT(59, 59, 99);
|
||||
}
|
||||
return time;
|
||||
}
|
||||
|
||||
bool dTgSwordBattleGame_c::checkInBossRushFlag() {
|
||||
return StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_BOSS_RUSH_ACTIVE);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::unsetInBossRushFlag() {
|
||||
StoryflagManager::sInstance->unsetFlag(STORYFLAG_BOSS_RUSH_ACTIVE);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::unsetEarlyFightFlags() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
|
||||
// Not naming these flags due to the weirdness...
|
||||
pMgr->unsetFlag(STORYFLAG_351);
|
||||
pMgr->unsetFlag(STORYFLAG_352);
|
||||
pMgr->unsetFlag(STORYFLAG_353);
|
||||
pMgr->unsetFlag(STORYFLAG_354);
|
||||
pMgr->unsetFlag(STORYFLAG_355);
|
||||
pMgr->unsetFlag(STORYFLAG_356);
|
||||
pMgr->unsetFlag(STORYFLAG_357);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::unsetImprisonedFightFlags() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
|
||||
pMgr->unsetFlag(STORYFLAG_IMPRISONED1_BOSSRUSH);
|
||||
pMgr->unsetFlag(STORYFLAG_IMPRISONED2_BOSSRUSH);
|
||||
pMgr->unsetFlag(STORYFLAG_IMPRISONED3_BOSSRUSH);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::unsetDemiseFightFlag() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
|
||||
pMgr->unsetFlag(STORYFLAG_DEMISE_BOSSRUSH);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::setInBossRushFlag() {
|
||||
StoryflagManager::sInstance->setFlag(STORYFLAG_BOSSRUSH_ACTIVE);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::saveCurrentTime(s32 time) const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
pMgr->setFlagOrCounterToValue(STORYFLAG_BOSSRUSH_CURRENT_MIN, (time / 1000) / 60);
|
||||
pMgr->setFlagOrCounterToValue(STORYFLAG_BOSSRUSH_CURRENT_SEC, (time / 1000) % 60);
|
||||
pMgr->setFlagOrCounterToValue(STORYFLAG_BOSSRUSH_CURRENT_MS, (time % 1000) / 10);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getBossHighscore() const {
|
||||
s32 time;
|
||||
switch (getBossIdx()) {
|
||||
case 0: time = getGhirahim1Highscore(); break;
|
||||
case 1: time = getScalderaHighscore(); break;
|
||||
case 2: time = getMolderachHighscore(); break;
|
||||
case 4: time = getKoloktosHighscore(); break;
|
||||
case 5: time = getTentalusHighscore(); break;
|
||||
case 6: time = getGhirahim2Highscore(); break;
|
||||
case 3: time = getImprisoned1Highscore(); break;
|
||||
case 7: time = getImprisoned2Highscore(); break;
|
||||
case 8: time = getImprisoned3Highscore(); break;
|
||||
case 9: time = getHordeHighscore(); break;
|
||||
case 10: time = getGhirahim3Highscore(); break;
|
||||
case 11: time = getDemiseHighscore(); break;
|
||||
}
|
||||
|
||||
if (time > TIME_CONVERT(59, 59, 99)) {
|
||||
time = TIME_CONVERT(59, 59, 99);
|
||||
}
|
||||
return time;
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getGhirahim1Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM1_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM1_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM1_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getScalderaHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_SCALDERA_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_SCALDERA_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_SCALDERA_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getMolderachHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_MOLDERACH_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_MOLDERACH_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_MOLDERACH_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getKoloktosHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_KOLOKTOS_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_KOLOKTOS_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_KOLOKTOS_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getTentalusHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_TENTALUS_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_TENTALUS_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_TENTALUS_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getGhirahim2Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM2_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM2_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM2_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getImprisoned1Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_IMP1_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_IMP1_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_IMP1_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getImprisoned2Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_IMP2_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_IMP2_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_IMP2_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getImprisoned3Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_IMP3_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_IMP3_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_IMP3_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getHordeHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_HORDE_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_HORDE_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_HORDE_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getGhirahim3Highscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM3_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM3_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_GHIRAHIM3_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getDemiseHighscore() const {
|
||||
StoryflagManager *pMgr = StoryflagManager::sInstance;
|
||||
u16 min = pMgr->getCounterOrFlag(STORYFLAG_DEMISE_TIME_MIN);
|
||||
u16 sec = pMgr->getCounterOrFlag(STORYFLAG_DEMISE_TIME_SEC);
|
||||
u16 msec = pMgr->getCounterOrFlag(STORYFLAG_DEMISE_TIME_MS);
|
||||
return TIME_CONVERT(min, sec, msec);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getBossIdx() const {
|
||||
return StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_563);
|
||||
}
|
||||
|
||||
s32 dTgSwordBattleGame_c::getCurrentBossNumber() const {
|
||||
return StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_654);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::setCurrentBossNumber(s32 num) {
|
||||
StoryflagManager::sInstance->setFlagOrCounterToValue(STORYFLAG_654, num);
|
||||
}
|
||||
|
||||
void dTgSwordBattleGame_c::notifyBossDeath(bool ghirahim_related) {
|
||||
field_0x1A9 = true;
|
||||
field_0x1AA = ghirahim_related;
|
||||
dLytMiniGame_c::GetInstance()->setComplete();
|
||||
}
|
||||
|
||||
bool dTgSwordBattleGame_c::checkFightStarted() const {
|
||||
return field_0x1AC;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#include "d/t/d_t_tumble_weed.h"
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "common.h"
|
||||
#include "d/a/obj/d_a_obj_tumble_weed.h"
|
||||
#include "d/col/bg/d_bg_s_gnd_chk.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "s/s_Math.h"
|
||||
#include "toBeSorted/event_manager.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(TUMBLE_WEED_TAG, dTgTumbleWeed_c, fProfile::TUMBLE_WEED_TAG, 0x0244, 0, 0);
|
||||
|
||||
@@ -9,9 +16,13 @@ STATE_DEFINE(dTgTumbleWeed_c, AreaOut);
|
||||
STATE_DEFINE(dTgTumbleWeed_c, AreaIn);
|
||||
STATE_DEFINE(dTgTumbleWeed_c, Wind);
|
||||
|
||||
void rodata_floats() {
|
||||
const f32 arr[] = {0.f, 0.8f, 20.f, 20.f, 5.f, 0.5f, 7.f};
|
||||
}
|
||||
|
||||
int dTgTumbleWeed_c::create() {
|
||||
tumbleweedTimer = 0;
|
||||
windTimer = 0x96;
|
||||
mSpawnTimer = 0;
|
||||
mWindTimer = 150;
|
||||
mStateMgr.changeState(StateID_AreaOut);
|
||||
return SUCCEEDED;
|
||||
}
|
||||
@@ -22,7 +33,7 @@ int dTgTumbleWeed_c::doDelete() {
|
||||
|
||||
int dTgTumbleWeed_c::actorExecute() {
|
||||
mStateMgr.executeState();
|
||||
sLib::calcTimer(&tumbleweedTimer);
|
||||
sLib::calcTimer(&mSpawnTimer);
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
@@ -32,8 +43,8 @@ int dTgTumbleWeed_c::draw() {
|
||||
|
||||
void dTgTumbleWeed_c::initializeState_AreaOut() {}
|
||||
void dTgTumbleWeed_c::executeState_AreaOut() {
|
||||
if (sLib::calcTimer(&windTimer) == 0) {
|
||||
windTimer = 0x96;
|
||||
if (sLib::calcTimer(&mWindTimer) == 0) {
|
||||
mWindTimer = 150;
|
||||
if (shouldDoWind()) {
|
||||
mStateMgr.changeState(StateID_Wind);
|
||||
return;
|
||||
@@ -47,14 +58,14 @@ void dTgTumbleWeed_c::finalizeState_AreaOut() {}
|
||||
|
||||
void dTgTumbleWeed_c::initializeState_AreaIn() {}
|
||||
void dTgTumbleWeed_c::executeState_AreaIn() {
|
||||
if (tumbleweedTimer == 0) {
|
||||
if (mSpawnTimer == 0) {
|
||||
if (shouldSpawnTumbleweed()) {
|
||||
doSpawnTumbleweed();
|
||||
}
|
||||
tumbleweedTimer = 600;
|
||||
mSpawnTimer = 600;
|
||||
}
|
||||
if (sLib::calcTimer(&windTimer) == 0) {
|
||||
windTimer = 0x96;
|
||||
if (sLib::calcTimer(&mWindTimer) == 0) {
|
||||
mWindTimer = 150;
|
||||
if (shouldDoWind()) {
|
||||
mStateMgr.changeState(StateID_Wind);
|
||||
return;
|
||||
@@ -68,9 +79,9 @@ void dTgTumbleWeed_c::finalizeState_AreaIn() {}
|
||||
|
||||
void dTgTumbleWeed_c::initializeState_Wind() {
|
||||
mVec3_c vec;
|
||||
getWind(&vec);
|
||||
if (childTumbleweed.get() != nullptr) {
|
||||
childTumbleweed.get()->setWind(vec);
|
||||
getWind(vec);
|
||||
if (mSpawnedTumbleWeed.isLinked()) {
|
||||
mSpawnedTumbleWeed.get()->setWind(vec);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,20 +95,82 @@ void dTgTumbleWeed_c::executeState_Wind() {
|
||||
void dTgTumbleWeed_c::finalizeState_Wind() {}
|
||||
|
||||
bool dTgTumbleWeed_c::shouldSpawnTumbleweed() {
|
||||
bool spawnAllowed = false;
|
||||
if (childTumbleweed.get() == nullptr && cM::rnd() <= 0.8f) {
|
||||
spawnAllowed = true;
|
||||
}
|
||||
|
||||
if (spawnAllowed) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return !mSpawnedTumbleWeed.isLinked() && cM::rnd() <= 0.8f && !EventManager::isInEvent();
|
||||
}
|
||||
|
||||
bool dTgTumbleWeed_c::shouldDoWind() {
|
||||
return childTumbleweed.get() != nullptr && cM::rnd() <= 0.5f;
|
||||
return mSpawnedTumbleWeed.isLinked() && cM::rnd() <= 0.5f;
|
||||
}
|
||||
|
||||
void dTgTumbleWeed_c::doSpawnTumbleweed() {
|
||||
mVec3_c pos = mVec3_c::Ez;
|
||||
|
||||
dCamera_c *pCam = dScGame_c::getCamera(0);
|
||||
if (pCam != nullptr) {
|
||||
mAng angle = pCam->getYRot();
|
||||
|
||||
f32 change;
|
||||
if (cM::rnd() < 0.5f) {
|
||||
change = cM::rndFX(5.f) * 182.f + 10923.f;
|
||||
} else {
|
||||
change = cM::rndFX(5.f) * 182.f + -10923.f;
|
||||
}
|
||||
angle += change;
|
||||
pos.rotY(angle);
|
||||
|
||||
pos *= 600.f;
|
||||
pos += pCam->getPositionMaybe();
|
||||
|
||||
if (dBgS_ObjGndChk::CheckPos(pos + mVec3_c::Ey * 100.f)) {
|
||||
pos.y = dBgS_ObjGndChk::GetGroundHeight() + 10.f;
|
||||
}
|
||||
}
|
||||
|
||||
dAcOTumbleWeed_c *pTumble = static_cast<dAcOTumbleWeed_c *>(
|
||||
dAcObjBase_c::create(fProfile::OBJ_TUMBLE_WEED, mRoomID, 0, &pos, nullptr, nullptr, 0xFFFFFFFF)
|
||||
);
|
||||
if (pTumble == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
mSpawnedTumbleWeed.link(pTumble);
|
||||
if (pCam != nullptr) {
|
||||
mAng rot = mAng::fromVec(mPosition - pos);
|
||||
|
||||
f32 change;
|
||||
if (cM::rnd() < 0.5f) {
|
||||
change = cM::rndFX(5.f) * 182.f;
|
||||
} else {
|
||||
change = cM::rndFX(5.f) * -182.f;
|
||||
}
|
||||
rot += change;
|
||||
|
||||
pTumble->mAngle.y = rot;
|
||||
pTumble->mSpeed = cM::rndFX(1.f) + 20.f;
|
||||
pTumble->mVelocity.y = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
void dTgTumbleWeed_c::getWind(mVec3_c &pWind) {
|
||||
mVec3_c wind = mVec3_c::Ez;
|
||||
|
||||
// @bug dir may not be initialized
|
||||
mAng dir;
|
||||
|
||||
if (mSpawnedTumbleWeed.isLinked()) {
|
||||
dir = mSpawnedTumbleWeed.get()->getAngle().y;
|
||||
}
|
||||
|
||||
f32 change;
|
||||
if (cM::rnd() < 0.5f) {
|
||||
change = cM::rndFX(15.f) * 182.f + 8192.f;
|
||||
} else {
|
||||
change = cM::rndFX(15.f) * 182.f + -8192.f;
|
||||
}
|
||||
|
||||
dir += change;
|
||||
wind.rotY(dir);
|
||||
wind *= cM::rndFX(3.f) + 7.f;
|
||||
|
||||
pWind = wind;
|
||||
}
|
||||
void dTgTumbleWeed_c::doSpawnTumbleweed() {}
|
||||
void dTgTumbleWeed_c::getWind(mVec3_c *) {}
|
||||
|
||||
Reference in New Issue
Block a user