From 0ea842580cb46e87a271c2b8f6132b1eb0826c0e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 28 Feb 2025 18:48:21 +0300 Subject: [PATCH] add 'thunder_rate' weather property --- res/presets/weather/rain.json | 3 ++- src/graphics/render/Decorator.cpp | 20 ++++++++++++++++++++ src/graphics/render/Decorator.hpp | 1 + src/presets/WeatherPreset.cpp | 2 ++ src/presets/WeatherPreset.hpp | 5 ++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/res/presets/weather/rain.json b/res/presets/weather/rain.json index 56f35063..18b58f57 100644 --- a/res/presets/weather/rain.json +++ b/res/presets/weather/rain.json @@ -18,5 +18,6 @@ "fog_opacity": 0.8, "fog_dencity": 2.0, "fog_curve": 0.5, - "clouds": 0.5 + "clouds": 0.5, + "thunder_rate": 0.1 } diff --git a/src/graphics/render/Decorator.cpp b/src/graphics/render/Decorator.cpp index e1d1704b..188b7936 100644 --- a/src/graphics/render/Decorator.cpp +++ b/src/graphics/render/Decorator.cpp @@ -178,6 +178,26 @@ void Decorator::update( const WeatherPreset& weatherA, const WeatherPreset& weatherB ) { + float thunderRate = weatherA.thunderRate * weatherA.intensity + + weatherB.thunderRate * weatherB.intensity; + thunderTimer += delta; + util::PseudoRandom random(rand()); + if (thunderTimer >= 1.0f) { + thunderTimer = 0.0f; + if (random.randFloat() < thunderRate) { + audio::play( + assets.get("ambient/thunder"), + glm::vec3(), + false, + 1.0f, + 1.0f + random.randFloat() - 0.5f, + false, + audio::PRIORITY_NORMAL, + audio::get_channel_index("ambient") + ); + } + } + glm::ivec3 pos = camera.position; for (int i = 0; i < ITERATIONS; i++) { update(delta, pos - glm::ivec3(UPDATE_AREA_DIAMETER / 2), pos); diff --git a/src/graphics/render/Decorator.hpp b/src/graphics/render/Decorator.hpp index b29e7e5e..41b5007d 100644 --- a/src/graphics/render/Decorator.hpp +++ b/src/graphics/render/Decorator.hpp @@ -30,6 +30,7 @@ class Decorator { std::unordered_map playerTexts; int currentIndex = 0; NotePreset playerNamePreset {}; + float thunderTimer = 0.0f; void update( float delta, diff --git a/src/presets/WeatherPreset.cpp b/src/presets/WeatherPreset.cpp index d681878a..6077d1e7 100644 --- a/src/presets/WeatherPreset.cpp +++ b/src/presets/WeatherPreset.cpp @@ -23,6 +23,7 @@ dv::value WeatherPreset::serialize() const { root["fog_dencity"] = fogDencity; root["fog_curve"] = fogCurve; root["clouds"] = clouds; + root["thunder_rate"] = thunderRate; return root; } @@ -49,4 +50,5 @@ void WeatherPreset::deserialize(const dv::value& src) { src.at("fog_dencity").get(fogDencity); src.at("fog_curve").get(fogCurve); src.at("clouds").get(clouds); + src.at("thunder_rate").get(thunderRate); } diff --git a/src/presets/WeatherPreset.hpp b/src/presets/WeatherPreset.hpp index 69daf48e..4d1966c2 100644 --- a/src/presets/WeatherPreset.hpp +++ b/src/presets/WeatherPreset.hpp @@ -22,6 +22,7 @@ struct WeatherPreset : Serializable { /// @example if 0.8 then opacity range is 0.8-1.0 for 0.0-1.0 intensity float minOpacity = 0.0f; float maxOpacity = 1.0f; + /// @brief Clip texture by alpha channel bool opaque = false; /// @brief Fall splash std::optional splash; @@ -37,7 +38,9 @@ struct WeatherPreset : Serializable { float fogCurve = 1.0f; float clouds = 0.0f; - + + float thunderRate = 0.0f; + /// @brief Weather effects intensity float intensity = 1.0f;