#pragma once #include #include #include #include namespace wowee { namespace pipeline { class AssetManager; } namespace audio { class MovementSoundManager { public: MovementSoundManager() = default; ~MovementSoundManager() = default; // Initialization bool initialize(pipeline::AssetManager* assets); void shutdown(); // Volume control void setVolumeScale(float scale); float getVolumeScale() const { return volumeScale_; } // Character size (for water splash intensity) enum class CharacterSize { SMALL, // Gnome, Dwarf MEDIUM, // Human, Night Elf, Undead, Troll, Blood Elf, Draenei LARGE, // Orc, Tauren GIANT // Large NPCs, bosses }; // Player race (for jump/land vocalizations) enum class PlayerRace { HUMAN_MALE, HUMAN_FEMALE, DWARF_MALE, DWARF_FEMALE, NIGHT_ELF_MALE, NIGHT_ELF_FEMALE, ORC_MALE, ORC_FEMALE, TAUREN_MALE, TAUREN_FEMALE, TROLL_MALE, TROLL_FEMALE, UNDEAD_MALE, UNDEAD_FEMALE, GNOME_MALE, GNOME_FEMALE }; // Water interaction sounds void playEnterWater(CharacterSize size); // Jumping into water void playWaterFootstep(CharacterSize size); // Walking/running in water // Jump/Land sounds (player vocalizations) void playJump(PlayerRace race); void playLand(PlayerRace race); private: struct MovementSample { std::string path; std::vector data; bool loaded; }; // Water splash sound libraries std::vector enterWaterSmallSounds_; std::vector enterWaterMediumSounds_; std::vector enterWaterGiantSounds_; std::vector waterFootstepSmallSounds_; std::vector waterFootstepMediumSounds_; std::vector waterFootstepHugeSounds_; // Jump/Land vocal libraries (all 16 race/gender combos) std::vector jumpHumanMaleSounds_; std::vector landHumanMaleSounds_; std::vector jumpHumanFemaleSounds_; std::vector landHumanFemaleSounds_; std::vector jumpDwarfMaleSounds_; std::vector landDwarfMaleSounds_; std::vector jumpDwarfFemaleSounds_; std::vector landDwarfFemaleSounds_; std::vector jumpNightElfMaleSounds_; std::vector landNightElfMaleSounds_; std::vector jumpNightElfFemaleSounds_; std::vector landNightElfFemaleSounds_; std::vector jumpOrcMaleSounds_; std::vector landOrcMaleSounds_; std::vector jumpOrcFemaleSounds_; std::vector landOrcFemaleSounds_; std::vector jumpTaurenMaleSounds_; std::vector landTaurenMaleSounds_; std::vector jumpTaurenFemaleSounds_; std::vector landTaurenFemaleSounds_; std::vector jumpTrollMaleSounds_; std::vector landTrollMaleSounds_; std::vector jumpTrollFemaleSounds_; std::vector landTrollFemaleSounds_; std::vector jumpUndeadMaleSounds_; std::vector landUndeadMaleSounds_; std::vector jumpUndeadFemaleSounds_; std::vector landUndeadFemaleSounds_; std::vector jumpGnomeMaleSounds_; std::vector landGnomeMaleSounds_; std::vector jumpGnomeFemaleSounds_; std::vector landGnomeFemaleSounds_; // State tracking float volumeScale_ = 1.0f; bool initialized_ = false; // Helper methods bool loadSound(const std::string& path, MovementSample& sample, pipeline::AssetManager* assets); void playSound(const std::vector& library, float volumeMultiplier = 1.0f); void playRandomSound(const std::vector& library, float volumeMultiplier = 1.0f); }; } // namespace audio } // namespace wowee