From 7ca5b1cd65febc6113d8e4aa6a6ff05be6b0ab09 Mon Sep 17 00:00:00 2001 From: Harry Hopkinson <63599884+Harry-Hopkinson@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:22:57 +0000 Subject: [PATCH] Move gClimateNext to GameState_t (#21231) --- src/openrct2-ui/windows/GameBottomToolbar.cpp | 2 +- src/openrct2/GameState.h | 2 ++ src/openrct2/park/ParkFile.cpp | 4 +-- src/openrct2/rct1/S4Importer.cpp | 14 ++++---- src/openrct2/rct2/S6Importer.cpp | 10 +++--- .../scripting/bindings/world/ScClimate.hpp | 6 ++-- src/openrct2/world/Climate.cpp | 35 ++++++++++--------- src/openrct2/world/Climate.h | 1 - 8 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index 0ce1caeb99..2cc389b7e5 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -221,7 +221,7 @@ private: GfxDrawSprite(dpi, ImageId(currentWeatherSpriteId), screenCoords); // Next weather - auto nextWeatherSpriteId = ClimateGetWeatherSpriteId(gClimateNext); + auto nextWeatherSpriteId = ClimateGetWeatherSpriteId(GetGameState().ClimateNext); if (currentWeatherSpriteId != nextWeatherSpriteId) { if (gClimateUpdateTimer < 960) diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index 6a9de6ccb4..3a7ef1e5c2 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -10,6 +10,7 @@ #pragma once #include "Date.h" +#include "world/Climate.h" #include "world/Location.hpp" #include @@ -24,6 +25,7 @@ namespace OpenRCT2 struct GameState_t { uint32_t CurrentTicks{}; + ClimateState ClimateNext; money64 Cash; money64 InitialCash; }; diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 8d069df73c..8b576d70b5 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -780,11 +780,11 @@ namespace OpenRCT2 void ReadWriteClimateChunk(GameState_t& gameState, OrcaStream& os) { - os.ReadWriteChunk(ParkFileChunkType::CLIMATE, [](OrcaStream::ChunkStream& cs) { + os.ReadWriteChunk(ParkFileChunkType::CLIMATE, [&gameState](OrcaStream::ChunkStream& cs) { cs.ReadWrite(gClimate); cs.ReadWrite(gClimateUpdateTimer); - for (auto* cl : { &gClimateCurrent, &gClimateNext }) + for (auto* cl : { &gClimateCurrent, &gameState.ClimateNext }) { cs.ReadWrite(cl->Weather); cs.ReadWrite(cl->Temperature); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 646a5cc2dc..ed681a0344 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -184,7 +184,7 @@ namespace RCT1 ImportResearch(); ImportParkName(); ImportParkFlags(gameState); - ImportClimate(); + ImportClimate(gameState); ImportScenarioNameDetails(); ImportScenarioObjective(); ImportSavedView(); @@ -2276,7 +2276,7 @@ namespace RCT1 } } - void ImportClimate() + void ImportClimate(GameState_t& gameState) { gClimate = ClimateType{ _s4.Climate }; gClimateUpdateTimer = _s4.ClimateTimer; @@ -2285,11 +2285,11 @@ namespace RCT1 gClimateCurrent.WeatherEffect = WeatherEffectType::None; gClimateCurrent.WeatherGloom = _s4.WeatherGloom; gClimateCurrent.Level = static_cast(_s4.Rain); - gClimateNext.Temperature = _s4.TargetTemperature; - gClimateNext.Weather = WeatherType{ _s4.TargetWeather }; - gClimateNext.WeatherEffect = WeatherEffectType::None; - gClimateNext.WeatherGloom = _s4.TargetWeatherGloom; - gClimateNext.Level = static_cast(_s4.TargetRain); + gameState.ClimateNext.Temperature = _s4.TargetTemperature; + gameState.ClimateNext.Weather = WeatherType{ _s4.TargetWeather }; + gameState.ClimateNext.WeatherEffect = WeatherEffectType::None; + gameState.ClimateNext.WeatherGloom = _s4.TargetWeatherGloom; + gameState.ClimateNext.Level = static_cast(_s4.TargetRain); } void ImportScenarioNameDetails() diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 3d1ac44929..8b863b73cc 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -457,15 +457,15 @@ namespace RCT2 // Pad013CA747 gClimateUpdateTimer = _s6.ClimateUpdateTimer; gClimateCurrent.Weather = WeatherType{ _s6.CurrentWeather }; - gClimateNext.Weather = WeatherType{ _s6.NextWeather }; + gameState.ClimateNext.Weather = WeatherType{ _s6.NextWeather }; gClimateCurrent.Temperature = _s6.Temperature; - gClimateNext.Temperature = _s6.NextTemperature; + gameState.ClimateNext.Temperature = _s6.NextTemperature; gClimateCurrent.WeatherEffect = WeatherEffectType{ _s6.CurrentWeatherEffect }; - gClimateNext.WeatherEffect = WeatherEffectType{ _s6.NextWeatherEffect }; + gameState.ClimateNext.WeatherEffect = WeatherEffectType{ _s6.NextWeatherEffect }; gClimateCurrent.WeatherGloom = _s6.CurrentWeatherGloom; - gClimateNext.WeatherGloom = _s6.NextWeatherGloom; + gameState.ClimateNext.WeatherGloom = _s6.NextWeatherGloom; gClimateCurrent.Level = static_cast(_s6.CurrentWeatherLevel); - gClimateNext.Level = static_cast(_s6.NextWeatherLevel); + gameState.ClimateNext.Level = static_cast(_s6.NextWeatherLevel); // News items News::InitQueue(); diff --git a/src/openrct2/scripting/bindings/world/ScClimate.hpp b/src/openrct2/scripting/bindings/world/ScClimate.hpp index 2d2db1e2dd..11bb0f96ed 100644 --- a/src/openrct2/scripting/bindings/world/ScClimate.hpp +++ b/src/openrct2/scripting/bindings/world/ScClimate.hpp @@ -12,6 +12,7 @@ #ifdef ENABLE_SCRIPTING # include "../../../Context.h" +# include "../../../GameState.h" # include "../../../common.h" # include "../../../core/String.hpp" # include "../../../world/Climate.h" @@ -112,8 +113,9 @@ namespace OpenRCT2::Scripting std::shared_ptr future_get() const { - std::string weatherType = WeatherTypeToString(gClimateNext.Weather); - return std::make_shared(weatherType, gClimateNext.Temperature); + auto& gameState = OpenRCT2::GetGameState(); + std::string weatherType = WeatherTypeToString(gameState.ClimateNext.Weather); + return std::make_shared(weatherType, gameState.ClimateNext.Temperature); } static void Register(duk_context* ctx) diff --git a/src/openrct2/world/Climate.cpp b/src/openrct2/world/Climate.cpp index 0da3cdd536..a6f15858c9 100644 --- a/src/openrct2/world/Climate.cpp +++ b/src/openrct2/world/Climate.cpp @@ -56,7 +56,6 @@ extern const FilterPaletteID ClimateWeatherGloomColours[4]; // Climate data ClimateType gClimate; ClimateState gClimateCurrent; -ClimateState gClimateNext; uint16_t gClimateUpdateTimer; uint16_t gClimateLightningFlash; @@ -123,6 +122,8 @@ void ClimateUpdate() { PROFILED_FUNCTION(); + auto& gameState = GetGameState(); + // Only do climate logic if playing (not in scenario editor or title screen) if (gScreenFlags & (~SCREEN_FLAGS_PLAYING)) return; @@ -138,39 +139,40 @@ void ClimateUpdate() } gClimateUpdateTimer--; } - else if (!(GetGameState().CurrentTicks & 0x7F)) + else if (!(gameState.CurrentTicks & 0x7F)) { - if (gClimateCurrent.Temperature == gClimateNext.Temperature) + if (gClimateCurrent.Temperature == gameState.ClimateNext.Temperature) { - if (gClimateCurrent.WeatherGloom == gClimateNext.WeatherGloom) + if (gClimateCurrent.WeatherGloom == gameState.ClimateNext.WeatherGloom) { - gClimateCurrent.WeatherEffect = gClimateNext.WeatherEffect; + gClimateCurrent.WeatherEffect = gameState.ClimateNext.WeatherEffect; _thunderTimer = 0; _lightningTimer = 0; - if (gClimateCurrent.Level == gClimateNext.Level) + if (gClimateCurrent.Level == gameState.ClimateNext.Level) { - gClimateCurrent.Weather = gClimateNext.Weather; + gClimateCurrent.Weather = gameState.ClimateNext.Weather; ClimateDetermineFutureWeather(ScenarioRand()); auto intent = Intent(INTENT_ACTION_UPDATE_CLIMATE); ContextBroadcastIntent(&intent); } - else if (gClimateNext.Level <= WeatherLevel::Heavy) + else if (gameState.ClimateNext.Level <= WeatherLevel::Heavy) { gClimateCurrent.Level = static_cast(ClimateStepWeatherLevel( - static_cast(gClimateCurrent.Level), static_cast(gClimateNext.Level))); + static_cast(gClimateCurrent.Level), static_cast(gameState.ClimateNext.Level))); } } else { gClimateCurrent.WeatherGloom = ClimateStepWeatherLevel( - gClimateCurrent.WeatherGloom, gClimateNext.WeatherGloom); + gClimateCurrent.WeatherGloom, gameState.ClimateNext.WeatherGloom); GfxInvalidateScreen(); } } else { - gClimateCurrent.Temperature = ClimateStepWeatherLevel(gClimateCurrent.Temperature, gClimateNext.Temperature); + gClimateCurrent.Temperature = ClimateStepWeatherLevel( + gClimateCurrent.Temperature, gameState.ClimateNext.Temperature); auto intent = Intent(INTENT_ACTION_UPDATE_CLIMATE); ContextBroadcastIntent(&intent); } @@ -298,18 +300,19 @@ static int8_t ClimateStepWeatherLevel(int8_t currentWeatherLevel, int8_t nextWea static void ClimateDetermineFutureWeather(int32_t randomDistribution) { int32_t month = GetDate().GetMonth(); + auto& gameState = GetGameState(); // Generate a random variable with values 0 up to DistributionSize-1 and chose weather from the distribution table // accordingly const WeatherTransition* transition = &ClimateTransitions[static_cast(gClimate)][month]; WeatherType nextWeather = (transition->Distribution[((randomDistribution & 0xFF) * transition->DistributionSize) >> 8]); - gClimateNext.Weather = nextWeather; + gameState.ClimateNext.Weather = nextWeather; const auto nextWeatherState = &ClimateWeatherData[EnumValue(nextWeather)]; - gClimateNext.Temperature = transition->BaseTemperature + nextWeatherState->TemperatureDelta; - gClimateNext.WeatherEffect = nextWeatherState->EffectLevel; - gClimateNext.WeatherGloom = nextWeatherState->GloomLevel; - gClimateNext.Level = nextWeatherState->Level; + gameState.ClimateNext.Temperature = transition->BaseTemperature + nextWeatherState->TemperatureDelta; + gameState.ClimateNext.WeatherEffect = nextWeatherState->EffectLevel; + gameState.ClimateNext.WeatherGloom = nextWeatherState->GloomLevel; + gameState.ClimateNext.Level = nextWeatherState->Level; gClimateUpdateTimer = 1920; } diff --git a/src/openrct2/world/Climate.h b/src/openrct2/world/Climate.h index 8f76308b11..5d33db6c74 100644 --- a/src/openrct2/world/Climate.h +++ b/src/openrct2/world/Climate.h @@ -72,7 +72,6 @@ struct ClimateState extern ClimateType gClimate; extern ClimateState gClimateCurrent; -extern ClimateState gClimateNext; extern uint16_t gClimateUpdateTimer; extern uint16_t gClimateLightningFlash;