Merge pull request #278 from elijah-thomas774/free-percent-lol

Some Easy Actors
This commit is contained in:
Elijah Thomas
2025-11-28 18:26:49 -05:00
committed by GitHub
29 changed files with 1243 additions and 230 deletions
+1 -1
View File
@@ -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
View File
@@ -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() {}
+63
View File
@@ -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;
}
+388
View File
@@ -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;
}
+98 -25
View File
@@ -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 *) {}