diff --git a/FretBuzz/FretBuzzFramework/framework/components/gameobject_components/audio_source.cpp b/FretBuzz/FretBuzzFramework/framework/components/gameobject_components/audio_source.cpp index 52fa761..d7760d1 100644 --- a/FretBuzz/FretBuzzFramework/framework/components/gameobject_components/audio_source.cpp +++ b/FretBuzz/FretBuzzFramework/framework/components/gameobject_components/audio_source.cpp @@ -62,14 +62,7 @@ namespace FRETBUZZ void AudioSource::play() { - if (m_pISound != nullptr) - { - m_pISound->setIsPaused(false); - } - else - { - restart(); - } + restart(); } void AudioSource::restart() diff --git a/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.cpp b/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.cpp index d49ffad..79adea6 100644 --- a/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.cpp +++ b/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.cpp @@ -23,6 +23,9 @@ namespace ns_HMGame m_pLegsSpriteAnimator = a_pLegsGameObject->getComponent(FRETBUZZ::COMPONENT_TYPE::SPRITE_ANIMATION_CONTROLLER); m_pUpperSpriteAnimator = a_pPlayerUpperGameObj->getComponent(FRETBUZZ::COMPONENT_TYPE::SPRITE_ANIMATION_CONTROLLER); + + m_pPlayerAudSrc = m_GameObject.getComponent(FRETBUZZ::COMPONENT_TYPE::AUDIO_SOURCE); + m_pPlayerAudSrc->setLooping(false); } void PlayerControllerHM::update(const float& a_fDeltaTime) @@ -115,6 +118,13 @@ namespace ns_HMGame glm::vec3 l_v3PlayerPosition = m_GameObject.m_Transform.getWorldPosition(); m_WeaponData.fire(glm::vec2{l_v3PlayerPosition.x, l_v3PlayerPosition.y} +l_v2PlayerToMouseDirection * 150.0f, l_v2PlayerToMouseDirection, m_pPlayerUpperGameObj->m_Transform.getLocalRotation()); + std::string l_strAudID = m_WeaponData.getWeaponFireAudID(); + if (!l_strAudID.empty()) + { + m_pPlayerAudSrc->setAudioClip(l_strAudID); + m_pPlayerAudSrc->play(); + } + /*FRETBUZZ::Collider2D* l_pCollider2D = nullptr; glm::vec2 l_v2PlayerPosition = m_GameObject.m_Transform.getWorldPosition(); glm::vec2 l_v2MouseWorldPosition = l_v2PlayerPosition + l_MousePosition; @@ -140,6 +150,8 @@ namespace ns_HMGame m_WeaponData = WeaponManager::GetWeaponData(WEAPON_TYPE::WEAPON_UNARMED); m_pUpperSpriteAnimator->play(m_WeaponData.getWeaponAnimTrigger()); + m_pPlayerAudSrc->setAudioClip("WeaponThrow"); + m_pPlayerAudSrc->play(); } if (m_vectWeaponOver.size() > 0) @@ -147,6 +159,8 @@ namespace ns_HMGame m_WeaponData = m_vectWeaponOver[0]->getWeaponData(); m_pUpperSpriteAnimator->play(m_WeaponData.getWeaponAnimTrigger()); m_vectWeaponOver[0]->pickup(); + m_pPlayerAudSrc->setAudioClip("GunPickup"); + m_pPlayerAudSrc->play(); } APP_ERROR("Tracing weapon throw"); } diff --git a/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.h b/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.h index edd7cb5..f1a7a73 100644 --- a/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.h +++ b/FretBuzz/Sandbox/game/managers/player/PlayerControllerHM.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace ns_HMGame { @@ -33,6 +34,8 @@ namespace ns_HMGame WeaponData m_WeaponData; + FRETBUZZ::AudioSource* m_pPlayerAudSrc = nullptr; + int m_iWeaponOverCount = 0; void addToWeaponOver(Weapon* a_Weapon); diff --git a/FretBuzz/Sandbox/game/managers/weapon/weapon_data.cpp b/FretBuzz/Sandbox/game/managers/weapon/weapon_data.cpp index d1db9ce..bfbb676 100644 --- a/FretBuzz/Sandbox/game/managers/weapon/weapon_data.cpp +++ b/FretBuzz/Sandbox/game/managers/weapon/weapon_data.cpp @@ -6,23 +6,24 @@ namespace ns_HMGame { WeaponData::WeaponData(WEAPON_TYPE a_WeaponType) - : WeaponData{WeaponManager::GetWeaponData(a_WeaponType)} + : WeaponData{ WeaponManager::GetWeaponData(a_WeaponType) } { - + } WeaponData::WeaponData(const WeaponData& a_WeaponData) - : WeaponData{ a_WeaponData.m_WeaponAttackType, a_WeaponData.m_WeaponType, a_WeaponData.m_strAnimOverrideTrigger, a_WeaponData.m_strWeaponSpriteName, a_WeaponData.m_strBulletSpriteName } + : WeaponData{ a_WeaponData.m_WeaponAttackType, a_WeaponData.m_WeaponType, a_WeaponData.m_strAnimOverrideTrigger, a_WeaponData.m_strWeaponSpriteName, a_WeaponData.m_strBulletSpriteName, a_WeaponData.m_strWeaponFireAudID } { } - WeaponData::WeaponData(WEAPON_ATTACK_TYPE a_WeaponAttackType, WEAPON_TYPE a_WeaponType, std::string a_strAnimOverrideTrigger, std::string a_strSpriteName, std::string a_strBulletSpriteName) - : m_WeaponAttackType{ a_WeaponAttackType }, - m_WeaponType{a_WeaponType}, - m_strAnimOverrideTrigger{ a_strAnimOverrideTrigger }, - m_strWeaponSpriteName{ a_strSpriteName }, - m_strBulletSpriteName{ a_strBulletSpriteName } + WeaponData::WeaponData(WEAPON_ATTACK_TYPE a_WeaponAttackType, WEAPON_TYPE a_WeaponType, std::string a_strAnimOverrideTrigger, std::string a_strSpriteName, std::string a_strBulletSpriteName, std::string a_strWeaponFireAudID) + : m_WeaponAttackType{ a_WeaponAttackType }, + m_WeaponType{ a_WeaponType }, + m_strAnimOverrideTrigger{ a_strAnimOverrideTrigger }, + m_strWeaponSpriteName{ a_strSpriteName }, + m_strBulletSpriteName{ a_strBulletSpriteName }, + m_strWeaponFireAudID{ a_strWeaponFireAudID } { } @@ -39,6 +40,7 @@ namespace ns_HMGame m_strAnimOverrideTrigger = a_Other.m_strAnimOverrideTrigger; m_strWeaponSpriteName = a_Other.m_strWeaponSpriteName; m_strBulletSpriteName = a_Other.m_strBulletSpriteName; + m_strWeaponFireAudID = a_Other.m_strWeaponFireAudID; } WEAPON_TYPE WeaponData::getWeaponType() const @@ -66,6 +68,11 @@ namespace ns_HMGame return m_strBulletSpriteName; } + std::string WeaponData::getWeaponFireAudID() const + { + return m_strWeaponFireAudID; + } + void WeaponData::fire(glm::vec2 a_v2Position, glm::vec2 a_v2Direction, glm::quat a_quatRotation) { if (GUN == m_WeaponAttackType) diff --git a/FretBuzz/Sandbox/game/managers/weapon/weapon_data.h b/FretBuzz/Sandbox/game/managers/weapon/weapon_data.h index 9e2b4aa..e6aef42 100644 --- a/FretBuzz/Sandbox/game/managers/weapon/weapon_data.h +++ b/FretBuzz/Sandbox/game/managers/weapon/weapon_data.h @@ -16,7 +16,7 @@ namespace ns_HMGame WeaponData(WEAPON_TYPE a_WeaponType); WeaponData(const WeaponData& a_WeaponData); - WeaponData(WEAPON_ATTACK_TYPE a_WeaponAttackType, WEAPON_TYPE a_WeaponType, std::string a_strAnimOverrideTrigger, std::string a_strSpriteName, std::string a_strBulletSpriteName); + WeaponData(WEAPON_ATTACK_TYPE a_WeaponAttackType, WEAPON_TYPE a_WeaponType, std::string a_strAnimOverrideTrigger, std::string a_strSpriteName, std::string a_strBulletSpriteName, std::string a_strWeaponFireAudID); ~WeaponData(); WEAPON_TYPE getWeaponType() const; @@ -24,6 +24,7 @@ namespace ns_HMGame std::string getWeaponAnimTrigger() const; std::string getWeaponSpriteName() const; std::string getBulletSpriteName() const; + std::string getWeaponFireAudID() const; void fire(glm::vec2 a_v2Position, glm::vec2 a_v3Direction,glm::quat a_quatRotation); @@ -35,5 +36,6 @@ namespace ns_HMGame std::string m_strAnimOverrideTrigger; std::string m_strWeaponSpriteName; std::string m_strBulletSpriteName; + std::string m_strWeaponFireAudID; }; } \ No newline at end of file diff --git a/FretBuzz/Sandbox/game/managers/weapon/weapon_manger.cpp b/FretBuzz/Sandbox/game/managers/weapon/weapon_manger.cpp index 8cbc27e..1e6cc10 100644 --- a/FretBuzz/Sandbox/game/managers/weapon/weapon_manger.cpp +++ b/FretBuzz/Sandbox/game/managers/weapon/weapon_manger.cpp @@ -18,30 +18,30 @@ namespace ns_HMGame } s_pInstance = this; - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_UNARMED, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_UNARMED, "unarmedidle" , "" ,"") }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_GOLF_CLUB, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_GOLF_CLUB, "" , "weapon_pickup|weapon_golf_club" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_PIPE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_PIPE, "pipeidle" , "weapon_pickup|weapon_pipe" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BAT, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_BAT, "batidle" , "weapon_pickup|weapon_bat" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_KNIFE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_KNIFE, "knifeidle" , "weapon_pickup|weapon_knife" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_M16, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_M16, "m16idle" , "weapon_pickup|weapon_M16" ,"weapon_pickup|bullet_m16" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SHOTGUN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_SHOTGUN, "" , "weapon_pickup|weapon_shotgun" ,"weapon_pickup|bullet_shotgun" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_DOUBLE_BARREL, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_DOUBLE_BARREL, "doublebarrelidle" , "weapon_pickup|weapon_doublebarrel" ,"weapon_pickup|bullet_shotgun" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_KATANA, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_KATANA, "" , "weapon_pickup|weapon_katana" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BOTTLE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_BOTTLE, "" , "weapon_pickup|weapon_bottle" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MAGNUM, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_MAGNUM, "magnumidle" , "weapon_pickup|weapon_magnum" ,"weapon_pickup|bullet_shotgun" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_UNARMED, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_UNARMED, "unarmedidle" , "" ,"" ,"") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_GOLF_CLUB, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_GOLF_CLUB, "" , "weapon_pickup|weapon_golf_club" ,"" ,"") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_PIPE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_PIPE, "pipeidle" , "weapon_pickup|weapon_pipe" ,"" ,"") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BAT, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_BAT, "batidle" , "weapon_pickup|weapon_bat" ,"" ,"") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_KNIFE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_KNIFE, "knifeidle" , "weapon_pickup|weapon_knife" ,"" ,"") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_M16, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_M16, "m16idle" , "weapon_pickup|weapon_M16" ,"weapon_pickup|bullet_m16" , "FireM16") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SHOTGUN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_SHOTGUN, "" , "weapon_pickup|weapon_shotgun" ,"weapon_pickup|bullet_shotgun", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_DOUBLE_BARREL, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_DOUBLE_BARREL, "doublebarrelidle" , "weapon_pickup|weapon_doublebarrel" ,"weapon_pickup|bullet_shotgun", "FireDoubleBarrell" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_KATANA, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_KATANA, "" , "weapon_pickup|weapon_katana" ,"", "") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BOTTLE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_BOTTLE, "" , "weapon_pickup|weapon_bottle" ,"", "") }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MAGNUM, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::GUN, WEAPON_TYPE::WEAPON_MAGNUM, "magnumidle" , "weapon_pickup|weapon_magnum" ,"weapon_pickup|bullet_shotgun", "") }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MACHETE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_MACHETE, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_CAN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_CAN, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SUBMACHINE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SUBMACHINE, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_HAMMER, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_HAMMER, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SHURIKEN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SHURIKEN, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_DART, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_DART, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MP5, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_MP5, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_AXE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_AXE, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SCISSORS, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SCISSORS, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SILENCER, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SILENCER, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_UZI, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_UZI, "unarmedidle" ,"" ,"" ) }); - m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BRICK, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_BRICK, "unarmedidle" ,"" ,"" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MACHETE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_MACHETE, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_CAN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_CAN, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SUBMACHINE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SUBMACHINE, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_HAMMER, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_HAMMER, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SHURIKEN, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SHURIKEN, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_DART, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_DART, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_MP5, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_MP5, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_AXE, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_AXE, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SCISSORS, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SCISSORS, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_SILENCER, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_SILENCER, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_UZI, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_UZI, "unarmedidle" ,"" ,"", "" ) }); + m_WeaponMap.insert({ WEAPON_TYPE::WEAPON_BRICK, WeaponData(WeaponData::WEAPON_ATTACK_TYPE::MELEE, WEAPON_TYPE::WEAPON_BRICK, "unarmedidle" ,"" ,"", "" ) }); } diff --git a/FretBuzz/Sandbox/game/prefab/prefab_player.cpp b/FretBuzz/Sandbox/game/prefab/prefab_player.cpp index f64f4d9..d7de0a2 100644 --- a/FretBuzz/Sandbox/game/prefab/prefab_player.cpp +++ b/FretBuzz/Sandbox/game/prefab/prefab_player.cpp @@ -26,8 +26,9 @@ namespace ns_HMGame l_RectColliderData.m_CollisionMask.addLayers(std::vector{"BOUNDARY", "PICKUP", "BULLET"}); l_RectColliderData.m_CategoryMask.addLayers(std::vector{"PLAYER"}); - this->addComponent(l_RectColliderData); - this->addComponent(l_pCamGameObj, l_pPlayerUpperGameObj, l_pPlayerLowerGameObj); + addComponent(l_RectColliderData); + addComponent("GunPickup", false); + addComponent(l_pCamGameObj, l_pPlayerUpperGameObj, l_pPlayerLowerGameObj); s_pInstance = this; } diff --git a/FretBuzz/Sandbox/resources/assets/audio/audio.xml b/FretBuzz/Sandbox/resources/assets/audio/audio.xml index b03c10a..0c228c0 100644 --- a/FretBuzz/Sandbox/resources/assets/audio/audio.xml +++ b/FretBuzz/Sandbox/resources/assets/audio/audio.xml @@ -4,7 +4,11 @@