Move gClimateNext to GameState_t (#21231)

This commit is contained in:
Harry Hopkinson 2024-01-21 17:22:57 +00:00 committed by GitHub
parent f55eeff2e0
commit 7ca5b1cd65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 40 additions and 34 deletions

View File

@ -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)

View File

@ -10,6 +10,7 @@
#pragma once
#include "Date.h"
#include "world/Climate.h"
#include "world/Location.hpp"
#include <array>
@ -24,6 +25,7 @@ namespace OpenRCT2
struct GameState_t
{
uint32_t CurrentTicks{};
ClimateState ClimateNext;
money64 Cash;
money64 InitialCash;
};

View File

@ -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);

View File

@ -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<WeatherLevel>(_s4.Rain);
gClimateNext.Temperature = _s4.TargetTemperature;
gClimateNext.Weather = WeatherType{ _s4.TargetWeather };
gClimateNext.WeatherEffect = WeatherEffectType::None;
gClimateNext.WeatherGloom = _s4.TargetWeatherGloom;
gClimateNext.Level = static_cast<WeatherLevel>(_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<WeatherLevel>(_s4.TargetRain);
}
void ImportScenarioNameDetails()

View File

@ -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<WeatherLevel>(_s6.CurrentWeatherLevel);
gClimateNext.Level = static_cast<WeatherLevel>(_s6.NextWeatherLevel);
gameState.ClimateNext.Level = static_cast<WeatherLevel>(_s6.NextWeatherLevel);
// News items
News::InitQueue();

View File

@ -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<ScClimateState> future_get() const
{
std::string weatherType = WeatherTypeToString(gClimateNext.Weather);
return std::make_shared<ScClimateState>(weatherType, gClimateNext.Temperature);
auto& gameState = OpenRCT2::GetGameState();
std::string weatherType = WeatherTypeToString(gameState.ClimateNext.Weather);
return std::make_shared<ScClimateState>(weatherType, gameState.ClimateNext.Temperature);
}
static void Register(duk_context* ctx)

View File

@ -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<WeatherLevel>(ClimateStepWeatherLevel(
static_cast<int8_t>(gClimateCurrent.Level), static_cast<int8_t>(gClimateNext.Level)));
static_cast<int8_t>(gClimateCurrent.Level), static_cast<int8_t>(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<uint8_t>(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;
}

View File

@ -72,7 +72,6 @@ struct ClimateState
extern ClimateType gClimate;
extern ClimateState gClimateCurrent;
extern ClimateState gClimateNext;
extern uint16_t gClimateUpdateTimer;
extern uint16_t gClimateLightningFlash;