More improvements to the override system. Fixed a bug that reared its ugly head during updates to grasping hands code.
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
							
								
								
									
										33
									
								
								src/level.py
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user