Compare commits

...

2 Commits

15 changed files with 47 additions and 64 deletions

View File

@@ -291,13 +291,13 @@ The `maximum_skulls` setting controls how many skulls can be falling simultaneou
"x": 55,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 4000,
"range": 25
}
```
**Properties:**
- `fire_interval`: Milliseconds between shots
- `fireInterval`: Milliseconds between shots (note: camelCase, not snake_case)
- `range`: How far the catapult can shoot
#### Spider Web
@@ -660,8 +660,7 @@ Here's how to transform a Halloween level into a Christmas level using sound ove
"type": "grave",
"item": "shin_bone",
"sound_overrides": {
"base": "snow_pile",
"item": "candy_cane"
"item": "candy_cane"
}
},
{
@@ -682,7 +681,7 @@ Here's how to transform a Halloween level into a Christmas level using sound ove
- Weapons sound winter-themed when attacking
- "Catapult" becomes "Snowball Launcher" with appropriate launch sounds
- "Skull Storm" becomes "Snowball Storm"
- "Graves" become "Snow Piles" containing "Candy Canes" instead of "Shin Bones"
- "Graves" containing "Candy Canes" instead of "Shin Bones" (sound override only - base grave sound unchanged)
- "Grasping Hands" becomes "Avalanche" with snow-themed death messages
- All mechanics remain identical - only audio and messaging changes
@@ -767,7 +766,7 @@ Here's a comprehensive example showing multiple advanced features:
"x": 100,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 3000,
"range": 30
},
{

View File

@@ -123,7 +123,7 @@
"x": 135,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{
@@ -254,7 +254,7 @@
"x": 310,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -130,7 +130,7 @@
"x": 155,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -25,7 +25,7 @@
"x": 50,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -55,7 +55,7 @@
"x": 100,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -85,7 +85,7 @@
"x": 150,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -117,7 +117,7 @@
"x": 200,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -148,7 +148,7 @@
"x": 250,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -169,7 +169,7 @@
"x": 300,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -194,7 +194,7 @@
"x": 350,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -220,7 +220,7 @@
"x": 400,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -245,7 +245,7 @@
"x": 450,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -266,7 +266,7 @@
"x": 500,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -26,7 +26,7 @@
"x": 50,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -54,7 +54,7 @@
"x": 100,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -91,7 +91,7 @@
"x": 150,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -110,7 +110,7 @@
"x": 200,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -154,7 +154,7 @@
"x": 300,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -180,7 +180,7 @@
"x": 350,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -202,7 +202,7 @@
"x": 400,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -241,7 +241,7 @@
"x": 500,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -260,7 +260,7 @@
"x": 550,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{
@@ -281,7 +281,7 @@
"x": 600,
"y": 0,
"type": "catapult",
"fire_interval": 3000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -107,7 +107,7 @@
"x": 120,
"y": 0,
"type": "catapult",
"fire_interval": 5000,
"fireInterval": 5000,
"range": 15
},
{

View File

@@ -229,7 +229,7 @@
"x": 175,
"y": 0,
"type": "catapult",
"fire_interval": 4500,
"fireInterval": 5000,
"range": 20
},
{

View File

@@ -125,7 +125,7 @@
"x": 90,
"y": 0,
"type": "catapult",
"fire_interval": 4500,
"fireInterval": 5000,
"range": 20
},
{

View File

@@ -76,7 +76,7 @@
"x": 55,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 25
},
{
@@ -198,7 +198,7 @@
"x": 175,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 25
},
{

View File

@@ -75,7 +75,7 @@
"x": 60,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{
@@ -194,7 +194,7 @@
"x": 175,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -126,7 +126,7 @@
"x": 100,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{
@@ -262,7 +262,7 @@
"x": 225,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 20
},
{

View File

@@ -95,7 +95,7 @@
"x": 115,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{
@@ -217,7 +217,7 @@
"x": 270,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -117,7 +117,7 @@
"x": 150,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{
@@ -244,7 +244,7 @@
"x": 330,
"y": 0,
"type": "catapult",
"fire_interval": 4000,
"fireInterval": 5000,
"range": 30
},
{

View File

@@ -231,8 +231,6 @@ class Player:
self._lives -= 1
# Mark that player died this frame to prevent revival
self.diedThisFrame = True
# Record death time for delay before respawn/game over
self.deathTimestamp = pygame.time.get_ticks()
# Stop all current sounds before playing death sound
pygame.mixer.stop()
try:

View File

@@ -274,8 +274,8 @@ class WickedQuest:
play_sound(self.get_sounds()['jump'])
# Handle instant landing with broom (press down while jumping)
if (player.isJumping and (keys[pygame.K_s] or keys[pygame.K_DOWN]) and
player.currentWeapon and player.currentWeapon.name == "witch_broom"):
if (player.isJumping and (keys[pygame.K_s] or keys[pygame.K_DOWN]) and
player.currentWeapon and getattr(player.currentWeapon, 'originalName', player.currentWeapon.name) == "witch_broom"):
player.isJumping = False
play_sound(self.get_sounds()[player.footstepSound]) # Landing sound
# Reset step distance tracking after landing
@@ -433,15 +433,6 @@ class WickedQuest:
# Check for death first
if self.currentLevel.player.get_health() <= 0:
# Check if we need to wait for death delay (2.5 seconds)
if hasattr(self.currentLevel.player, 'deathTimestamp'):
deathDelay = 2500 # 2.5 seconds
if currentTime - self.currentLevel.player.deathTimestamp < deathDelay:
# Still waiting for death delay to complete
clock.tick(60)
continue
# Death delay completed, remove timestamp
del self.currentLevel.player.deathTimestamp
if self.currentLevel.player.get_lives() <= 0:
# Game over - use gameStartTime for total time
@@ -521,6 +512,10 @@ class WickedQuest:
if self.load_level(current_level):
# Restore player state
self.saveManager.restore_player_state(self.player, save_data)
# Re-apply weapon overrides after restoring player state to ensure
# sound/name overrides work with restored weapon properties
if hasattr(self.currentLevel, 'weaponOverrides') and self.currentLevel.weaponOverrides:
self.currentLevel._apply_weapon_overrides(self.currentLevel.weaponOverrides)
self.game_loop(current_level)
else:
messagebox("Failed to load saved level.")
@@ -657,15 +652,6 @@ class WickedQuest:
# Check for death first (following main game loop pattern)
if self.currentLevel.player.get_health() <= 0:
# Check if we need to wait for death delay (2.5 seconds)
if hasattr(self.currentLevel.player, 'deathTimestamp'):
deathDelay = 2500 # 2.5 seconds
if currentTime - self.currentLevel.player.deathTimestamp < deathDelay:
# Still waiting for death delay to complete
clock.tick(60)
continue
# Death delay completed, remove timestamp
del self.currentLevel.player.deathTimestamp
if self.currentLevel.player.get_lives() <= 0:
# Game over - stop all sounds