From adf8545b6efa4aac36c0c971adc2f15566803d35 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Sat, 6 Jan 2024 20:22:33 +0100 Subject: [PATCH] Add wood punch sound --- CMakeLists.txt | 2 ++ assets/sounds/wood hit 17.wav | Bin 0 -> 40464 bytes game/main.c | 38 +++++++++++++++++++++++++--------- game/sounds.c | 17 +++++++++++++++ game/sounds.h | 30 +++++++++++++++++++++++++++ game/systems/s_event.c | 5 ++++- 6 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 assets/sounds/wood hit 17.wav create mode 100644 game/sounds.c create mode 100644 game/sounds.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a9bbd15..2df3dee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,8 @@ add_executable(PixelDefense game/map_layers.h game/pathfinding.c game/pathfinding.h + game/sounds.c + game/sounds.h game/ui_widgets.c game/ui_widgets.h game/unit_actions.c diff --git a/assets/sounds/wood hit 17.wav b/assets/sounds/wood hit 17.wav new file mode 100644 index 0000000000000000000000000000000000000000..5561959381ae11b8574a0554aa85dad14da24903 GIT binary patch literal 40464 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 literal 0 HcmV?d00001 diff --git a/game/main.c b/game/main.c index 14dda48..4533a40 100644 --- a/game/main.c +++ b/game/main.c @@ -16,10 +16,12 @@ #include "unit_actions.h" #include "pathfinding.h" +#include "sounds.h" ECS_COMPONENT_DECLARE(Game); ECS_COMPONENT_DECLARE(InputState); +ECS_COMPONENT_DECLARE(SoundState); BzUI *UI = NULL; ecs_world_t *ECS = NULL; @@ -180,18 +182,29 @@ bool init(void *userData) { }, }); - ECS_COMPONENT_DEFINE(ECS, InputState); - ecs_singleton_set(ECS, InputState, {}); - InputState *input = ecs_singleton_get_mut(ECS, InputState); + { + ECS_COMPONENT_DEFINE(ECS, InputState); + ecs_singleton_set(ECS, InputState, {}); + InputState *input = ecs_singleton_get_mut(ECS, InputState); - input->mapping = inputDefaultMapping(); + input->mapping = inputDefaultMapping(); - // Create queries - input->queries.selected = ecs_query(ECS, { - .filter.terms = { - { ecs_id(Position) }, { ecs_id(Size) }, { ecs_id(Selected) } - } - }); + // Create queries + input->queries.selected = ecs_query(ECS, { + .filter.terms = { + {ecs_id(Position)}, + {ecs_id(Size)}, + {ecs_id(Selected)} + } + }); + } + { + InitAudioDevice(); + ECS_COMPONENT_DEFINE(ECS, SoundState); + ecs_singleton_set(ECS, SoundState, {}); + SoundState *sounds = ecs_singleton_get_mut(ECS, SoundState); + soundsLoad(sounds, SOUND_WOOD_PUNCH, 0.1f, "assets/sounds/wood hit 17.wav"); + } game->stackAlloc = bzStackAllocCreate(10 * 1000 * 1000); // 10 MB // init pools @@ -230,6 +243,7 @@ void deinit(void *userData) { BZ_UNUSED(userData); Game *game = ecs_singleton_get_mut(ECS, Game); InputState *input = ecs_singleton_get_mut(ECS, InputState); + SoundState *sounds = ecs_singleton_get_mut(ECS, SoundState); unloadMap(game); @@ -239,6 +253,7 @@ void deinit(void *userData) { Game gameCopy = *game; InputState inputCopy = *input; + SoundState soundsCopy = *sounds; // Destroy ECS ecs_fini(ECS); @@ -246,6 +261,7 @@ void deinit(void *userData) { game = &gameCopy; input = &inputCopy; + sounds = &soundsCopy; bzTilesetDestroy(&game->tileset); @@ -255,6 +271,8 @@ void deinit(void *userData) { bzArrayDestroy(game->drawData); + soundsUnloadAll(sounds); + bzUIDestroy(UI); UI = NULL; diff --git a/game/sounds.c b/game/sounds.c new file mode 100644 index 0000000..01c1848 --- /dev/null +++ b/game/sounds.c @@ -0,0 +1,17 @@ +#include "sounds.h" + +void soundsLoad(SoundState *sounds, SoundType type, f32 interval, const char *path) { + Sound newSound = LoadSound(path); + sounds->sounds[type] = newSound; + sounds->soundInterval[type] = interval; + sounds->playing = newSound; +} +void soundsPlay(SoundState *sounds, SoundType type) { + PlaySound(sounds->playing); +} + +void soundsUnloadAll(SoundState *sounds) { + for (i32 i = 0; i < SOUND_COUNT; i++) { + UnloadSound(sounds->sounds[i]); + } +} diff --git a/game/sounds.h b/game/sounds.h new file mode 100644 index 0000000..10e33ba --- /dev/null +++ b/game/sounds.h @@ -0,0 +1,30 @@ +#ifndef PIXELDEFENSE_SOUNDS_H +#define PIXELDEFENSE_SOUNDS_H + +#include +#include +#include + +typedef enum SoundType { + SOUND_WOOD_PUNCH, + SOUND_COUNT +} SoundType; + +typedef struct SoundState { + Sound sounds[SOUND_COUNT]; + Sound playing; + // How long it needs to wait, + // before playing the same sound + f32 soundInterval[SOUND_COUNT]; +} SoundState; + +void soundsLoad(SoundState *sounds, SoundType type, f32 interval, const char *path); +void soundsPlay(SoundState *sounds, SoundType type); + +void soundsUnloadAll(SoundState *sounds); + +extern ECS_COMPONENT_DECLARE(SoundState); // defined in main.c + + + +#endif //PIXELDEFENSE_SOUNDS_H diff --git a/game/systems/s_event.c b/game/systems/s_event.c index 6d5f0b5..2819171 100644 --- a/game/systems/s_event.c +++ b/game/systems/s_event.c @@ -1,6 +1,7 @@ #include "systems.h" #include "../game_state.h" +#include "../sounds.h" i32 harvestEvent(ecs_entity_t entity, HarvestEvent event) { BZ_ASSERT(ecs_has_id(ECS, entity, Harvestable)); @@ -10,13 +11,15 @@ i32 harvestEvent(ecs_entity_t entity, HarvestEvent event) { .compID = ecs_id(Rotation), .memberOffset = 0, .easingFunc = BZ_EASE_OUT_ELASTIC, - .duration = 0.4f, + .duration = 0.6f, // 45 * (1.0f + (-1.0f) * x) .target = 45, .easeTarget = -1.0f, .easeStart = 1.0f }); + SoundState *sounds = ecs_singleton_get_mut(ECS, SoundState); + soundsPlay(sounds, SOUND_WOOD_PUNCH); Resource *res = ecs_get_mut(ECS, entity, Resource); event.amount = BZ_MIN(event.amount, res->amount);