Updated level creation documentation. Fixed a couple bugs in weapon overrides.
This commit is contained in:
@@ -422,6 +422,33 @@ Override weapon sounds and names globally for an entire level:
|
|||||||
- `attack_sound`: Sound played when attacking
|
- `attack_sound`: Sound played when attacking
|
||||||
- `hit_sound`: Sound played when hitting an enemy
|
- `hit_sound`: Sound played when hitting an enemy
|
||||||
|
|
||||||
|
**Weapon Override Persistence:**
|
||||||
|
Weapon overrides set in **level 1** automatically persist throughout the entire level pack! You only need to define `weapon_sound_overrides` in your first level (1.json) and all subsequent levels will inherit these themed weapon names.
|
||||||
|
|
||||||
|
```json
|
||||||
|
// In levels/Wicked Christmas/1.json - Sets theme for entire pack
|
||||||
|
{
|
||||||
|
"level_id": 1,
|
||||||
|
"weapon_sound_overrides": {
|
||||||
|
"rusty_shovel": { "name": "rusty snow shovel" },
|
||||||
|
"witch_broom": { "name": "decorated witch's broom" },
|
||||||
|
"nunchucks": { "name": "candy cane nunchucks" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// In levels/Wicked Christmas/2.json - No overrides needed!
|
||||||
|
{
|
||||||
|
"level_id": 2,
|
||||||
|
// Weapons automatically use themed names from level 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**How it works:**
|
||||||
|
- Level 1 overrides persist across all levels in the same play session
|
||||||
|
- Switching to a different level pack resets weapons to their original names
|
||||||
|
- Later levels can still override weapons if you want to change themes mid-pack
|
||||||
|
- The system stores the original weapon names internally for proper lookups
|
||||||
|
|
||||||
#### Object Sound Overrides
|
#### Object Sound Overrides
|
||||||
|
|
||||||
Override sounds for individual objects in your level:
|
Override sounds for individual objects in your level:
|
||||||
|
32
src/level.py
32
src/level.py
@@ -41,9 +41,12 @@ class Level:
|
|||||||
# Pass footstep sound to player
|
# Pass footstep sound to player
|
||||||
self.player.set_footstep_sound(self.footstepSound)
|
self.player.set_footstep_sound(self.footstepSound)
|
||||||
|
|
||||||
# Apply weapon sound overrides if specified
|
# Store and apply weapon sound overrides if specified
|
||||||
if "weapon_sound_overrides" in levelData:
|
self.weaponOverrides = levelData.get("weapon_sound_overrides", {})
|
||||||
self._apply_weapon_overrides(levelData["weapon_sound_overrides"])
|
if self.weaponOverrides:
|
||||||
|
self._apply_weapon_overrides(self.weaponOverrides)
|
||||||
|
# Give player access to overrides for newly added weapons
|
||||||
|
self.player.set_weapon_overrides(self.weaponOverrides)
|
||||||
|
|
||||||
# Level intro message (skip for survival mode)
|
# Level intro message (skip for survival mode)
|
||||||
if levelData["level_id"] != 999: # 999 is survival mode
|
if levelData["level_id"] != 999: # 999 is survival mode
|
||||||
@@ -578,19 +581,26 @@ class Level:
|
|||||||
def _apply_weapon_overrides(self, weaponOverrides):
|
def _apply_weapon_overrides(self, weaponOverrides):
|
||||||
"""Apply sound and name overrides to player weapons based on level pack theme."""
|
"""Apply sound and name overrides to player weapons based on level pack theme."""
|
||||||
for weapon in self.player.weapons:
|
for weapon in self.player.weapons:
|
||||||
if weapon.name in weaponOverrides:
|
# Check if weapon needs override (use originalName if available, fallback to current name)
|
||||||
overrides = weaponOverrides[weapon.name]
|
weaponKey = getattr(weapon, 'originalName', weapon.name)
|
||||||
|
|
||||||
# Override weapon name if specified
|
if weaponKey in weaponOverrides:
|
||||||
if "name" in overrides:
|
overrides = weaponOverrides[weaponKey]
|
||||||
|
|
||||||
|
# Store original name on first override to enable future lookups
|
||||||
|
if not hasattr(weapon, 'originalName'):
|
||||||
|
weapon.originalName = weapon.name
|
||||||
|
|
||||||
|
# Override weapon name if specified and different from current
|
||||||
|
if "name" in overrides and weapon.name != overrides["name"]:
|
||||||
weapon.name = overrides["name"]
|
weapon.name = overrides["name"]
|
||||||
|
|
||||||
# Override attack sound if specified
|
# Override attack sound if specified and different from current
|
||||||
if "attack_sound" in overrides:
|
if "attack_sound" in overrides and hasattr(weapon, 'attackSound') and weapon.attackSound != overrides["attack_sound"]:
|
||||||
weapon.attackSound = overrides["attack_sound"]
|
weapon.attackSound = overrides["attack_sound"]
|
||||||
|
|
||||||
# Override hit sound if specified
|
# Override hit sound if specified and different from current
|
||||||
if "hit_sound" in overrides:
|
if "hit_sound" in overrides and hasattr(weapon, 'hitSound') and weapon.hitSound != overrides["hit_sound"]:
|
||||||
weapon.hitSound = overrides["hit_sound"]
|
weapon.hitSound = overrides["hit_sound"]
|
||||||
|
|
||||||
def _apply_object_sound_overrides(self, obj, soundOverrides):
|
def _apply_object_sound_overrides(self, obj, soundOverrides):
|
||||||
|
@@ -62,6 +62,9 @@ class Player:
|
|||||||
# Death state tracking (to prevent revival after death in same frame)
|
# Death state tracking (to prevent revival after death in same frame)
|
||||||
self.diedThisFrame = False
|
self.diedThisFrame = False
|
||||||
|
|
||||||
|
# Weapon override storage
|
||||||
|
self.weaponOverrides = {}
|
||||||
|
|
||||||
# Initialize starting weapon (rusty shovel)
|
# Initialize starting weapon (rusty shovel)
|
||||||
self.add_weapon(
|
self.add_weapon(
|
||||||
Weapon(
|
Weapon(
|
||||||
@@ -270,6 +273,9 @@ class Player:
|
|||||||
|
|
||||||
def add_weapon(self, weapon):
|
def add_weapon(self, weapon):
|
||||||
"""Add a new weapon to inventory and equip if first weapon"""
|
"""Add a new weapon to inventory and equip if first weapon"""
|
||||||
|
# Apply weapon overrides if they exist
|
||||||
|
self._apply_weapon_override(weapon)
|
||||||
|
|
||||||
self.weapons.append(weapon)
|
self.weapons.append(weapon)
|
||||||
if len(self.weapons) == 1: # If this is our first weapon, equip it
|
if len(self.weapons) == 1: # If this is our first weapon, equip it
|
||||||
self.equip_weapon(weapon)
|
self.equip_weapon(weapon)
|
||||||
@@ -289,7 +295,9 @@ class Player:
|
|||||||
|
|
||||||
# Find the weapon in player's inventory
|
# Find the weapon in player's inventory
|
||||||
for weapon in self.weapons:
|
for weapon in self.weapons:
|
||||||
if weapon.originalName == targetWeaponName:
|
# Check original name if it exists, fallback to current name
|
||||||
|
weaponKey = getattr(weapon, 'originalName', weapon.name)
|
||||||
|
if weaponKey == targetWeaponName:
|
||||||
self.equip_weapon(weapon)
|
self.equip_weapon(weapon)
|
||||||
speak(weapon.name.replace("_", " "))
|
speak(weapon.name.replace("_", " "))
|
||||||
return True
|
return True
|
||||||
@@ -297,6 +305,37 @@ class Player:
|
|||||||
# Weapon not found in inventory
|
# Weapon not found in inventory
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def set_weapon_overrides(self, weaponOverrides):
|
||||||
|
"""Store weapon overrides for applying to newly added weapons"""
|
||||||
|
self.weaponOverrides = weaponOverrides
|
||||||
|
|
||||||
|
def _apply_weapon_override(self, weapon):
|
||||||
|
"""Apply weapon overrides to a single weapon"""
|
||||||
|
if not hasattr(self, 'weaponOverrides') or not self.weaponOverrides:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check if weapon needs override (use originalName if available, fallback to current name)
|
||||||
|
weaponKey = getattr(weapon, 'originalName', weapon.name)
|
||||||
|
|
||||||
|
if weaponKey in self.weaponOverrides:
|
||||||
|
overrides = self.weaponOverrides[weaponKey]
|
||||||
|
|
||||||
|
# Store original name on first override to enable future lookups
|
||||||
|
if not hasattr(weapon, 'originalName'):
|
||||||
|
weapon.originalName = weapon.name
|
||||||
|
|
||||||
|
# Override weapon name if specified and different from current
|
||||||
|
if "name" in overrides and weapon.name != overrides["name"]:
|
||||||
|
weapon.name = overrides["name"]
|
||||||
|
|
||||||
|
# Override attack sound if specified and different from current
|
||||||
|
if "attack_sound" in overrides and hasattr(weapon, 'attackSound') and weapon.attackSound != overrides["attack_sound"]:
|
||||||
|
weapon.attackSound = overrides["attack_sound"]
|
||||||
|
|
||||||
|
# Override hit sound if specified and different from current
|
||||||
|
if "hit_sound" in overrides and hasattr(weapon, 'hitSound') and weapon.hitSound != overrides["hit_sound"]:
|
||||||
|
weapon.hitSound = overrides["hit_sound"]
|
||||||
|
|
||||||
def add_item(self, item):
|
def add_item(self, item):
|
||||||
"""Add an item to inventory"""
|
"""Add an item to inventory"""
|
||||||
self.inventory.append(item)
|
self.inventory.append(item)
|
||||||
|
Reference in New Issue
Block a user