#!/usr/bin/env python3 import json import os from libstormgames import * from src.level import Level from src.object import Object from src.player import Player class WickedQuest: def __init__(self): self.sounds = initialize_gui("Wicked Quest") self.currentLevel = None def load_level(self, levelNumber): levelFile = f"levels/{levelNumber}.json" try: with open(levelFile, 'r') as f: levelData = json.load(f) self.currentLevel = Level(levelData, self.sounds) speak(f"Level {levelNumber} loaded") except FileNotFoundError: speak("Level not found") return False return True def handle_input(self): keys = pygame.key.get_pressed() player = self.currentLevel.player currentTime = pygame.time.get_ticks() # Calculate current speed based on jumping state currentSpeed = player.moveSpeed * 1.5 if player.isJumping else player.moveSpeed # Track movement distance for this frame movementDistance = 0 # Horizontal movement if keys[pygame.K_a]: # Left movementDistance = currentSpeed player.xPos -= currentSpeed player.facingRight = False elif keys[pygame.K_d]: # Right movementDistance = currentSpeed player.xPos += currentSpeed player.facingRight = True if keys[pygame.K_c]: speak(f"{player.get_coins()} coins") if keys[pygame.K_h]: speak(f"{player.get_health()} HP") if keys[pygame.K_l]: speak(f"{player.get_lives()} lives") if keys[pygame.K_f]: # Throw projectile self.currentLevel.throw_projectile() # Handle attack with either CTRL key if (keys[pygame.K_LCTRL] or keys[pygame.K_RCTRL]) and player.start_attack(currentTime): self.sounds[player.currentWeapon.attackSound].play() # Play footstep sounds if moving and not jumping if movementDistance > 0 and not player.isJumping: player.distanceSinceLastStep += movementDistance if player.distanceSinceLastStep >= player.stepDistance: self.sounds['footstep'].play() player.distanceSinceLastStep = 0 # Handle jumping if keys[pygame.K_w] and not player.isJumping: player.isJumping = True player.jumpStartTime = currentTime self.sounds['jump'].play() # Check if jump should end if player.isJumping and currentTime - player.jumpStartTime >= player.jumpDuration: player.isJumping = False self.sounds['footstep'].play() # Reset step distance tracking after landing player.distanceSinceLastStep = 0 def game_loop(self): clock = pygame.time.Clock() while self.currentLevel.player.get_health() > 0 and self.currentLevel.player.get_lives() > 0: currentTime = pygame.time.get_ticks() if check_for_exit(): return # Update player state (including power-ups) self.currentLevel.player.update(currentTime) self.handle_input() # Update audio positioning and handle collisions self.currentLevel.update_audio() self.currentLevel.handle_collisions() # Handle combat interactions self.currentLevel.handle_combat(currentTime) # Update projectiles self.currentLevel.handle_projectiles(currentTime) clock.tick(60) # 60 FPS # Player died or ran out of lives speak("Game Over") def run(self): while True: choice = game_menu(self.sounds, "play", "instructions", "learn_sounds", "credits", "donate", "exit") if choice == "exit": exit_game() elif choice == "play": if self.load_level(1): self.game_loop() if __name__ == "__main__": game = WickedQuest() game.run()