From ed764cdfdf7b04bfa77f75152c6defd18d8c80d5 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 21 Sep 2025 00:17:25 -0400 Subject: [PATCH] More improvements to the override system. Fixed a bug that reared its ugly head during updates to grasping hands code. --- src/catapult.py | 24 +++++++++++++++++++----- src/grasping_hands.py | 2 +- src/level.py | 33 +++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/catapult.py b/src/catapult.py index 3a3e720..c1fcb64 100644 --- a/src/catapult.py +++ b/src/catapult.py @@ -6,7 +6,7 @@ import random class Pumpkin: - def __init__(self, x, isHigh, direction, playerMaxHealth): + def __init__(self, x, isHigh, direction, playerMaxHealth, soundOverrides=None): self.x = x self.isHigh = isHigh self.direction = direction @@ -14,7 +14,17 @@ class Pumpkin: self.isActive = True self.damage = playerMaxHealth // 2 # Half of player's max health self.soundChannel = None - self.soundName = "pumpkin_low" if isHigh else "pumpkin_high" # Inverted mapping + + # Apply sound overrides if provided + if soundOverrides: + if isHigh and "pumpkin_high" in soundOverrides: + self.soundName = soundOverrides["pumpkin_low"] # Still inverted for overrides + elif not isHigh and "pumpkin_low" in soundOverrides: + self.soundName = soundOverrides["pumpkin_high"] # Still inverted for overrides + else: + self.soundName = "pumpkin_low" if isHigh else "pumpkin_high" # Inverted mapping + else: + self.soundName = "pumpkin_low" if isHigh else "pumpkin_high" # Inverted mapping def update(self, sounds, playerX): """Update pumpkin position and sound""" @@ -74,6 +84,9 @@ class Catapult(Object): self.pendingPumpkin = None # Store pending pumpkin data self.pumpkinLaunchTime = 0 # When to launch the pending pumpkin self.launchSound = "catapult_launch" # Configurable launch sound + self.soundOverrides = {} # Store sound overrides for pumpkins + self.activateMessage = "Pumpkin catapult activates!" + self.deactivateMessage = "Out of pumpkin catapult range." def fire(self, currentTime, player): """Start the firing sequence""" @@ -87,7 +100,7 @@ class Catapult(Object): fireDirection = 1 if player.xPos > self.xPos else -1 # Store pumpkin data for later creation - self.pendingPumpkin = {"isHigh": isHigh, "direction": fireDirection, "playerMaxHealth": player.get_max_health()} + self.pendingPumpkin = {"isHigh": isHigh, "direction": fireDirection, "playerMaxHealth": player.get_max_health(), "soundOverrides": self.soundOverrides} # Set when to actually launch the pumpkin self.pumpkinLaunchTime = currentTime + self.launchDelay @@ -105,10 +118,10 @@ class Catapult(Object): if inRange and not self.isFiring: self.isFiring = True self.lastFireTime = currentTime # Reset timer when entering range - speak("Pumpkin catapult activates!") + speak(self.activateMessage) elif not inRange and self.isFiring: self.isFiring = False - speak("Out of pumpkin catapult range.") + speak(self.deactivateMessage) # Check for pending pumpkin launch if self.pendingPumpkin and currentTime >= self.pumpkinLaunchTime: @@ -118,6 +131,7 @@ class Catapult(Object): self.pendingPumpkin["isHigh"], self.pendingPumpkin["direction"], self.pendingPumpkin["playerMaxHealth"], + self.pendingPumpkin["soundOverrides"], ) self.activePumpkins.append(pumpkin) self.pendingPumpkin = None diff --git a/src/grasping_hands.py b/src/grasping_hands.py index f9d01eb..3891e4e 100644 --- a/src/grasping_hands.py +++ b/src/grasping_hands.py @@ -12,7 +12,7 @@ class GraspingHands(Object): super().__init__( xRange, y, - "grasping_hands", # Set base sound name for override system + "", # No automatic sound - grasping hands manages its own audio isStatic=True, isCollectible=False, isHazard=True, diff --git a/src/level.py b/src/level.py index 8f34519..a0846ba 100644 --- a/src/level.py +++ b/src/level.py @@ -606,13 +606,38 @@ class Level: def _apply_object_sound_overrides(self, obj, soundOverrides): """Apply sound overrides to an object based on level pack theme.""" # Override base sound name if specified (originalSoundName remains unchanged for game logic) - if "base" in soundOverrides: - obj.soundName = soundOverrides["base"] + # Skip for grasping hands since they manage their own audio + if "base" in soundOverrides and not hasattr(obj, 'soundPrefix'): + # Check if override sound exists, fall back to original if not + if soundOverrides["base"] in self.sounds: + obj.soundName = soundOverrides["base"] + # If override doesn't exist, keep original sound (no change needed) # Handle special object-specific overrides - # For catapults, check for launch sound override + # For catapults, check for launch sound override and pumpkin sound overrides if hasattr(obj, 'launchSound') and "launch" in soundOverrides: - obj.launchSound = soundOverrides["launch"] + # Check if override sound exists, fall back to original if not + if soundOverrides["launch"] in self.sounds: + obj.launchSound = soundOverrides["launch"] + + # Store pumpkin sound overrides in catapult (only store sounds that exist) + if hasattr(obj, 'soundOverrides'): + # Filter out non-existent sounds from pumpkin overrides + filteredOverrides = {} + for key, value in soundOverrides.items(): + if key in ['pumpkin_low', 'pumpkin_high']: + if value in self.sounds: + filteredOverrides[key] = value + else: + # Keep non-sound overrides (messages, etc.) + filteredOverrides[key] = value + obj.soundOverrides = filteredOverrides + + # Apply message overrides for catapults + if hasattr(obj, 'activateMessage') and "activate_message" in soundOverrides: + obj.activateMessage = soundOverrides["activate_message"] + if hasattr(obj, 'deactivateMessage') and "deactivate_message" in soundOverrides: + obj.deactivateMessage = soundOverrides["deactivate_message"] # For grasping hands, check for message overrides and sound prefix override if hasattr(obj, 'warningMessage') and "warning_message" in soundOverrides: