ksys/world: Start implementing EnvMgr

This commit is contained in:
Léo Lam 2021-05-12 18:40:17 +02:00
parent 19e03c86be
commit 333078a9f2
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 619 additions and 27 deletions

View File

@ -89243,30 +89243,30 @@
0x00000071010d21e0,wm::DofMgr::m4,92,
0x00000071010d223c,wm::Manager::m11_null,4,_ZN4ksys5world3Job3m11Ev
0x00000071010d2240,wm::DofMgr::m12,8,
0x00000071010d2248,wm::SkyMgr::ctor,3648,
0x00000071010d3088,WorldMgr::EnvPaletteStatic::ctor,408,
0x00000071010d2248,wm::SkyMgr::ctor,3648,_ZN4ksys5world6EnvMgrC1Ev
0x00000071010d3088,WorldMgr::EnvPaletteStatic::ctor,408,_ZN4ksys5world6EnvMgr16EnvPaletteStaticC1Ev
0x00000071010d3220,sub_71010D3220,76,
0x00000071010d326c,wm::SkyMgr::init,1244,
0x00000071010d3748,wm::SkyMgr::initEnvAttributes,888,
0x00000071010d3ac0,wm::SkyMgr::initEnvPalettes,3580,
0x00000071010d48bc,wm::SkyMgr::initWeatherInfluence,768,
0x00000071010d4bbc,wm::SkyMgr::initRemains,988,
0x00000071010d4f98,wm::SkyMgr::initIndoorPalette,752,
0x00000071010d5288,wm::SkyMgr::initEnvPaletteStatic,936,
0x00000071010d5630,wm::SkyMgr::dtor,2604,
0x00000071010d605c,wm::SkyMgr::dtorDelete,36,
0x00000071010d6080,wm::SkyMgr::init_0,20,
0x00000071010d3748,wm::SkyMgr::initEnvAttributes,888,_ZN4ksys5world6EnvMgr16initEnvAttributeEi
0x00000071010d3ac0,wm::SkyMgr::initEnvPalettes,3580,_ZN4ksys5world6EnvMgr14initEnvPaletteEi
0x00000071010d48bc,wm::SkyMgr::initWeatherInfluence,768,_ZN4ksys5world6EnvMgr20initWeatherInfluenceEi
0x00000071010d4bbc,wm::SkyMgr::initRemains,988,_ZN4ksys5world6EnvMgr11initRemainsEi
0x00000071010d4f98,wm::SkyMgr::initIndoorPalette,752,_ZN4ksys5world6EnvMgr17initIndoorPaletteEv
0x00000071010d5288,wm::SkyMgr::initEnvPaletteStatic,936,_ZN4ksys5world6EnvMgr20initEnvPaletteStaticEv
0x00000071010d5630,wm::SkyMgr::dtor,2604,_ZN4ksys5world6EnvMgrD1Ev
0x00000071010d605c,wm::SkyMgr::dtorDelete,36,_ZN4ksys5world6EnvMgrD0Ev
0x00000071010d6080,wm::SkyMgr::init_0,20,_ZN4ksys5world6EnvMgr5init_EPN4sead4HeapE
0x00000071010d6094,wm::SkyMgr::initForStageGen,556,
0x00000071010d62c0,wm::SkyMgr::doCalc,19952,
0x00000071010db0b0,sub_71010DB0B0,32,
0x00000071010db0d0,wm::SkyMgr::calc,4,
0x00000071010db0d0,wm::SkyMgr::calc,4,_ZN4ksys5world6EnvMgr5calc_Ev
0x00000071010db0d4,wm::SkyMgr::calcEntryJob,220,
0x00000071010db1b0,wm::SkyMgr::updateDivision,696,
0x00000071010db468,wm::SkyMgr::isBloodyMoon,164,
0x00000071010db50c,wm::SkyMgr::isInBloodMoonTimeRange,32,
0x00000071010db52c,wm::SkyMgr::getConcentrationBM,16,
0x00000071010db53c,wm::SkyMgr::activateForcedBloodMoon,64,
0x00000071010db57c,wm::SkyMgr::setBloodMoonTempProhibited,36,
0x00000071010db1b0,wm::SkyMgr::updateDivision,696,_ZN4ksys5world6EnvMgr18updateTimeDivisionEv
0x00000071010db468,wm::SkyMgr::isBloodyMoon,164,_ZNK4ksys5world6EnvMgr16isBloodMoonNightEv
0x00000071010db50c,wm::SkyMgr::isInBloodMoonTimeRange,32,_ZNK4ksys5world6EnvMgr22isInBloodMoonTimeRangeEv
0x00000071010db52c,wm::SkyMgr::getConcentrationBM,16,_ZNK4ksys5world6EnvMgr18getConcentrationBMEv
0x00000071010db53c,wm::SkyMgr::activateForcedBloodMoon,64,_ZN4ksys5world6EnvMgr23activateForcedBloodMoonEv
0x00000071010db57c,wm::SkyMgr::setBloodMoonTempProhibited,36,_ZN4ksys5world6EnvMgr23setBloodMoonProhibitionEb
0x00000071010db5a0,sub_71010DB5A0,1116,
0x00000071010db9fc,wm::SkyMgr::isFadeOrFadeDemoScreenOpened,352,
0x00000071010dbb5c,wm::SkyMgr::updateBloodMoon,792,
@ -89287,12 +89287,12 @@
0x00000071010dc6d8,wm::SkyMgr::setFogDirect,104,
0x00000071010dc740,wm::SkyMgr::getBloodMoonProgress,56,
0x00000071010dc778,sub_71010DC778,16,
0x00000071010dc788,wm::SkyMgr::rtti1,204,
0x00000071010dc854,wm::SkyMgr::rtti2,92,
0x00000071010dc8b0,wm::SkyMgr::getType,8,
0x00000071010dc8b8,WorldMgr::EnvPalette::ctor,620,
0x00000071010dcb24,WorldMgrStruct0_6_b_a::ctor,500,
0x00000071010dcd18,WorldMgr::Remains::ctor,276,
0x00000071010dc788,wm::SkyMgr::rtti1,204,_ZNK4ksys5world6EnvMgr27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071010dc854,wm::SkyMgr::rtti2,92,_ZNK4ksys5world6EnvMgr18getRuntimeTypeInfoEv
0x00000071010dc8b0,wm::SkyMgr::getType,8,_ZNK4ksys5world6EnvMgr7getTypeEv
0x00000071010dc8b8,WorldMgr::EnvPalette::ctor,620,_ZN4ksys5world6EnvMgr10EnvPaletteC2Ev
0x00000071010dcb24,WorldMgrStruct0_6_b_a::ctor,500,_ZN4ksys5world6EnvMgr10EnvPalette5CloudC2Ev
0x00000071010dcd18,WorldMgr::Remains::ctor,276,_ZN4ksys5world6EnvMgr7RemainsC2Ev
0x00000071010dce2c,sub_71010DCE2C,12,
0x00000071010dce38,sub_71010DCE38,12,
0x00000071010dce44,wm::ShootingStarMgr::ctor,60,

Can't render this file because it is too large.

@ -1 +1 @@
Subproject commit b1a372a1300566e221f2c739bc4348ed1b7c1f4b
Subproject commit e6bd74df66d65f387c575a17dc5949531d38dbdd

View File

@ -1 +1,324 @@
#include "KingSystem/World/worldEnvMgr.h"
#include "KingSystem/World/worldManager.h"
namespace ksys::world {
EnvMgr::EnvMgr() {
mForcedBloodMoonRequested = false;
mDeactivateForcedBloodMoon = false;
mForcedBloodMoonReady = false;
mBloodMoonProhibited = false;
mForcedBloodMoonStatus = {};
mForcedBloodMoonTimer = {};
reset();
for (int i = 0; i < mEnvAttributes.size(); ++i)
initEnvAttribute(i);
for (int i = 0; i < mEnvPalettes.size(); ++i)
initEnvPalette(i);
for (int i = 0; i < mWeatherInfluences.size(); ++i)
initWeatherInfluence(i);
for (int i = 0; i < mRemains.size(); ++i)
initRemains(i);
initIndoorPalette();
initEnvPaletteStatic();
initDungeonFog();
mDungeonSizeType = DungeonSize::M;
_6b5b0 = 1.0;
}
EnvMgr::EnvPaletteStatic::EnvPaletteStatic() = default;
void EnvMgr::initEnvAttribute(int idx) {
auto& attr = mEnvAttributes[idx];
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &attr.obj;
attr.DifUse.init(false, "DifUse", "", obj);
attr.DifXang.init(0.0, "DifXang", "", obj);
attr.DifYang.init(0.0, "DifYang", "", obj);
attr.PaletteSel00.init(8 * idx, "PaletteSel00", "", obj);
attr.PaletteSel01.init(8 * idx + 1, "PaletteSel01", "", obj);
attr.PaletteSel02.init(8 * idx + 2, "PaletteSel02", "", obj);
attr.PaletteSel03.init(8 * idx + 3, "PaletteSel03", "", obj);
attr.PaletteSel04.init(8 * idx + 4, "PaletteSel04", "", obj);
attr.PaletteSel05.init(8 * idx + 5, "PaletteSel05", "", obj);
attr.PaletteSel06.init(8 * idx + 6, "PaletteSel06", "", obj);
attr.PaletteSel07.init(8 * idx + 7, "PaletteSel07", "", obj);
}
void EnvMgr::initEnvPalette(int idx) {
auto& pal = mEnvPalettes[idx];
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &pal.obj;
pal.BgDifColor.init({1.0, 0.894, 0.68, 0.0}, "BgDifColor", "", obj);
pal.BgDifIntencity.init(8.0, "BgDifIntencity", "", obj);
pal.FogColor.init({0.535, 0.763, 0.568, 0.4}, "FogColor", "", obj);
pal.FogStart.init(0.0, "FogStart", "", obj);
pal.FogEnd.init(600.0, "FogEnd", "", obj);
pal.YFogColor.init({1.288, 0.992, 0.178, 0.8}, "YFogColor", "", obj);
pal.YFogStart.init(0.0, "YFogStart", "", obj);
pal.SkySunColorNoUse.init(1, "SkySunColorNoUse", "", obj);
pal.SkySunColor.init({1.0, 0.894, 0.68, 10.0}, "SkySunColor", "", obj);
pal.SkyIsotropicfade.init(0.0, "SkyIsotropicfade", "", obj);
pal.SfParam_near.init(0.0, "SfParam_near", "", obj);
pal.SfParam_attenuation.init(15.0, "SfParam_attenuation", "", obj);
pal.SfParam_horizontal.init(2.4, "SfParam_horizontal", "", obj);
pal.afParam_attenuationForGrd.init(2.5, "afParam_attenuationForGrd", "", obj);
pal.afParam_attenuationForSky.init(0.25, "afParam_attenuationForSky", "", obj);
pal.SkyRParam_rayleigh_amplifier.init(1.0, "SkyRParam_rayleigh_amplifier", "", obj);
pal.SkyRParam_mie_symmetricalProperty.init(0.8, "SkyRParam_mie_symmetricalProperty", "", obj);
pal.SkyRParam_mie_amplifier.init(2.0, "SkyRParam_mie_amplifier", "", obj);
pal.AmplifierForEnvMap.init(5.0, "AmplifierForEnvMap", "", obj);
pal.cloud.Cloud0_ColorBase.init({0.956, 0.643137, 0.0, 0.835}, "Cloud0_ColorBase", "", obj);
pal.cloud.Cloud0_IntencityBase.init(0.376, "Cloud0_IntencityBase", "", obj);
pal.cloud.Cloud0_ColorHilight.init({0.8, 0.92, 0.557, 1.0}, "Cloud0_ColorHilight", "", obj);
pal.cloud.Cloud0_IntencityHilight.init(11.76, "Cloud0_IntencityHilight", "", obj);
pal.cloud.Cloud0_ColorShadow.init({0.44, 0.577, 0.61, 1.0}, "Cloud0_ColorShadow", "", obj);
pal.cloud.Cloud0_IntencityShadow.init(1.0, "Cloud0_IntencityShadow", "", obj);
pal.cloud.Cloud0_ColorBackLight.init({1.0, 0.95, 0.645, 1.0}, "Cloud0_ColorBackLight", "", obj);
const u32 i = idx - 8;
if (i < 8)
pal.Cloud0_BacklightPower.init(1.2, "Cloud0_BacklightPower", "", obj);
else
pal.Cloud0_BacklightPower.init(1.6, "Cloud0_BacklightPower", "", obj);
pal.cloud.Cloud1_ColorBase.init({1.0, 1.0, 1.0, 1.0}, "Cloud1_ColorBase", "", obj);
pal.cloud.Cloud1_IntencityBase.init(0.0, "Cloud1_IntencityBase", "", obj);
pal.cloud.Cloud1_ColorHilight.init({1.0, 1.0, 1.0, 1.0}, "Cloud1_ColorHilight", "", obj);
pal.cloud.Cloud1_IntencityHilight.init(0.0, "Cloud1_IntencityHilight", "", obj);
pal.cloud.Cloud1_ColorShadow.init({1.0, 1.0, 1.0, 1.0}, "Cloud1_ColorShadow", "", obj);
pal.cloud.Cloud1_IntencityShadow.init(0.0, "Cloud1_IntencityShadow", "", obj);
pal.cloud.Cloud1_ColorBackLight.init({1.0, 1.0, 1.0, 1.0}, "Cloud1_ColorBackLight", "", obj);
if (i < 8)
pal.Cloud1_BacklightPower.init(1.2, "Cloud1_BacklightPower", "", obj);
else
pal.Cloud1_BacklightPower.init(1.6, "Cloud1_BacklightPower", "", obj);
pal.cloud.Cloud2_ColorBase.init({1.0, 0.91, 0.72, 1.0}, "Cloud2_ColorBase", "", obj);
pal.cloud.Cloud2_IntencityBase.init(1.0, "Cloud2_IntencityBase", "", obj);
pal.cloud.Cloud2_ColorHilight.init({1.0, 0.91, 0.72, 1.0}, "Cloud2_ColorHilight", "", obj);
pal.cloud.Cloud2_IntencityHilight.init(48.0, "Cloud2_IntencityHilight", "", obj);
pal.cloud.Cloud2_ColorShadow.init({0.0, 0.541, 0.437, 0.994}, "Cloud2_ColorShadow", "", obj);
pal.cloud.Cloud2_IntencityShadow.init(2.0, "Cloud2_IntencityShadow", "", obj);
pal.cloud.Cloud2_ColorBackLight.init({0.0, 0.0, 0.0, 0.0}, "Cloud2_ColorBackLight", "", obj);
if (i < 8)
pal.Cloud2_BacklightPower.init(1.2, "Cloud2_BacklightPower", "", obj);
else
pal.Cloud2_BacklightPower.init(1.6, "Cloud2_BacklightPower", "", obj);
pal.Cloud2NoUse.init(1, "Cloud2NoUse", "", obj);
pal.CloudShadowOnOff.init(true, "CloudShadowOnOff", "", obj);
pal.BloomOffsetStart.init(19999.0, "BloomOffsetStart", "", obj);
pal.BloomOffsetEnd.init(20000.0, "BloomOffsetEnd", "", obj);
pal.BloomOffset.init(2.0, "BloomOffset", "", obj);
pal.BloomClampedLuminance.init(64.0, "BloomClampedLuminance", "", obj);
pal.BloomThreshhold.init(2.0, "BloomThreshhold", "", obj);
pal.BloomIntencity.init(0.1, "BloomIntencity", "", obj);
pal.VolumeMaskColorNoUse.init(1, "VolumeMaskColorNoUse", "", obj);
pal.VolumeMaskColor.init({1.0, 1.0, 1.0, 1.0}, "VolumeMaskColor", "", obj);
pal.VolumeMaskIntencity.init(1.0, "VolumeMaskIntencity", "", obj);
pal.AmbientIntencity.init(1.0, "AmbientIntencity", "", obj);
pal.Exposure.init(0.0, "Exposure", "", obj);
}
void EnvMgr::initWeatherInfluence(int idx) {
auto& entry = mWeatherInfluences[idx];
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &entry.obj;
entry.FeatureColor.init({1.0, 1.0, 1.0, 1.0}, "FeatureColor", "", obj);
entry.FeatureFogColor.init({1.0, 1.0, 1.0, 1.0}, "FeatureFogColor", "", obj);
entry.CalcRayleigh.init(1.0, "CalcRayleigh", "", "Min=0.0f, Max=2.0f", obj);
entry.CalcMieSymmetrical.init(1.0, "CalcMieSymmetrical", "", "Min=0.0f, Max=10.0f", obj);
entry.CalcMie.init(1.0, "CalcMie", "", "Min=0.0f, Max=100.0f", obj);
entry.CalcVolumeMaskIntencity.init(1.0, "CalcVolumeMaskIntencity", "", "Min=0.0f, Max=20.0f",
obj);
entry.BloomThreshhold.init(1.0, "BloomThreshhold", "", "Min=0.0f, Max=2.0f", obj);
entry.BloomIntencity.init(1.0, "BloomIntencity", "", "Min=0.0f, Max=2.0f", obj);
entry.AddMoisture.init(0.0, "AddMoisture", "", "Min=0.0f, Max=100.0f", obj);
}
void EnvMgr::initRemains(int idx) {
auto& entry = mRemains[idx];
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &entry.obj;
entry.FeatureColor.init({1.0, 1.0, 1.0, 1.0}, "FeatureColor", "", obj);
entry.FeatureFogColor.init({1.0, 1.0, 1.0, 1.0}, "FeatureFogColor", "", obj);
entry.AddFog_near.init(0.0, "AddFog_near", "", obj);
entry.AddFog_far.init(300.0, "AddFog_far", "", obj);
entry.AddFog_ratio.init(0.0, "AddFog_ratio", "", obj);
entry.SfParam_near.init(0.0, "SfParam_near", "", obj);
entry.SfParam_attenuation.init(0.0, "SfParam_attenuation", "", obj);
entry.CalcRayleigh.init(1.0, "CalcRayleigh", "", obj);
entry.CalcMieSymmetrical.init(1.0, "CalcMieSymmetrical", "", obj);
entry.CalcMie.init(1.0, "CalcMie", "", obj);
entry.BloomThreshhold.init(1.0, "BloomThreshhold", "", obj);
entry.BloomIntencity.init(1.0, "BloomIntencity", "", obj);
entry.CalcVolumeMaskIntencity.init(1.0, "CalcVolumeMaskIntencity", "", obj);
}
void EnvMgr::initIndoorPalette() {
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &mIndoorPalette.obj;
mIndoorPalette.FeatureColor.init({0.5, 0.342, 0.274, 0.175}, "FeatureColor", "", obj);
mIndoorPalette.CalcVolumeMaskIntencity.init(2.0, "CalcVolumeMaskIntencity", "", obj);
mIndoorPalette.BloomClampedLuminance.init(64.0, "BloomClampedLuminance", "", obj);
mIndoorPalette.BloomThreshhold.init(2.0, "BloomThreshhold", "", obj);
mIndoorPalette.BloomIntencity.init(3.0, "BloomIntencity", "", obj);
mIndoorPalette.IndoorFogRatio.init(0.175, "IndoorFogRatio", "", obj);
mIndoorPalette.IndoorFogStart.init(5.0, "IndoorFogStart", "", obj);
mIndoorPalette.IndoorFogEnd.init(15.0, "IndoorFogEnd", "", obj);
mIndoorPalette.attenuationForGrd.init(0.75, "attenuationForGrd", "", obj);
}
void EnvMgr::initEnvPaletteStatic() {
if (Manager::instance()->worldInfoLoaded())
return;
auto* obj = &mEnvPaletteStatic.obj;
mEnvPaletteStatic.rayleigh_baseHeigh.init(20.0, "rayleigh_baseHeigh", "", obj);
mEnvPaletteStatic.mie_baseHeight.init(2.0, "mie_baseHeight", "", obj);
mEnvPaletteStatic.mie_scatteringCoeff.init(0.0018, "mie_scatteringCoeff", "", obj);
mEnvPaletteStatic.mie_symmetricalPropert.init(0.8, "mie_symmetricalPropert", "", obj);
mEnvPaletteStatic.YFogEnd.init(160.0, "YFogEnd", "", obj);
mEnvPaletteStatic.SfParam_far.init(24000.0, "SfParam_far", "", obj);
mEnvPaletteStatic.SfParam_density.init(0.85, "SfParam_density", "", obj);
mEnvPaletteStatic.BloomComposeColorNoUse_8_8.init(0, "BloomComposeColorNoUse_8_8", "", obj);
mEnvPaletteStatic.BloomLayerColor_8_8.init({1.0, 1.0, 1.0, 0.5}, "BloomLayerColor_8_8", "",
obj);
mEnvPaletteStatic.BloomLayerColorNoUse_16_16.init(0, "BloomLayerColorNoUse_16_16", "", obj);
mEnvPaletteStatic.BloomLayerColor_16_16.init({1.0, 1.0, 1.0, 1.0}, "BloomLayerColor_16_16", "",
obj);
mEnvPaletteStatic.BloomLayerColorNoUse_32_32.init(1, "BloomLayerColorNoUse_32_32", "", obj);
mEnvPaletteStatic.BloomLayerColor_32_32.init({1.0, 1.0, 1.0, 1.0}, "BloomLayerColor_32_32", "",
obj);
mEnvPaletteStatic.BloomLayerColorNoUse_64_64.init(1, "BloomLayerColorNoUse_64_64", "", obj);
mEnvPaletteStatic.BloomLayerColor_64_64.init({1.0, 1.0, 1.0, 0.0}, "BloomLayerColor_64_64", "",
obj);
mEnvPaletteStatic.BloomComposeColor.init({1.0, 1.0, 1.0, 1.0}, "BloomComposeColor", "", obj);
}
KSYS_ALWAYS_INLINE void EnvMgr::initDungeonFog() {
if (Manager::instance()->worldInfoLoaded())
return;
for (int i = 0; i < mCdanAddFog.size(); ++i) {
auto& entry = mCdanAddFog[i];
auto* obj = &entry.obj;
entry.DungeonFogFogEnd.init(300.0, "DungeonFogFogEnd", "", obj);
entry.DungeonFogVolA.init(10.0, "DungeonFogVolA", "", obj);
}
}
EnvMgr::~EnvMgr() = default;
void EnvMgr::init_(sead::Heap* heap) {
mBloodMoonEndState = {};
mBloodMoonStartState = {};
mBloodMoonProgress = 1.0;
}
void EnvMgr::calc_() {}
void EnvMgr::updateTimeDivision() {
auto* wm = Manager::instance();
const auto time = wm->getTimeMgr()->getTimeForSkyEnv();
float transition = 1.0;
u32 division = 0;
if (wm->getStageType() == StageType::Indoor) {
division = 0;
} else if (time >= 3_h && time < 4_h) {
division = 0;
if (time < timeToFloat(3, 40))
transition = (time - 3_h) / timeToFloat(0, 40);
} else if (time >= 4_h && time < 6_h) {
division = 1;
if (time < 5_h)
transition = (time - 4_h) / 1_h;
} else if (time >= 6_h && time < 9_h) {
division = 2;
if (time < 7_h)
transition = (time - 6_h) / 1_h;
} else if (time >= 9_h && time < 16_h) {
division = 3;
if (time < 10_h)
transition = (time - 9_h) / 1_h;
} else if (time >= 16_h && time < 18_h) {
division = 4;
if (time < 17_h)
transition = (time - 16_h) / 1_h;
} else if (time >= 18_h && time < 20_h) {
division = 5;
if (time < 19_h)
transition = (time - 18_h) / 1_h;
} else if (time >= 20_h && time < 21_h) {
division = 6;
if (time < timeToFloat(20, 40))
transition = (time - 20_h) / timeToFloat(0, 40);
} else if (time >= 21_h && time < 22_h) {
division = 7;
transition = (time - 21_h) / 1_h;
} else {
division = 7;
}
if (mSkyEnvTimeDivision != division) {
mPrevSkyEnvTimeDivision = division == 0 ? 7 : division - 1;
mSkyEnvTimeDivision = division;
}
mEnvTimeTransition = transition;
}
bool EnvMgr::isBloodMoonNight() const {
auto* wm = Manager::instance();
const auto time = wm->getTimeMgr()->getTimeForSkyEnv();
bool bm = false;
bm |= wm->getTimeMgr()->isBloodyDay();
bm |= wm->getTimeMgr()->wasBloodyDay() && time < 1_h;
bm |= wm->getTimeMgr()->getBloodMoonForceMode() != TimeMgr::BloodMoonForceMode::Disabled;
return bm;
}
bool EnvMgr::isInBloodMoonTimeRange() const {
return mBloodMoonTimeRangeProgress > 0.001f;
}
float EnvMgr::getConcentrationBM() const {
return mConcentrationBM;
}
void EnvMgr::activateForcedBloodMoon() {
if (Manager::instance()->isMainField())
mForcedBloodMoonRequested = true;
mBloodMoonProhibited = false;
}
void EnvMgr::setBloodMoonProhibition(bool prohibited) {
if (!mDeactivateForcedBloodMoon)
mBloodMoonProhibited = prohibited;
}
} // namespace ksys::world

View File

@ -1,5 +1,10 @@
#pragma once
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterObj.h>
#include <container/seadSafeArray.h>
#include <gfx/seadColor.h>
#include <prim/seadStorageFor.h>
#include "KingSystem/Utils/Types.h"
#include "KingSystem/World/worldJob.h"
@ -7,17 +12,281 @@ namespace ksys::world {
// TODO
class EnvMgr : public Job {
SEAD_RTTI_OVERRIDE(EnvMgr, Job)
public:
struct EnvPaletteStatic {
EnvPaletteStatic();
agl::utl::Parameter<float> rayleigh_baseHeigh;
agl::utl::Parameter<float> mie_baseHeight;
agl::utl::Parameter<float> mie_scatteringCoeff;
agl::utl::Parameter<float> mie_symmetricalPropert;
agl::utl::Parameter<float> YFogEnd;
agl::utl::Parameter<float> SfParam_far;
agl::utl::Parameter<float> SfParam_density;
agl::utl::Parameter<u32> BloomComposeColorNoUse_8_8;
agl::utl::Parameter<u32> BloomLayerColorNoUse_16_16;
agl::utl::Parameter<u32> BloomLayerColorNoUse_32_32;
agl::utl::Parameter<u32> BloomLayerColorNoUse_64_64;
agl::utl::Parameter<sead::Color4f> BloomLayerColor_8_8{{}};
agl::utl::Parameter<sead::Color4f> BloomLayerColor_16_16{{}};
agl::utl::Parameter<sead::Color4f> BloomLayerColor_32_32{{}};
agl::utl::Parameter<sead::Color4f> BloomLayerColor_64_64{{}};
agl::utl::Parameter<u32> _200;
agl::utl::Parameter<sead::Color4f> BloomComposeColor{{}};
agl::utl::ParameterObj obj;
};
struct EnvPalette {
struct Cloud {
agl::utl::Parameter<sead::Color4f> Cloud0_ColorBase{{}};
agl::utl::Parameter<float> Cloud0_IntencityBase;
agl::utl::Parameter<sead::Color4f> Cloud0_ColorHilight{{}};
agl::utl::Parameter<float> Cloud0_IntencityHilight;
agl::utl::Parameter<sead::Color4f> Cloud0_ColorShadow{{}};
agl::utl::Parameter<float> Cloud0_IntencityShadow;
agl::utl::Parameter<sead::Color4f> Cloud0_ColorBackLight{{}};
agl::utl::Parameter<sead::Color4f> Cloud1_ColorBase{{}};
agl::utl::Parameter<float> Cloud1_IntencityBase;
agl::utl::Parameter<sead::Color4f> Cloud1_ColorHilight{{}};
agl::utl::Parameter<float> Cloud1_IntencityHilight;
agl::utl::Parameter<sead::Color4f> Cloud1_ColorShadow{{}};
agl::utl::Parameter<float> Cloud1_IntencityShadow;
agl::utl::Parameter<sead::Color4f> Cloud1_ColorBackLight{{}};
agl::utl::Parameter<sead::Color4f> Cloud2_ColorBase{{}};
agl::utl::Parameter<float> Cloud2_IntencityBase;
agl::utl::Parameter<sead::Color4f> Cloud2_ColorHilight{{}};
agl::utl::Parameter<float> Cloud2_IntencityHilight;
agl::utl::Parameter<sead::Color4f> Cloud2_ColorShadow{{}};
agl::utl::Parameter<float> Cloud2_IntencityShadow;
agl::utl::Parameter<sead::Color4f> Cloud2_ColorBackLight{{}};
};
agl::utl::Parameter<sead::Color4f> BgDifColor;
agl::utl::Parameter<float> BgDifIntencity;
agl::utl::Parameter<sead::Color4f> FogColor;
agl::utl::Parameter<float> FogStart;
agl::utl::Parameter<float> FogEnd;
agl::utl::Parameter<sead::Color4f> YFogColor;
agl::utl::Parameter<float> YFogStart;
agl::utl::Parameter<u32> SkySunColorNoUse;
agl::utl::Parameter<sead::Color4f> SkySunColor;
agl::utl::Parameter<float> SkyIsotropicfade;
agl::utl::Parameter<float> SfParam_near;
agl::utl::Parameter<float> SfParam_attenuation;
agl::utl::Parameter<float> SfParam_horizontal;
agl::utl::Parameter<float> afParam_attenuationForGrd;
agl::utl::Parameter<float> afParam_attenuationForSky;
agl::utl::Parameter<float> SkyRParam_rayleigh_amplifier;
agl::utl::Parameter<float> SkyRParam_mie_symmetricalProperty;
agl::utl::Parameter<float> SkyRParam_mie_amplifier;
agl::utl::Parameter<float> AmplifierForEnvMap;
Cloud cloud;
agl::utl::Parameter<u32> Cloud2NoUse;
agl::utl::Parameter<bool> CloudShadowOnOff;
agl::utl::Parameter<float> BloomOffsetStart;
agl::utl::Parameter<float> BloomOffsetEnd;
agl::utl::Parameter<float> BloomOffset;
agl::utl::Parameter<float> BloomClampedLuminance;
agl::utl::Parameter<float> BloomThreshhold;
agl::utl::Parameter<float> BloomIntencity;
agl::utl::Parameter<u32> VolumeMaskColorNoUse;
agl::utl::Parameter<sead::Color4f> VolumeMaskColor;
agl::utl::Parameter<float> VolumeMaskIntencity;
agl::utl::Parameter<float> AmbientIntencity;
agl::utl::Parameter<float> Exposure;
agl::utl::Parameter<float> Cloud0_BacklightPower;
agl::utl::Parameter<float> Cloud1_BacklightPower;
agl::utl::Parameter<float> Cloud2_BacklightPower;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(EnvPalette, 0x7b8);
struct CdanAddFog {
agl::utl::Parameter<float> DungeonFogFogEnd;
agl::utl::Parameter<float> DungeonFogVolA;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(CdanAddFog, 0x70);
struct EnvAttribute {
agl::utl::Parameter<bool> DifUse;
agl::utl::Parameter<float> DifXang;
agl::utl::Parameter<float> DifYang;
agl::utl::Parameter<int> PaletteSel00;
agl::utl::Parameter<int> PaletteSel01;
agl::utl::Parameter<int> PaletteSel02;
agl::utl::Parameter<int> PaletteSel03;
agl::utl::Parameter<int> PaletteSel04;
agl::utl::Parameter<int> PaletteSel05;
agl::utl::Parameter<int> PaletteSel06;
agl::utl::Parameter<int> PaletteSel07;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(EnvAttribute, 0x190);
struct WeatherInfluence {
agl::utl::Parameter<sead::Color4f> FeatureColor;
agl::utl::Parameter<sead::Color4f> FeatureFogColor;
agl::utl::Parameter<float> CalcRayleigh;
agl::utl::Parameter<float> CalcMieSymmetrical;
agl::utl::Parameter<float> CalcMie;
agl::utl::Parameter<float> CalcVolumeMaskIntencity;
agl::utl::Parameter<float> BloomThreshhold;
agl::utl::Parameter<float> BloomIntencity;
agl::utl::Parameter<float> AddMoisture;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(WeatherInfluence, 0x160);
struct Remains {
agl::utl::Parameter<sead::Color4f> FeatureColor;
agl::utl::Parameter<sead::Color4f> FeatureFogColor;
agl::utl::Parameter<float> AddFog_near;
agl::utl::Parameter<float> AddFog_far;
agl::utl::Parameter<float> AddFog_ratio;
agl::utl::Parameter<float> SfParam_near;
agl::utl::Parameter<float> SfParam_attenuation;
agl::utl::Parameter<float> CalcRayleigh;
agl::utl::Parameter<float> CalcMieSymmetrical;
agl::utl::Parameter<float> CalcMie;
agl::utl::Parameter<float> BloomThreshhold;
agl::utl::Parameter<float> BloomIntencity;
agl::utl::Parameter<float> CalcVolumeMaskIntencity;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(Remains, 0x1e0);
struct IndoorPalette {
agl::utl::Parameter<sead::Color4f> FeatureColor;
agl::utl::Parameter<float> CalcVolumeMaskIntencity;
agl::utl::Parameter<float> BloomClampedLuminance;
agl::utl::Parameter<float> BloomThreshhold;
agl::utl::Parameter<float> BloomIntencity;
agl::utl::Parameter<float> IndoorFogRatio;
agl::utl::Parameter<float> IndoorFogStart;
agl::utl::Parameter<float> IndoorFogEnd;
agl::utl::Parameter<float> attenuationForGrd;
agl::utl::ParameterObj obj;
};
EnvMgr();
~EnvMgr() override;
JobType getType() const override { return JobType::Env; }
void reset();
void resetForStageUnload();
bool checkConcentrationDarkness() const;
bool isBloodMoonNight() const;
u8 _20[0x6b618 - 0x20];
bool isBloodMoonNight() const;
bool isInBloodMoonTimeRange() const;
float getConcentrationBM() const;
void activateForcedBloodMoon();
void setBloodMoonProhibition(bool prohibited);
protected:
void init_(sead::Heap* heap) override;
void calc_() override;
private:
void initEnvAttribute(int idx);
void initEnvPalette(int idx);
void initWeatherInfluence(int idx);
void initRemains(int idx);
void initIndoorPalette();
void initEnvPaletteStatic();
void initDungeonFog();
void updateTimeDivision();
void updateBloodMoon();
void updateForcedBloodMoon();
EnvPaletteStatic mEnvPaletteStatic;
u32 mPrevSkyEnvTimeDivision = 0;
u32 mSkyEnvTimeDivision = 0;
float mEnvTimeTransition = 0.0;
u32 mBloodMoonEndState = 0;
u32 mBloodMoonStartState = 0;
float mBloodMoonProgress = 0.0;
u32 _2b0 = 0;
u32 _2b4 = 0;
float mConcentrationDarkness = 0.0;
sead::SafeArray<EnvPalette, 207> mEnvPalettes;
sead::SafeArray<CdanAddFog, 4> mCdanAddFog;
EnvPaletteStatic mEnvPaletteStaticUnused;
sead::SafeArray<EnvAttribute, 59> mEnvAttributes;
sead::SafeArray<WeatherInfluence, 4> mWeatherInfluences;
sead::SafeArray<Remains, 7> mRemains;
IndoorPalette mIndoorPalette;
sead::Color4f _6b4e8;
sead::Color4f _6b4f8;
sead::Color4f _6b508;
sead::Color4f _6b518;
sead::Color4f _6b528;
sead::Color4f _6b538;
float _6b548;
float _6b54c;
float _6b550;
float mEventYfogRatio;
float _6b558;
float mEventDiffuseAttenuateDiameter;
float _6b560;
float _6b564;
float _6b568;
float _6b56c;
float _6b570;
float _6b574;
float _6b578;
float _6b57c;
float mWarpMistTimer;
float mExposure;
float mForcedBloodMoonTimer;
float _6b58c;
float _6b590;
float _6b594;
float _6b598;
float mConcentrationBM;
float mBloodMoonTimeRangeProgress;
float mFogRatio;
float mFogNear;
float mFogFar;
float _6b5b0;
float _6b5b4;
int mPaletteSelMaybe;
u32 _6b5bc;
u32 _6b5c0;
u32 _6b5c4;
u32 _6b5c8;
u32 _6b5cc;
u32 _6b5d0;
u32 _6b5d4;
u32 _6b5d8;
u32 _6b5dc;
u32 _6b5e0;
u32 _6b5e4;
u32 _6b5e8;
u32 _6b5ec;
u32 _6b5f0;
u32 mForcedBloodMoonStatus;
u32 _6b5f8;
u32 _6b5fc;
u32 mFogMode;
u8 mDungeonSizeType;
bool mForcedBloodMoonRequested;
bool mForcedBloodMoonReady;
bool mFogInstantSW;
bool mFogNearUse;
bool mFogFagUse;
bool _6b60a;
bool _6b60b;
bool mBloodMoonProhibited;
bool mDeactivateForcedBloodMoon;
u16 _6b60e;
bool _6b610;
bool _6b611;
u32 _6b614;
};
KSYS_CHECK_SIZE_NX150(EnvMgr, 0x6b618);