From e4619a9791545ae25b5ef211cb5800cb08d4ca88 Mon Sep 17 00:00:00 2001 From: loserkidsblink <136970488+loserkidsblink@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:54:08 -0400 Subject: [PATCH] Match stEmblem scene effects and SE fade --- include/st_emblem/st_emblem.h | 2 +- src/mo_stage/st_emblem/st_emblem.cpp | 125 ++++++++++----------------- 2 files changed, 47 insertions(+), 80 deletions(-) diff --git a/include/st_emblem/st_emblem.h b/include/st_emblem/st_emblem.h index bcb3370f47..e7f0532aa6 100644 --- a/include/st_emblem/st_emblem.h +++ b/include/st_emblem/st_emblem.h @@ -49,7 +49,7 @@ class stEmblem : public stMelee { grCollision* unk738; u8 m_isKemuriHigh; float m_lampEffTimer; - u32 unk744; + s32 m_lampEffectIndex; s32 quakeSnd; u8 m_eventType; StSeUtil::SeSeqInstance<2, 2> m_se_player; diff --git a/src/mo_stage/st_emblem/st_emblem.cpp b/src/mo_stage/st_emblem/st_emblem.cpp index 9b926a399e..f81bc50c64 100644 --- a/src/mo_stage/st_emblem/st_emblem.cpp +++ b/src/mo_stage/st_emblem/st_emblem.cpp @@ -50,7 +50,7 @@ stEmblem::stEmblem() : stMelee("stEmblem", Stages::Emblem) { unk738 = NULL; m_isKemuriHigh = 1; m_lampEffTimer = 0.0; - unk744 = 0; + m_lampEffectIndex = 0; quakeSnd = -1; m_eventType = 0; unk800 = 0; @@ -532,6 +532,10 @@ void stEmblem::updateScene(float deltaFrame) { } } +static inline float randomFloat(float range) { + return range * randf(); +} + void stEmblem::updateScene00(float deltaFrame) { switch (m_curr_scene_effect.getPhase()) { case 0: @@ -567,10 +571,9 @@ void stEmblem::updateScene00(float deltaFrame) { rand = 4; } unkSnd728 = playSeBasic((SndID)(rand + snd_se_stage_Emblem_touseki_01),unk720); - float fVar1 = (randf()*100.0f); - float fVar2 = 50.0f - fVar1; - unk724 = 0.0; - unk71C = fVar2 + 130.0f; + float offset = 50.0f - 100.0f * randf(); + unk71C = 130.0f + offset; + unk724 = 0.0f; } unk720+=0.05f; if (unk720 >= 0.0f) { @@ -587,25 +590,11 @@ void stEmblem::updateScene00(float deltaFrame) { } } -char* const effectStrings[10] = { - "eff01", - "eff02", - "eff03", - "eff04", - "eff05", - "eff06", - "eff07", - "eff08", - "eff09", - "eff10" -}; - -const int statueGrounds[2] = { - 1,3 -}; - void stEmblem::updateScene01(float deltaFrame) { - char* effectNames[10]; + Vec3f groundPos; + Vec3f pos; + Vec3f quake; + float fVar1 = unk808 - deltaFrame; unk808 = fVar1; if (fVar1 < 0.0f) { @@ -617,21 +606,14 @@ void stEmblem::updateScene01(float deltaFrame) { m_effects[i] = -1; } m_lampEffTimer = 0.0; - unk744 = 0; + m_lampEffectIndex = 0; m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); break; case 1: - //effectNames = &effectStrings[1]; - effectNames[0] = effectStrings[0]; - effectNames[1] = effectStrings[1]; - effectNames[2] = effectStrings[2]; - effectNames[3] = effectStrings[3]; - effectNames[4] = effectStrings[4]; - effectNames[5] = effectStrings[5]; - effectNames[6] = effectStrings[6]; - effectNames[7] = effectStrings[7]; - effectNames[8] = effectStrings[8]; - effectNames[9] = effectStrings[9]; + const char* effectNames[10] = { + "eff01", "eff02", "eff03", "eff04", "eff05", + "eff06", "eff07", "eff08", "eff09", "eff10" + }; if (m_lampEffTimer >= 10.0f) { u32 rand = randi(3); if (rand >= 2) { @@ -640,59 +622,50 @@ void stEmblem::updateScene01(float deltaFrame) { switch(rand) { default: case 0: - m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); + m_effects[m_lampEffectIndex] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); break; case 1: - m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); + m_effects[m_lampEffectIndex] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); break; case 2: - //case 3: - m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); + m_effects[m_lampEffectIndex] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); break; } rand = randi(3); if (rand >= 2) { rand = 2; } - // TODO: load from 0x68c[unk744+5] 0x6A0[unk744] switch(rand) { default: case 0: - m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); + m_effects[static_cast(m_lampEffectIndex + 5)] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); break; case 1: - m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); + m_effects[static_cast(m_lampEffectIndex + 5)] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); break; case 2: - m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); + m_effects[static_cast(m_lampEffectIndex + 5)] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); break; } - g_ecMgr->setParent(m_effects[unk744],m_scene_grounds[0]->m_sceneModels[0],effectNames[unk744],0); - //u32 temp1 = unk744 + 5; - g_ecMgr->setParent(m_effects[unk744],m_scene_grounds[0]->m_sceneModels[0],effectNames[unk744+5],0); - int iVar1 = unk744 + 1; - unk744 = iVar1; - if (iVar1 >= 5) { + g_ecMgr->setParent(m_effects[m_lampEffectIndex],m_scene_grounds[0]->m_sceneModels[0],effectNames[m_lampEffectIndex],0); + g_ecMgr->setParent(m_effects[static_cast(m_lampEffectIndex + 5)],m_scene_grounds[0]->m_sceneModels[0],effectNames[static_cast(m_lampEffectIndex + 5)],0); + m_lampEffectIndex++; + if (m_lampEffectIndex >= 5) { m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); } m_lampEffTimer = 0.0f; } else { m_lampEffTimer += deltaFrame; } - //m_lampEffTimer = 0.0; - //unk744 = 0; break; default: break; } - int locald8[2]; - locald8[0] = statueGrounds[0]; - locald8[1] = statueGrounds[1]; - //int iVar2 = 0 + int statueGrounds[2] = {1, 3}; for (int i = 0; i < 2; i++) { switch(unk704[i]) { case 0: - if (m_scene_grounds[locald8[i]]->isHit()) { + if (m_scene_grounds[statueGrounds[i]]->isHit()) { if (unk808 == 0.0f) { if (i == 0) { m_effects[12] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zou_damage_l); @@ -703,8 +676,7 @@ void stEmblem::updateScene01(float deltaFrame) { } unk808 = 10.0f + (5.0f*randf()); } - //m_scene_grounds[locald8[i]] - int damage = m_scene_grounds[locald8[i]]->getLastDamageTaken(); + int damage = m_scene_grounds[statueGrounds[i]]->getLastDamageTaken(); int iVar = unk6fc[i] -= damage; unk6fc[i] = iVar; if (iVar < 0) { @@ -712,9 +684,9 @@ void stEmblem::updateScene01(float deltaFrame) { } if (unk6fc[i] == 0) { - m_scene_grounds[locald8[i]]->endEntity(); + m_scene_grounds[statueGrounds[i]]->endEntity(); getGround(i+11)->setEnableCollisionStatus(false); - m_scene_grounds[locald8[i]+1]->startEntity(); + m_scene_grounds[statueGrounds[i]+1]->startEntity(); unk704[i]++; eventArray[i].end(); if (i == 0) { @@ -724,7 +696,6 @@ void stEmblem::updateScene01(float deltaFrame) { m_effects[10] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zoucrash_r); g_ecMgr->setParent(m_effects[10],m_scene_grounds[0]->m_sceneModels[0],"StgEmblem01ZouBClash",0); } - Vec3f quake;// = Vec3f(0.0,0.0,0.0); quake.m_x = 0.0f; quake.m_y = 0.0f; quake.m_z = 0.0f; @@ -738,31 +709,28 @@ void stEmblem::updateScene01(float deltaFrame) { case 1: if (i == 0) { //m_se_player.playFrame(m_scene_grounds[0]->getEntityFrame,0); - m_se_player.playFrame(0, m_scene_grounds[locald8[i]+1]->getEntityFrame()); + m_se_player.playFrame(0, m_scene_grounds[statueGrounds[i]+1]->getEntityFrame()); } else { - m_se_player2.playFrame(0, m_scene_grounds[locald8[i]+1]->getEntityFrame()); + m_se_player2.playFrame(0, m_scene_grounds[statueGrounds[i]+1]->getEntityFrame()); } - if(m_scene_grounds[locald8[i]+1]->isEndEntity() == true) { - m_scene_grounds[locald8[i]+1]->endEntity(); + if(m_scene_grounds[statueGrounds[i]+1]->isEndEntity() == true) { + m_scene_grounds[statueGrounds[i]+1]->endEntity(); unk704[i]++; } } if (eventArray[i].isEvent()) { - Vec3f groundPos; - float one = 1.0f; - float fVar1 = (one*randf()); + float fVar1 = randomFloat(1.0f); groundPos.m_x = (0.5f-fVar1); - fVar1 = (one*randf()); + fVar1 = randomFloat(1.0f); groundPos.m_y = (0.5f-fVar1); - fVar1 = (one*randf()); + fVar1 = randomFloat(1.0f); groundPos.m_z = (0.5f-fVar1); - m_scene_grounds[locald8[i+1]]->setPos(&groundPos); + m_scene_grounds[statueGrounds[i]]->setPos(&groundPos); if (eventArray[i].isReadyEnd()) { - Vec3f pos; pos.m_x = 0.0f; pos.m_y = 0.0f; pos.m_z = 0.0f; - m_scene_grounds[locald8[i+1]]->setPos(&pos); + m_scene_grounds[statueGrounds[i]]->setPos(&pos); eventArray[i].end(); } } @@ -891,8 +859,9 @@ void stEmblem::update(float deltaFrame) { updateSE(deltaFrame); } -inline float FSub(float param1, float param2) { - return param1 - param2; +static inline float clampFloat(float value, float min, float max) { + value = nw4r::math::FSelect(value - min, value, min); + return nw4r::math::FSelect(value - max, max, value); } void stEmblem::updateSE(float deltaFrame) { @@ -928,9 +897,7 @@ void stEmblem::updateSE(float deltaFrame) { return; } fVar1 = 1.0f - unk804/90.0f; - float fVar2; - fVar1 = nw4r::math::FSelect(FSub(fVar1,0.0f),fVar1,0.0f); - fVar2 = nw4r::math::FSelect(FSub(fVar1,1.0f),1.0f,fVar1); + float fVar2 = clampFloat(fVar1, 0.0f, 1.0f); if (fVar2 == 1.0f) { unk800++; } @@ -953,4 +920,4 @@ GXColor stEmblem::getFinalTechniqColor() { nw4r::ut::Color color = nw4r::ut::Color(0x14000496); if (m_scene_num == 0) return color; return nw4r::ut::Color(0x1400047d); -} \ No newline at end of file +}