diff options
author | Nemrav <> | 2024-08-01 23:17:24 +0200 |
---|---|---|
committer | Nemrav <> | 2024-08-03 21:32:56 +0200 |
commit | 0b4732befaaf4a742acb319256c535eb449668a7 (patch) | |
tree | cb7af6c0536e399b8122db6f16985a1f58377c9e /src/openvic-simulation | |
parent | 861acff78bd238232ed9e369ea046c2ed4a31198 (diff) |
Music and Sound Effect define loadingsim_music
sound and music pr feedback
more sound and music style fixes
check lookup path
Diffstat (limited to 'src/openvic-simulation')
-rw-r--r-- | src/openvic-simulation/DefinitionManager.hpp | 4 | ||||
-rw-r--r-- | src/openvic-simulation/GameManager.cpp | 17 | ||||
-rw-r--r-- | src/openvic-simulation/GameManager.hpp | 6 | ||||
-rw-r--r-- | src/openvic-simulation/dataloader/Dataloader.cpp | 44 | ||||
-rw-r--r-- | src/openvic-simulation/dataloader/Dataloader.hpp | 4 | ||||
-rw-r--r-- | src/openvic-simulation/misc/SongChance.cpp | 53 | ||||
-rw-r--r-- | src/openvic-simulation/misc/SongChance.hpp | 30 | ||||
-rw-r--r-- | src/openvic-simulation/misc/SoundEffect.cpp | 38 | ||||
-rw-r--r-- | src/openvic-simulation/misc/SoundEffect.hpp | 29 |
9 files changed, 213 insertions, 12 deletions
diff --git a/src/openvic-simulation/DefinitionManager.hpp b/src/openvic-simulation/DefinitionManager.hpp index 9b5bf21..f38beb0 100644 --- a/src/openvic-simulation/DefinitionManager.hpp +++ b/src/openvic-simulation/DefinitionManager.hpp @@ -13,6 +13,8 @@ #include "openvic-simulation/misc/Define.hpp" #include "openvic-simulation/misc/Event.hpp" #include "openvic-simulation/misc/Modifier.hpp" +#include "openvic-simulation/misc/SongChance.hpp" +#include "openvic-simulation/misc/SoundEffect.hpp" #include "openvic-simulation/politics/PoliticsManager.hpp" #include "openvic-simulation/pop/Pop.hpp" #include "openvic-simulation/research/ResearchManager.hpp" @@ -38,5 +40,7 @@ namespace OpenVic { MapDefinition PROPERTY_REF(map_definition); MapmodeManager PROPERTY_REF(mapmode_manager); ScriptManager PROPERTY_REF(script_manager); + SongChanceManager PROPERTY_REF(song_chance_manager); + SoundEffectManager PROPERTY_REF(sound_effect_manager); }; } diff --git a/src/openvic-simulation/GameManager.cpp b/src/openvic-simulation/GameManager.cpp index cd810ea..2577b54 100644 --- a/src/openvic-simulation/GameManager.cpp +++ b/src/openvic-simulation/GameManager.cpp @@ -11,9 +11,15 @@ GameManager::GameManager( new_clock_state_changed_callback ? std::move(new_clock_state_changed_callback) : []() {} }, definitions_loaded { false } {} -bool GameManager::load_definitions( - Dataloader::path_vector_t const& roots, Dataloader::localisation_callback_t localisation_callback -) { +bool GameManager::set_roots(Dataloader::path_vector_t const& roots) { + if (!dataloader.set_roots(roots)) { + Logger::error("Failed to set dataloader roots!"); + return false; + } + return true; +} + +bool GameManager::load_definitions(Dataloader::localisation_callback_t localisation_callback) { if (definitions_loaded) { Logger::error("Cannot load definitions - already loaded!"); return false; @@ -21,11 +27,6 @@ bool GameManager::load_definitions( bool ret = true; - if (!dataloader.set_roots(roots)) { - Logger::error("Failed to set dataloader roots!"); - ret = false; - } - if (!dataloader.load_defines(definition_manager)) { Logger::error("Failed to load defines!"); ret = false; diff --git a/src/openvic-simulation/GameManager.hpp b/src/openvic-simulation/GameManager.hpp index 0a24692..fdbcb6a 100644 --- a/src/openvic-simulation/GameManager.hpp +++ b/src/openvic-simulation/GameManager.hpp @@ -31,9 +31,9 @@ namespace OpenVic { return instance_manager ? &*instance_manager : nullptr; } - bool load_definitions( - Dataloader::path_vector_t const& roots, Dataloader::localisation_callback_t localisation_callback - ); + bool set_roots(Dataloader::path_vector_t const& roots); + + bool load_definitions(Dataloader::localisation_callback_t localisation_callback); bool setup_instance(Bookmark const* bookmark); diff --git a/src/openvic-simulation/dataloader/Dataloader.cpp b/src/openvic-simulation/dataloader/Dataloader.cpp index 77d0baa..b37a682 100644 --- a/src/openvic-simulation/dataloader/Dataloader.cpp +++ b/src/openvic-simulation/dataloader/Dataloader.cpp @@ -824,6 +824,41 @@ bool Dataloader::_load_map_dir(DefinitionManager& definition_manager) const { return ret; } +bool Dataloader::_load_song_chances(DefinitionManager& definition_manager) { + static constexpr std::string_view song_chance_file = "music/songs.txt"; + const fs::path path = lookup_file(song_chance_file, false); + + bool ret = true; + SongChanceManager& song_chance_manager = definition_manager.get_song_chance_manager(); + + if(path.empty()) { + Logger::info("No Songs.txt file to load"); + song_chance_manager.lock_song_chances(); + return true; + } + + ret &= song_chance_manager.load_songs_file(parse_defines_cached(path).get_file_node()); + + song_chance_manager.lock_song_chances(); + + return ret; +} + +bool Dataloader::_load_sound_effect_defines(DefinitionManager& definition_manager) const { + static constexpr std::string_view sfx_file = "interface/sound.sfx"; + const fs::path path = lookup_file(sfx_file); + + bool ret = true; + SoundEffectManager& sound_effect_manager = definition_manager.get_sound_effect_manager(); + + ret &= sound_effect_manager.load_sound_defines_file(parse_defines(path).get_file_node()); + + sound_effect_manager.lock_sound_effects(); + + return ret; + +} + bool Dataloader::load_defines(DefinitionManager& definition_manager) { if (roots.empty()) { Logger::error("Cannot load defines - Dataloader has no roots!"); @@ -1043,6 +1078,14 @@ bool Dataloader::load_defines(DefinitionManager& definition_manager) { Logger::error("Failed to load events!"); ret = false; } + if (!_load_song_chances(definition_manager)) { + Logger::error("Error while loading Song chances!"); + ret = false; + } + if (!_load_sound_effect_defines(definition_manager)) { + Logger::error("Failed to load sound effect defines"); + ret = false; + } if (!definition_manager.get_event_manager().load_on_action_file( parse_defines(lookup_file(on_actions_file)).get_file_node() )) { @@ -1087,6 +1130,7 @@ bool Dataloader::parse_scripts(DefinitionManager& definition_manager) const { PARSE_SCRIPTS("wargoal type", definition_manager.get_military_manager().get_wargoal_type_manager()); PARSE_SCRIPTS("decision", definition_manager.get_decision_manager()); PARSE_SCRIPTS("event", definition_manager.get_event_manager()); + PARSE_SCRIPTS("song chance", definition_manager.get_song_chance_manager()); return ret; } diff --git a/src/openvic-simulation/dataloader/Dataloader.hpp b/src/openvic-simulation/dataloader/Dataloader.hpp index 3c77cab..3f3f5b1 100644 --- a/src/openvic-simulation/dataloader/Dataloader.hpp +++ b/src/openvic-simulation/dataloader/Dataloader.hpp @@ -21,7 +21,7 @@ namespace OpenVic { using path_vector_t = std::vector<fs::path>; private: - path_vector_t roots; + path_vector_t PROPERTY(roots); std::vector<ovdl::v2script::Parser> cached_parsers; bool _load_interface_files(UIManager& ui_manager) const; @@ -33,6 +33,8 @@ namespace OpenVic { bool _load_inventions(DefinitionManager& definition_manager); bool _load_events(DefinitionManager& definition_manager); bool _load_map_dir(DefinitionManager& definition_manager) const; + bool _load_song_chances(DefinitionManager& definition_manager); + bool _load_sound_effect_defines(DefinitionManager& definition_manager) const; bool _load_decisions(DefinitionManager& definition_manager); bool _load_history(DefinitionManager& definition_manager, bool unused_history_file_warnings) const; diff --git a/src/openvic-simulation/misc/SongChance.cpp b/src/openvic-simulation/misc/SongChance.cpp new file mode 100644 index 0000000..4a99362 --- /dev/null +++ b/src/openvic-simulation/misc/SongChance.cpp @@ -0,0 +1,53 @@ +#include "SongChance.hpp" + +using namespace OpenVic; +using namespace OpenVic::NodeTools; + +SongChance::SongChance(size_t new_index, std::string_view new_filename, ConditionalWeight&& new_chance): +HasIdentifier { std::to_string(new_index) }, +file_name { new_filename }, +chance { std::move(new_chance) } +{} + +bool SongChance::parse_scripts(DefinitionManager const& definition_manager) { + return chance.parse_scripts(definition_manager); +} + +bool SongChanceManager::load_songs_file(ast::NodeCPtr root) { + bool ret = true; + + ret &= expect_dictionary_reserve_length( + song_chances, + [this](std::string_view key, ast::NodeCPtr value) -> bool { + if (key != "song") { + Logger::error("Invalid song declaration ", key); + return false; + } + std::string_view name {}; + ConditionalWeight chance { scope_t::COUNTRY, scope_t::COUNTRY, scope_t::NO_SCOPE }; + + bool ret = expect_dictionary_keys( + "name", ONE_EXACTLY, expect_string(assign_variable_callback(name)), + "chance", ONE_EXACTLY, chance.expect_conditional_weight(ConditionalWeight::BASE) + )(value); + + ret &= song_chances.add_item({song_chances.size(), name, std::move(chance) }); + return ret; + } + )(root); + + if(song_chances.size() == 0) { + Logger::error("No songs found in Songs.txt"); + return false; + } + + return ret; +} + +bool SongChanceManager::parse_scripts(DefinitionManager const& definition_manager) { + bool ret = true; + for (SongChance& songChance : song_chances.get_items()) { + ret &= songChance.parse_scripts(definition_manager); + } + return ret; +}
\ No newline at end of file diff --git a/src/openvic-simulation/misc/SongChance.hpp b/src/openvic-simulation/misc/SongChance.hpp new file mode 100644 index 0000000..f92af7a --- /dev/null +++ b/src/openvic-simulation/misc/SongChance.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include <openvic-simulation/types/IdentifierRegistry.hpp> +#include <openvic-simulation/scripts/ConditionalWeight.hpp> + +namespace OpenVic { + /*For music/Songs.txt if it exists*/ + struct SongChanceManager; + struct SongChance : HasIdentifier { + private: + friend struct SongChanceManager; + std::string PROPERTY(file_name); + ConditionalWeight PROPERTY(chance); + SongChance(size_t new_index, std::string_view new_filename, ConditionalWeight&& new_chance); + bool parse_scripts(DefinitionManager const& definition_manager); + + public: + SongChance(SongChance&&) = default; + }; + + struct SongChanceManager { + private: + IdentifierRegistry<SongChance> IDENTIFIER_REGISTRY(song_chance); + //Songs.txt + public: + bool load_songs_file(ast::NodeCPtr root); + bool parse_scripts(DefinitionManager const& definition_manager); + }; +} + diff --git a/src/openvic-simulation/misc/SoundEffect.cpp b/src/openvic-simulation/misc/SoundEffect.cpp new file mode 100644 index 0000000..df3196b --- /dev/null +++ b/src/openvic-simulation/misc/SoundEffect.cpp @@ -0,0 +1,38 @@ +#include "SoundEffect.hpp" + +using namespace OpenVic; +using namespace OpenVic::NodeTools; + +SoundEffect::SoundEffect ( + std::string_view new_identifier, std::string_view new_file, fixed_point_t new_volume +) : HasIdentifier { new_identifier }, file { new_file }, volume { new_volume } {} + +bool SoundEffectManager::_load_sound_define(std::string_view sfx_identifier, ast::NodeCPtr root) { + std::string_view file {}; + fixed_point_t volume = 1; + bool ret = expect_dictionary_keys( + "file", ONE_EXACTLY, expect_string(assign_variable_callback(file)), + "volume", ZERO_OR_ONE, + expect_fixed_point(assign_variable_callback(volume)) + )(root); + + if (sfx_identifier.empty()) { + Logger::error("Invalid sound identifier - empty!"); + return false; + } + if(file.empty()) { + Logger::error("Invalid sound file name - empty!"); + return false; + } + + ret &= sound_effects.add_item({sfx_identifier,file,volume}); + return ret; +} + +bool SoundEffectManager::load_sound_defines_file(ast::NodeCPtr root) { + return expect_dictionary_reserve_length(sound_effects, + [this](std::string_view key, ast::NodeCPtr value) -> bool { + return _load_sound_define(key,value); + } + )(root); +}
\ No newline at end of file diff --git a/src/openvic-simulation/misc/SoundEffect.hpp b/src/openvic-simulation/misc/SoundEffect.hpp new file mode 100644 index 0000000..7f18dce --- /dev/null +++ b/src/openvic-simulation/misc/SoundEffect.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include <openvic-simulation/types/fixed_point/FixedPoint.hpp> +#include <openvic-simulation/types/IdentifierRegistry.hpp> + +namespace OpenVic { + /*For interface/Sound.sfx */ + struct SoundEffectManager; + struct SoundEffect : HasIdentifier { + private: + friend struct SoundEffectManager; + std::string PROPERTY(file); + fixed_point_t PROPERTY(volume); + SoundEffect(std::string_view new_identifier, std::string_view new_file, fixed_point_t new_volume); + + public: + SoundEffect(SoundEffect&&) = default; + }; + + struct SoundEffectManager { + + private: + IdentifierRegistry<SoundEffect> IDENTIFIER_REGISTRY(sound_effect); + bool _load_sound_define(std::string_view sfx_identifier, ast::NodeCPtr root); + + public: + bool load_sound_defines_file(ast::NodeCPtr root); + }; +}
\ No newline at end of file |