A few adjustments to documentation and reworked how monsters are unlocked in survival mode. Added bonus for unlocking everything.

This commit is contained in:
Storm Dragon
2025-09-11 11:44:46 -04:00
parent cc0f0437f5
commit d83e7db248
3 changed files with 32 additions and 20 deletions

View File

@@ -31,7 +31,7 @@ l: Check lives remaining.
Alt+PageDown: Master volume decrease. Alt+PageDown: Master volume decrease.
Alt+PageUp: Master volume increase. Alt+PageUp: Master volume increase.
Alt+End: Ambience volume decrease. Alt+End: Ambience volume decrease.
Alt+Home: Game volume increase. Alt+Home: Ambience volume increase.
Alt+Delete: Game sounds volume decrease. Alt+Delete: Game sounds volume decrease.
Alt+Insert: Game sounds volume increase. Alt+Insert: Game sounds volume increase.
Backspace: Pause or resume the game. Backspace: Pause or resume the game.
@@ -44,22 +44,23 @@ Spider webs can be passed by ducking as you move by them.
If you hit a spiderweb, a spider spawns, and you are slowed for 15 seconds. If you are invincible, you are not slowed, but the spider still appears. If you hit a spiderweb, a spider spawns, and you are slowed for 15 seconds. If you are invincible, you are not slowed, but the spider still appears.
Running and jumping both move you at 1.5 your normal speed. Running and jumping both move you at 1.5 your normal speed.
Items bounce away from you when they are freed from the coffin. You must jump to catch them when they are in range. Items bounce away from you when they are freed from the coffin. You must jump to catch them when they are in range.
You can switch between weapons you've collected using the number keys (1, 2, 3). This allows strategic combat - use different weapons for different situations based on their damage, range, and speed. You can switch between weapons you've collected using the number keys 1, 2, and 3. This allows strategic combat use different weapons for different situations based on their damage, range, and speed.
The shovel is a weak weapon, but it can fill in graves. While wielding the shovel hold down and walk (do not run) over the grave. If you run you will trip and fall in. The shovel is a weak weapon, but it can fill in graves. While wielding the shovel hold down and walk (do not run) over the grave. If you run you will trip and fall in.
The witch's broom isn't in good enough condition from bashing enemies to be used for true flight, but it does grant a speed bonus and also allows you to land at any point while jumping, just press down. The witch's broom isn't in good enough condition from bashing enemies to be used for true flight, but it does grant a speed bonus and also allows you to land at any point while jumping, just press down.
The game automatically saves your progress when you have collected 200 bone dust. You will hear a message saying the game has been saved, and a wolf will howl. To load a game, use the load option in the main menu. Load only appears if you have saved games. The first save should happen around level 6. The game automatically saves your progress when you have collected 200 bone dust. You will hear a message saying the game has been saved, and a wolf will howl. To load a game, use the load option in the main menu. Load only appears if you have saved games.
Game Modes Game Modes
Story Mode: Traditional level-by-level progression through predefined stages. Your progress is saved, and you can collect extra lives by gathering bone dust. Story Mode: Traditional level-by-level progression through predefined stages. Your progress is saved, and you can collect extra lives by gathering bone dust.
Survival Mode: An endless challenge where you face wave after wave of increasingly difficult enemies. Each wave gets progressively harder with stronger enemies, faster spawn rates, and longer levels. In survival mode: Survival Mode: An endless challenge where you face wave after wave of increasingly difficult enemies. Each wave gets progressively harder with stronger enemies, faster spawn rates, and longer levels. Level length starts at 300 units and increases by 20 units per wave (capped at 500 units). In survival mode:
No saving or loading - each run is a fresh start No saving or loading - each run is a fresh start
No extra lives are awarded - you rely on your starting lives only No extra lives are awarded
All enemies use aggressive "hunter" behavior instead of patrol patterns
Each wave must be completed by defeating all enemies before you can advance Each wave must be completed by defeating all enemies before you can advance
Bone dust still provides health bonuses but gives bonus score instead of extra lives Bone dust still provides health bonuses but collecting 100 bone dust gives 2000 bonus score instead of extra lives
All coffin contents are randomized to ensure fair gameplay Monsters unlock per wave that matches the level in which they are found
Once all monsters are unlocked your score is doubled
All coffin contents are randomized
A detailed statistics report shows your performance at the end of each run A detailed statistics report shows your performance at the end of each run
Enemies Enemies
@@ -80,7 +81,7 @@ Bonuses and items
Bone dust: Currency of the game. Collect it to gain health and extra lives. Bone dust: Currency of the game. Collect it to gain health and extra lives.
Cauldron: Restores you to full health. Cauldron: Restores you to full health.
Witch's broom: A weapon gained from witches. Stronger than the grave digger's rusty shovel. Witch's broom: A weapon gained from witches. Stronger than the grave digger's rusty shovel and grants extra speed and jump time.
Coffin: Contains items. Be quick, they try to escape. Coffin: Contains items. Be quick, they try to escape.
Guts: Adds 2 health to your maximum unlife if your unlife is below 20 points otherwise it restores your health. Guts: Adds 2 health to your maximum unlife if your unlife is below 20 points otherwise it restores your health.
Hand of Glory: Grants invincibility for a short time. Hand of Glory: Grants invincibility for a short time.

View File

@@ -57,6 +57,8 @@ class SurvivalGenerator:
# Parse objects # Parse objects
for obj in data.get("objects", []): for obj in data.get("objects", []):
objCopy = copy.deepcopy(obj) objCopy = copy.deepcopy(obj)
# Add source level information to track difficulty progression
objCopy["source_level"] = levelNum
# Categorize objects # Categorize objects
if "enemy_type" in obj: if "enemy_type" in obj:
@@ -157,16 +159,15 @@ class SurvivalGenerator:
def place_enemy(self, xPos, difficultyLevel): def place_enemy(self, xPos, difficultyLevel):
"""Place an enemy at the given position with scaled difficulty.""" """Place an enemy at the given position with scaled difficulty."""
# Filter out boss enemies for early waves # Level-based filtering: allow enemies from levels 1 through current wave
bossEnemies = ["witch", "boogie_man", "revenant", "ghost", "headless_horseman"] maxLevel = max(self.levelData.keys()) if self.levelData else 1
allowedLevels = list(range(1, min(difficultyLevel, maxLevel) + 1))
if difficultyLevel < 3: # Waves 1-2: no bosses
availableEnemies = [e for e in self.enemyTemplates if e.get("enemy_type") not in bossEnemies] # If we're past the max level, allow all enemies
elif difficultyLevel < 5: # Waves 3-4: exclude the hardest bosses if difficultyLevel > maxLevel:
hardestBosses = ["revenant", "ghost", "headless_horseman"]
availableEnemies = [e for e in self.enemyTemplates if e.get("enemy_type") not in hardestBosses]
else: # Wave 5+: all enemies allowed
availableEnemies = self.enemyTemplates availableEnemies = self.enemyTemplates
else:
availableEnemies = [e for e in self.enemyTemplates if e.get("source_level", 1) in allowedLevels]
# Fallback to all enemies if filtering removed everything # Fallback to all enemies if filtering removed everything
if not availableEnemies: if not availableEnemies:

View File

@@ -649,8 +649,18 @@ class WickedQuest:
self.currentLevel.projectiles.clear() self.currentLevel.projectiles.clear()
pygame.mixer.stop() # Stop any ongoing catapult/enemy sounds pygame.mixer.stop() # Stop any ongoing catapult/enemy sounds
# Announce new wave before starting level # Check for all monsters unlocked bonus and prepare wave message
speak(f"Wave {self.survivalWave}!") waveMessage = f"Wave {self.survivalWave}!"
if self.survivalGenerator:
maxLevel = max(self.survivalGenerator.levelData.keys()) if self.survivalGenerator.levelData else 1
if self.survivalWave == maxLevel + 1: # First wave after all levels unlocked
# Double the current score
self.survivalScore *= 2
play_sound(self.get_sounds().get("survivor_bonus", self.get_sounds()["get_extra_life"]))
waveMessage += " All monsters unlocked bonus! Score doubled!"
# Announce new wave (with bonus message if applicable)
speak(waveMessage)
# Generate new segment # Generate new segment
segmentLength = min(500, 300 + (self.survivalWave * 20)) # Longer segments over time segmentLength = min(500, 300 + (self.survivalWave * 20)) # Longer segments over time