diff --git a/resources/chest.mp3 b/resources/chest.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..38da43be5842df80853aa116a5e17a6ca67737cc
Binary files /dev/null and b/resources/chest.mp3 differ
diff --git a/resources/exit.mp3 b/resources/exit.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..01f0acaca56f62973a5d10a2c3f6261eb58a8b4e
Binary files /dev/null and b/resources/exit.mp3 differ
diff --git a/resources/kill.wav b/resources/kill.wav
new file mode 100644
index 0000000000000000000000000000000000000000..bf0f57b000798c12fc6d60242bda96823ae30196
Binary files /dev/null and b/resources/kill.wav differ
diff --git a/src/game_state.rs b/src/game_state.rs
index 5fcd438503ea9567cce8eeca1d86edf388972b6a..f96f68e445184a2c9ce909700c78351621b97931 100644
--- a/src/game_state.rs
+++ b/src/game_state.rs
@@ -72,7 +72,7 @@ impl GameState {
 impl State for GameState {
     fn update(&mut self, ctx: &mut Context) -> tetra::Result {
         if self.handle_user_turn(ctx) {
-            self.run_enemy_turn();
+            self.run_enemy_turn(ctx);
             self.finish_turn();
         }
 
@@ -97,32 +97,32 @@ impl State for GameState {
 // SOUNDS
 
 impl GameState {
-    fn play_sound_player_attack(&mut self) {
-
+    fn play_sound_player_attack(&mut self, ctx: &mut Context) {
+        self.sounds.hit.play(ctx);
     }
 
-    fn play_sound_enemy_attack(&mut self) {
-
+    fn play_sound_enemy_attack(&mut self, ctx: &mut Context) {
+        self.sounds.hit.play(ctx);
     }
 
-    fn play_sound_killed_enemy(&mut self) {
-
+    fn play_sound_killed_enemy(&mut self, ctx: &mut Context) {
+        self.sounds.kill.play(ctx);
     }
 
-    fn play_sound_death(&mut self) {
-
+    fn play_sound_death(&mut self, ctx: &mut Context) {
+        self.sounds.gameover.play(ctx);
     }
 
-    fn play_sound_chest(&mut self) {
-
+    fn play_sound_chest(&mut self, ctx: &mut Context) {
+        self.sounds.chest.play(ctx);
     }
 
-    fn play_sound_level_up(&mut self) {
-
+    fn play_sound_level_up(&mut self, ctx: &mut Context) {
+        self.sounds.fanfare.play(ctx);
     }
 
-    fn play_sound_exit(&mut self) {
-
+    fn play_sound_exit(&mut self, ctx: &mut Context) {
+        self.sounds.exit.play(ctx);
     }
 }
 
@@ -146,7 +146,7 @@ impl GameState {
             Key::N => !is_player_alive && self.create_new_run(),
             Key::W | Key::A | Key::S | Key::D | Key::Down | Key::Up | Key::Right | Key::Left => {
                 self.current_run.combat_log.level_up = false;
-                return is_player_alive && !is_treasure_choice && self.handle_user_movement(key);
+                return is_player_alive && !is_treasure_choice && self.handle_user_movement(key, ctx);
             }
             Key::Space => {
                 self.current_run.combat_log.level_up = false;
@@ -203,7 +203,7 @@ impl GameState {
         false
     }
 
-    fn handle_user_movement(&mut self, key: Key) -> bool {
+    fn handle_user_movement(&mut self, key: Key, ctx: &mut Context) -> bool {
         let player_position = self.current_run.level.get_player_position();
         let target_position = GameState::calculate_target_position(player_position, key);
 
@@ -218,50 +218,50 @@ impl GameState {
                 self.current_run.combat_log.player_action = Option::from(Move);
             }
             Tile::Wall => return false,
-            Tile::Enemy(id) => self.attack_enemy(id, target_position),
-            Tile::Exit => return self.progress_level(),
-            Tile::Treasure(a, b) => return self.open_chest(a, b, target_position),
+            Tile::Enemy(id) => self.attack_enemy(id, target_position, ctx),
+            Tile::Exit => return self.progress_level(ctx),
+            Tile::Treasure(a, b) => return self.open_chest(a, b, target_position, ctx),
             _ => ()
         }
         true
     }
 
-    fn open_chest(&mut self, option_a: TreasureType, option_b: TreasureType, position: Point) -> bool {
+    fn open_chest(&mut self, option_a: TreasureType, option_b: TreasureType, position: Point, ctx: &mut Context) -> bool {
         self.current_run.level.move_player_to(position);
         self.current_run.combat_log.treasure_choice = Option::from((option_a, option_b));
-        self.play_sound_chest();
+        self.play_sound_chest(ctx);
         false
     }
 
-    fn progress_level(&mut self) -> bool {
+    fn progress_level(&mut self, ctx: &mut Context) -> bool {
         self.current_run.level_count += 1;
         if self.current_run.player.current_hp < self.current_run.player.max_hp {
             self.current_run.player.current_hp += config::LEVEL_HEAL;
         }
         self.current_run.level = Level::new(self.current_run.level_count);
         self.current_run.combat_log.player_action = Option::from(PlayerAction::Level);
-        self.play_sound_exit();
+        self.play_sound_exit(ctx);
         false
     }
 
-    fn attack_enemy(&mut self, enemy_id: usize, enemy_position: Point) {
+    fn attack_enemy(&mut self, enemy_id: usize, enemy_position: Point, ctx: &mut Context) {
         let damage = self.current_run.player.strength + GameState::roll_dice(self.current_run.player.weapon);
 
         if let Some(enemy) = self.current_run.level.enemies.get_mut(enemy_id) {
             if enemy.hp <= damage {
                 self.current_run.level.move_player_to(enemy_position);
                 self.current_run.combat_log.player_action = Option::from(PlayerAction::Attack(damage, 0));
-                self.play_sound_killed_enemy();
-                self.grant_xp();
+                self.play_sound_killed_enemy(ctx);
+                self.grant_xp(ctx);
             } else {
                 enemy.hp -= damage;
                 self.current_run.combat_log.player_action = Option::from(PlayerAction::Attack(damage, enemy.hp));
-                self.play_sound_player_attack();
+                self.play_sound_player_attack(ctx);
             }
         }
     }
 
-    fn grant_xp(&mut self) {
+    fn grant_xp(&mut self, ctx: &mut Context) {
         self.current_run.player.current_xp += 1;
         if self.current_run.player.current_xp == self.current_run.player.max_xp {
             self.current_run.player.strength += 1;
@@ -271,7 +271,7 @@ impl GameState {
             self.current_run.player.max_xp += 2;
             self.current_run.player.current_xp = 0;
             self.current_run.combat_log.level_up = true;
-            self.play_sound_level_up();
+            self.play_sound_level_up(ctx);
         }
     }
 
@@ -314,14 +314,14 @@ impl GameState {
 // ENEMY TURN
 
 impl GameState {
-    fn run_enemy_turn(&mut self) {
+    fn run_enemy_turn(&mut self, ctx: &mut Context) {
         let player_position = self.current_run.level.get_player_position();
 
         let mut total_damage = 0;
 
         for (id, position) in self.current_run.level.get_current_enemies() {
             if GameState::check_is_neighbor(player_position, position) {
-                total_damage += self.attack_player(id);
+                total_damage += self.attack_player(id, ctx);
             } else {
                 self.move_enemy(id, position);
             }
@@ -360,17 +360,17 @@ impl GameState {
         false
     }
 
-    fn attack_player(&mut self, enemy_id: usize) -> usize {
+    fn attack_player(&mut self, enemy_id: usize, ctx: &mut Context) -> usize {
         let mut damage = 0;
 
         if let Some(enemy) = self.current_run.level.enemies.get(enemy_id) {
             damage = enemy.strength + GameState::roll_dice(enemy.weapon_strength);
             if self.current_run.player.current_hp <= damage {
                 self.current_run.player.current_hp = 0;
-                self.play_sound_death();
+                self.play_sound_death(ctx);
             } else {
                 self.current_run.player.current_hp -= damage;
-                self.play_sound_enemy_attack();
+                self.play_sound_enemy_attack(ctx);
             }
         }
 
diff --git a/src/game_state/sounds.rs b/src/game_state/sounds.rs
index 322cef5f2d090787c80f0526d2fcf6127516c156..c21c42edb6ec01ef075611b7dea48c1f53a633e1 100644
--- a/src/game_state/sounds.rs
+++ b/src/game_state/sounds.rs
@@ -5,6 +5,9 @@ pub struct Sounds {
     pub hit: Sound,
     pub fanfare: Sound,
     pub gameover: Sound,
+    pub exit: Sound,
+    pub chest: Sound,
+    pub kill: Sound,
 }
 
 impl Sounds {
@@ -14,6 +17,9 @@ impl Sounds {
             hit: Sound::new("./resources/hit.wav")?,
             fanfare: Sound::new("./resources/fanfare.wav")?,
             gameover: Sound::new("./resources/gameover.wav")?,
+            exit: Sound::new("./resources/exit.mp3")?,
+            chest: Sound::new("./resources/chest.mp3")?,
+            kill: Sound::new("./resources/kill.wav")?,
         })
     }
 }
\ No newline at end of file