From 4ed06b10b1026007bb869b2cea2cbbfadb4ec699 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 28 Oct 2024 19:46:55 -0400 Subject: [PATCH] Need the hit.wav to be mono, but now we have a sound we can move around, just not sure how to place it based on the visuals. --- assets/hit.wav | Bin 302406 -> 150630 bytes gui.cpp | 8 ++--- gui.hpp | 4 +-- meson.build | 3 ++ scratchpad/testragel.cpp | 70 ++++++++++++++++++++++++--------------- scratchpad/testragel.rl | 11 +++--- sound.cpp | 42 +++++++++++++++++++++++ sound.hpp | 21 ++++++++++++ status.txt | 1 - systems.cpp | 4 +++ tests/sound.cpp | 21 ++++++++++++ 11 files changed, 144 insertions(+), 41 deletions(-) create mode 100644 sound.cpp create mode 100644 sound.hpp create mode 100644 tests/sound.cpp diff --git a/assets/hit.wav b/assets/hit.wav index e64c5443cfaad800c5e03835aabc82598ddd52f2..83af3f4c5405991bc757fde380570ff1c20a9ebd 100644 GIT binary patch literal 150630 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%0AJqB~Ti&Sn{ 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 literal 302406 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 diff --git a/gui.cpp b/gui.cpp index dabd33e..0f44784 100644 --- a/gui.cpp +++ b/gui.cpp @@ -62,9 +62,6 @@ GUI::GUI() : { $font.loadFromFile("./assets/text.otf"); resize_map(BASE_MAP_FONT_SIZE); - int res = $hit_buf.loadFromFile("./assets/hit.wav"); - dbc::check(res, "failed to load hit.wav"); - $hit_sound.setBuffer($hit_buf); $ui_text.setFont($font); $ui_text.setPosition(0,0); @@ -261,7 +258,6 @@ void GUI::draw_screen(bool clear, float map_off_x, float map_off_y) { } void GUI::shake() { - $hit_sound.play(); for(int i = 0; i < 10; ++i) { int x = Random::uniform(-10,10); int y = Random::uniform(-10,10); @@ -318,6 +314,10 @@ void GUI::render_scene() { } int GUI::main() { + SoundManager sounds("./assets"); + sounds.load("hit", "hit.wav"); + $world.set(sounds); + configure_world(); create_renderer(); run_systems(); diff --git a/gui.hpp b/gui.hpp index a5458ba..d2a6462 100644 --- a/gui.hpp +++ b/gui.hpp @@ -1,5 +1,4 @@ #pragma once -#include #include #include #include @@ -13,6 +12,7 @@ #include #include "map.hpp" #include "dinkyecs.hpp" +#include "sound.hpp" using std::string; using ftxui::Canvas, ftxui::Component, ftxui::Screen; @@ -37,8 +37,6 @@ enum class Value { class GUI { Map $game_map; - sf::SoundBuffer $hit_buf; - sf::Sound $hit_sound; string $status_text = "NOT DEAD"; Component $document; Component $map_view; diff --git a/meson.build b/meson.build index e8f3673..757fda3 100644 --- a/meson.build +++ b/meson.build @@ -17,11 +17,13 @@ runtests = executable('runtests', [ 'dbc.cpp', 'map.cpp', 'rand.cpp', + 'sound.cpp', 'collider.cpp', 'tests/fsm.cpp', 'tests/dbc.cpp', 'tests/map.cpp', 'tests/collider.cpp', + 'tests/sound.cpp', ], dependencies: dependencies) @@ -31,6 +33,7 @@ roguish = executable('roguish', [ 'map.cpp', 'gui.cpp', 'rand.cpp', + 'sound.cpp', 'collider.cpp', 'combat.cpp', 'systems.cpp', diff --git a/scratchpad/testragel.cpp b/scratchpad/testragel.cpp index a8c2947..4bab31b 100644 --- a/scratchpad/testragel.cpp +++ b/scratchpad/testragel.cpp @@ -5,62 +5,68 @@ using namespace fmt; -#line 14 ".\\scratchpad\\testragel.rl" +#line 11 ".\\scratchpad\\testragel.rl" #line 8 ".\\scratchpad\\testragel.cpp" static const char _foo_actions[] = { - 0, 1, 0, 1, 1, 1, 2 + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5 }; static const char _foo_key_offsets[] = { - 0, 0, 1, 2, 4, 7, 9, 12, - 13 + 0, 0, 1, 3, 5, 8, 10, 13, + 14, 16, 19, 21, 24, 25 }; static const char _foo_trans_keys[] = { - 27, 91, 48, 57, 59, 48, 57, 48, - 57, 109, 48, 57, 0, 0 + 27, 65, 91, 48, 57, 59, 48, 57, + 48, 57, 109, 48, 57, 0, 48, 57, + 59, 48, 57, 48, 57, 109, 48, 57, + 0, 0 }; static const char _foo_single_lengths[] = { - 0, 1, 1, 0, 1, 0, 1, 1, - 0 + 0, 1, 2, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 1, 0 }; static const char _foo_range_lengths[] = { 0, 0, 0, 1, 1, 1, 1, 0, - 0 + 1, 1, 1, 1, 0, 0 }; static const char _foo_index_offsets[] = { - 0, 0, 2, 4, 6, 9, 11, 14, - 16 + 0, 0, 2, 5, 7, 10, 12, 15, + 17, 19, 22, 24, 27, 29 }; static const char _foo_indicies[] = { - 0, 1, 2, 1, 3, 1, 4, 3, - 1, 5, 1, 6, 5, 1, 7, 1, - 1, 0 + 0, 1, 2, 3, 1, 4, 1, 5, + 4, 1, 6, 1, 7, 6, 1, 8, + 1, 9, 1, 10, 9, 1, 11, 1, + 12, 11, 1, 13, 1, 1, 0 }; static const char _foo_trans_targs[] = { - 2, 0, 3, 4, 5, 6, 7, 8 + 2, 0, 3, 8, 4, 5, 6, 7, + 13, 9, 10, 11, 12, 13 }; static const char _foo_trans_actions[] = { - 0, 0, 0, 1, 0, 3, 0, 5 + 0, 0, 0, 0, 7, 0, 9, 0, + 11, 1, 0, 3, 0, 5 }; static const int foo_start = 1; -static const int foo_first_final = 8; +static const int foo_first_final = 13; static const int foo_error = 0; static const int foo_en_main = 1; -#line 17 ".\\scratchpad\\testragel.rl" +#line 14 ".\\scratchpad\\testragel.rl" int main() { int cs, res = 0; @@ -69,14 +75,14 @@ int main() { char *p = test; char *pe = p + strlen(p) + 1; -#line 64 ".\\scratchpad\\testragel.cpp" +#line 70 ".\\scratchpad\\testragel.cpp" { cs = foo_start; } -#line 25 ".\\scratchpad\\testragel.rl" +#line 22 ".\\scratchpad\\testragel.rl" -#line 67 ".\\scratchpad\\testragel.cpp" +#line 73 ".\\scratchpad\\testragel.cpp" { int _klen; unsigned int _trans; @@ -151,18 +157,30 @@ _match: switch ( *_acts++ ) { case 0: -#line 9 ".\\scratchpad\\testragel.rl" +#line 7 ".\\scratchpad\\testragel.rl" { println("NUM1"); } break; case 1: -#line 11 ".\\scratchpad\\testragel.rl" +#line 7 ".\\scratchpad\\testragel.rl" { println("NUM2"); } break; case 2: -#line 13 ".\\scratchpad\\testragel.rl" +#line 7 ".\\scratchpad\\testragel.rl" { res = 1; } break; -#line 149 ".\\scratchpad\\testragel.cpp" + case 3: +#line 8 ".\\scratchpad\\testragel.rl" + { println("NUM1"); } + break; + case 4: +#line 8 ".\\scratchpad\\testragel.rl" + { println("NUM2"); } + break; + case 5: +#line 8 ".\\scratchpad\\testragel.rl" + { res = 2; } + break; +#line 164 ".\\scratchpad\\testragel.cpp" } } @@ -175,7 +193,7 @@ _again: _out: {} } -#line 26 ".\\scratchpad\\testragel.rl" +#line 23 ".\\scratchpad\\testragel.rl" fmt::println("result = {}", res); return 0; diff --git a/scratchpad/testragel.rl b/scratchpad/testragel.rl index f9f535b..6eafa6a 100644 --- a/scratchpad/testragel.rl +++ b/scratchpad/testragel.rl @@ -4,13 +4,10 @@ using namespace fmt; %%{ machine foo; - main := - 0x1B "[" - [0-9]+ @{ println("NUM1"); } - ";" - [0-9]+ @{ println("NUM2"); } - "m" - 0 @{ res = 1; }; + test1 = 0x1B . "[" . [0-9]+ @{ println("NUM1"); } . ";" . [0-9]+ @{ println("NUM2"); } . "m" 0 @{ res = 1; }; + test2 = 0x1B "A" [0-9]+ @{ println("NUM1"); } ";" [0-9]+ @{ println("NUM2"); } "m" 0 @{ res = 2; }; + + main := (test1 | test2); }%% %% write data; diff --git a/sound.cpp b/sound.cpp new file mode 100644 index 0000000..cf4531a --- /dev/null +++ b/sound.cpp @@ -0,0 +1,42 @@ +#include "sound.hpp" +#include "dbc.hpp" +#include + +using namespace fmt; +namespace fs = std::filesystem; + +SoundManager::SoundManager(std::string base_path) : $base_path(base_path) { + dbc::check(fs::exists($base_path), "sound asset path is missing"); +} + +void SoundManager::load(const std::string name, const std::string sound_path) { + // get the sound file with base_path + fs::path full_path = $base_path / sound_path; + // confirm it's there + dbc::check(fs::exists(full_path), format("sound file {} does not exist", sound_path)); + + // create the buffer and keep in the buffer map + SoundPair *pair = new SoundPair(); + $sounds[name] = pair; + + bool good = pair->buffer.loadFromFile(full_path.string()); + dbc::check(good, format("failed to load sound {}", sound_path)); + + // set it on the sound and keep in the sound map + pair->sound.setBuffer(pair->buffer); + pair->sound.setRelativeToListener(true); +} + +void SoundManager::play(const std::string name) { + dbc::check($sounds.contains(name), format("sound {} is not loaded in map", name)); + // get the sound from the sound map + SoundPair *pair = $sounds.at(name); + // play it + pair->sound.play(); +} + +void SoundManager::playAt(const std::string name, float x, float y, float z) { + SoundPair *pair = $sounds.at(name); + pair->sound.setPosition(x, y, z); + pair->sound.play(); +} diff --git a/sound.hpp b/sound.hpp new file mode 100644 index 0000000..2eb5f4e --- /dev/null +++ b/sound.hpp @@ -0,0 +1,21 @@ +#pragma once +#include +#include +#include +#include + +struct SoundPair { + sf::SoundBuffer buffer; + sf::Sound sound; +}; + +struct SoundManager { + std::filesystem::path $base_path; + std::unordered_map $sounds; + + SoundManager(std::string base_path); + + void load(const std::string name, const std::string path); + void play(const std::string name); + void playAt(const std::string name, float x, float y, float z); +}; diff --git a/status.txt b/status.txt index 4e03869..09f4767 100644 --- a/status.txt +++ b/status.txt @@ -14,5 +14,4 @@ TODO: * Simple loot system. * Actually render FTXUI ansi output instead of the gui.cpp hack. -* Remove entity from world, _or_ mark them dead, switch their icon, and make them an entity the player walks over? * Bring back sounds, check out SoLoud. diff --git a/systems.cpp b/systems.cpp index bcc7a54..303fe3d 100644 --- a/systems.cpp +++ b/systems.cpp @@ -4,6 +4,7 @@ #include #include "rand.hpp" #include "collider.hpp" +#include "sound.hpp" using std::string; using namespace fmt; @@ -90,6 +91,7 @@ void System::combat(DinkyECS::World &world, Player &player) { const auto& player_position = world.component(player.entity); auto& player_combat = world.component(player.entity); auto& log = world.get(); + auto& sounds = world.get(); // this is guaranteed to not return the given position auto [found, nearby] = collider.neighbors(player_position.location); @@ -101,6 +103,7 @@ void System::combat(DinkyECS::World &world, Player &player) { if(player_dmg > 0) { log.log(format("You HIT for {} damage, HP left {}.", player_dmg, enemy_combat.hp)); + sounds.play("hit"); } else { log.log("You missed! They're quick!"); } @@ -109,6 +112,7 @@ void System::combat(DinkyECS::World &world, Player &player) { int enemy_dmg = enemy_combat.fight(player_combat); if(enemy_dmg > 0) { + sounds.play("hit"); log.log(format("Enemy HIT YOU for {} damage.", enemy_dmg)); } else { log.log("Enemy MISSED, you dodged it."); diff --git a/tests/sound.cpp b/tests/sound.cpp new file mode 100644 index 0000000..a39e4de --- /dev/null +++ b/tests/sound.cpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include "sound.hpp" +#include "dinkyecs.hpp" + +using DinkyECS::Entity; +using namespace fmt; + +TEST_CASE("confirm basic functionality", "[sounds]") { + REQUIRE_THROWS([&](){SoundManager sounds("./BADassets");}()); + + SoundManager sounds("./assets"); + + REQUIRE_THROWS(sounds.load("hit", "badfileDOESNOTEXIST.wav")); + REQUIRE_THROWS(sounds.play("hit")); + + sounds.load("hit", "hit.wav"); + sounds.play("hit"); + sounds.playAt("hit", 1, 1, 1); +}