From 0b4732befaaf4a742acb319256c535eb449668a7 Mon Sep 17 00:00:00 2001 From: Nemrav <> Date: Thu, 1 Aug 2024 18:17:24 -0300 Subject: Music and Sound Effect define loading sound and music pr feedback more sound and music style fixes check lookup path --- src/headless/main.cpp | 2 +- src/openvic-simulation/DefinitionManager.hpp | 4 ++ src/openvic-simulation/GameManager.cpp | 17 ++++---- src/openvic-simulation/GameManager.hpp | 6 +-- src/openvic-simulation/dataloader/Dataloader.cpp | 44 ++++++++++++++++++++ src/openvic-simulation/dataloader/Dataloader.hpp | 4 +- src/openvic-simulation/misc/SongChance.cpp | 53 ++++++++++++++++++++++++ src/openvic-simulation/misc/SongChance.hpp | 30 ++++++++++++++ src/openvic-simulation/misc/SoundEffect.cpp | 38 +++++++++++++++++ src/openvic-simulation/misc/SoundEffect.hpp | 29 +++++++++++++ 10 files changed, 214 insertions(+), 13 deletions(-) create mode 100644 src/openvic-simulation/misc/SongChance.cpp create mode 100644 src/openvic-simulation/misc/SongChance.hpp create mode 100644 src/openvic-simulation/misc/SoundEffect.cpp create mode 100644 src/openvic-simulation/misc/SoundEffect.hpp diff --git a/src/headless/main.cpp b/src/headless/main.cpp index 23b5c93..ecce333 100644 --- a/src/headless/main.cpp +++ b/src/headless/main.cpp @@ -26,8 +26,8 @@ static bool run_headless(Dataloader::path_vector_t const& roots, bool run_tests) }, nullptr }; Logger::info("===== Loading definitions... ====="); + ret &= game_manager.set_roots(roots); ret &= game_manager.load_definitions( - roots, [](std::string_view key, Dataloader::locale_t locale, std::string_view localisation) -> bool { return true; } 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; private: - path_vector_t roots; + path_vector_t PROPERTY(roots); std::vector 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 +#include + +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 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 +#include + +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 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 -- cgit v1.2.3-56-ga3b1