diff --git a/levels/Wicked Quest/1.json b/levels/Wicked Quest/1.json index fedc157..0c92f2d 100644 --- a/levels/Wicked Quest/1.json +++ b/levels/Wicked Quest/1.json @@ -164,5 +164,6 @@ "left": 0, "right": 200 }, + "ambience": "Escaping the Grave.ogg", "footstep_sound": "footstep_stone" } diff --git a/levels/Wicked Quest/2.json b/levels/Wicked Quest/2.json index 95b094e..0645b50 100644 --- a/levels/Wicked Quest/2.json +++ b/levels/Wicked Quest/2.json @@ -174,5 +174,6 @@ "left": 0, "right": 200 }, + "ambience": "Graveyard Blitz.ogg", "footstep_sound": "footstep_tall_grass" } diff --git a/levels/Wicked Quest/3.json b/levels/Wicked Quest/3.json index 6f6a8e9..2e7538d 100644 --- a/levels/Wicked Quest/3.json +++ b/levels/Wicked Quest/3.json @@ -248,5 +248,6 @@ "left": 0, "right": 200 }, + "ambience": "Wayward Ghouls.ogg", "footstep_sound": "footstep_tall_grass" } diff --git a/levels/Wicked Quest/4.json b/levels/Wicked Quest/4.json index 30a2f17..0b4100f 100644 --- a/levels/Wicked Quest/4.json +++ b/levels/Wicked Quest/4.json @@ -203,5 +203,6 @@ "left": 0, "right": 200 }, + "ambience": "Choir of Doom.ogg", "footstep_sound": "footstep_stone" } diff --git a/levels/Wicked Quest/5.json b/levels/Wicked Quest/5.json index 6fa4850..44b266f 100644 --- a/levels/Wicked Quest/5.json +++ b/levels/Wicked Quest/5.json @@ -187,5 +187,6 @@ "left": 0, "right": 200 }, + "ambience": "Choir of Doom.ogg", "footstep_sound": "footstep_stone" } diff --git a/levels/Wicked Quest/6.json b/levels/Wicked Quest/6.json index 775c5f1..89ec6e8 100644 --- a/levels/Wicked Quest/6.json +++ b/levels/Wicked Quest/6.json @@ -190,5 +190,6 @@ "left": 0, "right": 200 }, + "ambience": "Escaping the Grave.ogg", "footstep_sound": "footstep_tall_grass" } diff --git a/levels/Wicked Quest/7.json b/levels/Wicked Quest/7.json index eedcecb..f1a68a2 100644 --- a/levels/Wicked Quest/7.json +++ b/levels/Wicked Quest/7.json @@ -271,5 +271,6 @@ "left": 0, "right": 250 }, + "ambience": "Spider's Domain.ogg", "footstep_sound": "footstep_tall_grass" } diff --git a/sounds/ambience/Spider's Domain.ogg b/sounds/ambience/Spider's Domain.ogg new file mode 100644 index 0000000..a0d1c83 --- /dev/null +++ b/sounds/ambience/Spider's Domain.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0ec3ac28fec2769d542eda7d04b715b3da258a598b183ec6d74ddb8632c060f +size 1775002 diff --git a/sounds/ambience/Wayward Ghouls.ogg b/sounds/ambience/Wayward Ghouls.ogg new file mode 100644 index 0000000..efb8b3b --- /dev/null +++ b/sounds/ambience/Wayward Ghouls.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cbb1cee51e5c48bfcc79018ede647acd6b36eb85de0c671d3a4d96555e3dbd9 +size 2138739 diff --git a/src/level.py b/src/level.py index 7c00fa5..9a89dd0 100644 --- a/src/level.py +++ b/src/level.py @@ -34,6 +34,22 @@ class Level: # Pass footstep sound to player self.player.set_footstep_sound(self.footstepSound) + # Level intro message + levelIntro = f"Level {levelData['level_id']}, {levelData['name']}. {levelData['description']}" + messagebox(levelIntro) + + # Handle level music + try: + pygame.mixer.music.stop() + if "ambience" in levelData: + try: + pygame.mixer.music.load(f"sounds/ambience/{levelData['ambience']}") + pygame.mixer.music.play(-1) # Loop indefinitely + except: + pass + except: + pass + # Create end of level object at right boundary endLevel = Object( self.rightBoundary, diff --git a/src/player.py b/src/player.py index a4fd151..43aa0a7 100644 --- a/src/player.py +++ b/src/player.py @@ -177,6 +177,11 @@ class Player: self._lives -= 1 # Stop all current sounds before playing death sound pygame.mixer.stop() + try: + pygame.mixer.music.stop() + except: + pass + cut_scene(self.sounds, 'lose_a_life') def set_max_health(self, value): diff --git a/wicked_quest.py b/wicked_quest.py index e640d31..2d8950d 100644 --- a/wicked_quest.py +++ b/wicked_quest.py @@ -33,7 +33,8 @@ class WickedQuest: levelData["player_start"]["y"], self.sounds) else: - # Just update player position for new level + # Reset player for new level. + self.player.isDucking = False self.player.xPos = levelData["player_start"]["x"] self.player.yPos = levelData["player_start"]["y"] @@ -41,10 +42,6 @@ class WickedQuest: pygame.event.pump() self.currentLevel = Level(levelData, self.sounds, self.player) - # Announce level details - levelIntro = f"Level {levelData['level_id']}, {levelData['name']}. {levelData['description']}" - messagebox(levelIntro) - return True except FileNotFoundError: speak("Level not found") @@ -141,7 +138,13 @@ class WickedQuest: if key != 'Total time': # Skip time since we already displayed it report.append(f"{key}: {self.currentLevel.player.stats.get_level_stat(key)}") + # Stop all sounds and music pygame.mixer.stop() + try: + pygame.mixer.music.stop() + except: + pass + display_text(report) self.currentLevel.player.stats.reset_level() @@ -179,6 +182,10 @@ class WickedQuest: altPressed = mods & pygame.KMOD_ALT if event.key == pygame.K_ESCAPE: + try: + pygame.mixer.music.stop() + except: + pass return # Volume controls (require Alt) elif altPressed: @@ -232,7 +239,9 @@ class WickedQuest: else: # Game complete - use gameStartTime for total totalTime = pygame.time.get_ticks() - self.gameStartTime - messagebox("Congratulations! You've completed all available levels!") + if self.player.xPos >= self.currentLevel.rightBoundary: + messagebox("Congratulations! You've completed all available levels!") + self.display_game_over(totalTime) return @@ -240,6 +249,12 @@ class WickedQuest: def run(self): """Main game loop with menu system.""" + # make sure no music is playing when the menu loads. + try: + pygame.mixer.music.stop() + except: + pass + while True: choice = game_menu(self.sounds, "play", "instructions", "learn_sounds", "credits", "donate", "exit")