diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 4a2c6465..b83ac2f4 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -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, diff --git a/lib/agl b/lib/agl index b1a372a1..e6bd74df 160000 --- a/lib/agl +++ b/lib/agl @@ -1 +1 @@ -Subproject commit b1a372a1300566e221f2c739bc4348ed1b7c1f4b +Subproject commit e6bd74df66d65f387c575a17dc5949531d38dbdd diff --git a/src/KingSystem/World/worldEnvMgr.cpp b/src/KingSystem/World/worldEnvMgr.cpp index b5ae3d01..dba1502e 100644 --- a/src/KingSystem/World/worldEnvMgr.cpp +++ b/src/KingSystem/World/worldEnvMgr.cpp @@ -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 diff --git a/src/KingSystem/World/worldEnvMgr.h b/src/KingSystem/World/worldEnvMgr.h index b18b16c6..a0be4ce7 100644 --- a/src/KingSystem/World/worldEnvMgr.h +++ b/src/KingSystem/World/worldEnvMgr.h @@ -1,5 +1,10 @@ #pragma once +#include +#include +#include +#include +#include #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 rayleigh_baseHeigh; + agl::utl::Parameter mie_baseHeight; + agl::utl::Parameter mie_scatteringCoeff; + agl::utl::Parameter mie_symmetricalPropert; + agl::utl::Parameter YFogEnd; + agl::utl::Parameter SfParam_far; + agl::utl::Parameter SfParam_density; + agl::utl::Parameter BloomComposeColorNoUse_8_8; + agl::utl::Parameter BloomLayerColorNoUse_16_16; + agl::utl::Parameter BloomLayerColorNoUse_32_32; + agl::utl::Parameter BloomLayerColorNoUse_64_64; + agl::utl::Parameter BloomLayerColor_8_8{{}}; + agl::utl::Parameter BloomLayerColor_16_16{{}}; + agl::utl::Parameter BloomLayerColor_32_32{{}}; + agl::utl::Parameter BloomLayerColor_64_64{{}}; + agl::utl::Parameter _200; + agl::utl::Parameter BloomComposeColor{{}}; + agl::utl::ParameterObj obj; + }; + + struct EnvPalette { + struct Cloud { + agl::utl::Parameter Cloud0_ColorBase{{}}; + agl::utl::Parameter Cloud0_IntencityBase; + agl::utl::Parameter Cloud0_ColorHilight{{}}; + agl::utl::Parameter Cloud0_IntencityHilight; + agl::utl::Parameter Cloud0_ColorShadow{{}}; + agl::utl::Parameter Cloud0_IntencityShadow; + agl::utl::Parameter Cloud0_ColorBackLight{{}}; + agl::utl::Parameter Cloud1_ColorBase{{}}; + agl::utl::Parameter Cloud1_IntencityBase; + agl::utl::Parameter Cloud1_ColorHilight{{}}; + agl::utl::Parameter Cloud1_IntencityHilight; + agl::utl::Parameter Cloud1_ColorShadow{{}}; + agl::utl::Parameter Cloud1_IntencityShadow; + agl::utl::Parameter Cloud1_ColorBackLight{{}}; + agl::utl::Parameter Cloud2_ColorBase{{}}; + agl::utl::Parameter Cloud2_IntencityBase; + agl::utl::Parameter Cloud2_ColorHilight{{}}; + agl::utl::Parameter Cloud2_IntencityHilight; + agl::utl::Parameter Cloud2_ColorShadow{{}}; + agl::utl::Parameter Cloud2_IntencityShadow; + agl::utl::Parameter Cloud2_ColorBackLight{{}}; + }; + + agl::utl::Parameter BgDifColor; + agl::utl::Parameter BgDifIntencity; + agl::utl::Parameter FogColor; + agl::utl::Parameter FogStart; + agl::utl::Parameter FogEnd; + agl::utl::Parameter YFogColor; + agl::utl::Parameter YFogStart; + agl::utl::Parameter SkySunColorNoUse; + agl::utl::Parameter SkySunColor; + agl::utl::Parameter SkyIsotropicfade; + agl::utl::Parameter SfParam_near; + agl::utl::Parameter SfParam_attenuation; + agl::utl::Parameter SfParam_horizontal; + agl::utl::Parameter afParam_attenuationForGrd; + agl::utl::Parameter afParam_attenuationForSky; + agl::utl::Parameter SkyRParam_rayleigh_amplifier; + agl::utl::Parameter SkyRParam_mie_symmetricalProperty; + agl::utl::Parameter SkyRParam_mie_amplifier; + agl::utl::Parameter AmplifierForEnvMap; + Cloud cloud; + agl::utl::Parameter Cloud2NoUse; + agl::utl::Parameter CloudShadowOnOff; + agl::utl::Parameter BloomOffsetStart; + agl::utl::Parameter BloomOffsetEnd; + agl::utl::Parameter BloomOffset; + agl::utl::Parameter BloomClampedLuminance; + agl::utl::Parameter BloomThreshhold; + agl::utl::Parameter BloomIntencity; + agl::utl::Parameter VolumeMaskColorNoUse; + agl::utl::Parameter VolumeMaskColor; + agl::utl::Parameter VolumeMaskIntencity; + agl::utl::Parameter AmbientIntencity; + agl::utl::Parameter Exposure; + agl::utl::Parameter Cloud0_BacklightPower; + agl::utl::Parameter Cloud1_BacklightPower; + agl::utl::Parameter Cloud2_BacklightPower; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(EnvPalette, 0x7b8); + + struct CdanAddFog { + agl::utl::Parameter DungeonFogFogEnd; + agl::utl::Parameter DungeonFogVolA; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(CdanAddFog, 0x70); + + struct EnvAttribute { + agl::utl::Parameter DifUse; + agl::utl::Parameter DifXang; + agl::utl::Parameter DifYang; + agl::utl::Parameter PaletteSel00; + agl::utl::Parameter PaletteSel01; + agl::utl::Parameter PaletteSel02; + agl::utl::Parameter PaletteSel03; + agl::utl::Parameter PaletteSel04; + agl::utl::Parameter PaletteSel05; + agl::utl::Parameter PaletteSel06; + agl::utl::Parameter PaletteSel07; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(EnvAttribute, 0x190); + + struct WeatherInfluence { + agl::utl::Parameter FeatureColor; + agl::utl::Parameter FeatureFogColor; + agl::utl::Parameter CalcRayleigh; + agl::utl::Parameter CalcMieSymmetrical; + agl::utl::Parameter CalcMie; + agl::utl::Parameter CalcVolumeMaskIntencity; + agl::utl::Parameter BloomThreshhold; + agl::utl::Parameter BloomIntencity; + agl::utl::Parameter AddMoisture; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(WeatherInfluence, 0x160); + + struct Remains { + agl::utl::Parameter FeatureColor; + agl::utl::Parameter FeatureFogColor; + agl::utl::Parameter AddFog_near; + agl::utl::Parameter AddFog_far; + agl::utl::Parameter AddFog_ratio; + agl::utl::Parameter SfParam_near; + agl::utl::Parameter SfParam_attenuation; + agl::utl::Parameter CalcRayleigh; + agl::utl::Parameter CalcMieSymmetrical; + agl::utl::Parameter CalcMie; + agl::utl::Parameter BloomThreshhold; + agl::utl::Parameter BloomIntencity; + agl::utl::Parameter CalcVolumeMaskIntencity; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(Remains, 0x1e0); + + struct IndoorPalette { + agl::utl::Parameter FeatureColor; + agl::utl::Parameter CalcVolumeMaskIntencity; + agl::utl::Parameter BloomClampedLuminance; + agl::utl::Parameter BloomThreshhold; + agl::utl::Parameter BloomIntencity; + agl::utl::Parameter IndoorFogRatio; + agl::utl::Parameter IndoorFogStart; + agl::utl::Parameter IndoorFogEnd; + agl::utl::Parameter 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 mEnvPalettes; + sead::SafeArray mCdanAddFog; + EnvPaletteStatic mEnvPaletteStaticUnused; + sead::SafeArray mEnvAttributes; + sead::SafeArray mWeatherInfluences; + sead::SafeArray 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);