Add ability to switch weapons with number keys.
This commit is contained in:
@@ -19,6 +19,9 @@ tab or capslock: Toggle run lock.
|
|||||||
Control: Attack.
|
Control: Attack.
|
||||||
Space or shift: Hold to run if runlock is disabled. If run lock is enabled, hold to walk.
|
Space or shift: Hold to run if runlock is disabled. If run lock is enabled, hold to walk.
|
||||||
f, z, or /: Throw jack O'lantern.
|
f, z, or /: Throw jack O'lantern.
|
||||||
|
1: Switch to rusty shovel (if available).
|
||||||
|
2: Switch to witch's broom (if available).
|
||||||
|
3: Switch to nunchucks (if available).
|
||||||
c: Check bone dust.
|
c: Check bone dust.
|
||||||
e: Check currently wielded weapon.
|
e: Check currently wielded weapon.
|
||||||
h: Check health.
|
h: Check health.
|
||||||
@@ -41,8 +44,22 @@ 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.
|
||||||
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. The first save should happen around level 6.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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:
|
||||||
|
- No saving or loading - each run is a fresh start
|
||||||
|
- No extra lives are awarded - you rely on your starting lives only
|
||||||
|
- All enemies use aggressive "hunter" behavior instead of patrol patterns
|
||||||
|
- 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
|
||||||
|
- All coffin contents are randomized to ensure fair gameplay
|
||||||
|
- A detailed statistics report shows your performance at the end of each run
|
||||||
|
|
||||||
Enemies
|
Enemies
|
||||||
|
|
||||||
Goblin: Walks back and forth in his area trying to break your bones.
|
Goblin: Walks back and forth in his area trying to break your bones.
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -142,3 +142,4 @@ class Catapult(Object):
|
|||||||
if not player.isInvincible:
|
if not player.isInvincible:
|
||||||
self.sounds['player_takes_damage'].play()
|
self.sounds['player_takes_damage'].play()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -66,3 +66,4 @@ class CoffinObject(Object):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -289,3 +289,4 @@ class Enemy(Object):
|
|||||||
# Update stats
|
# Update stats
|
||||||
self.level.player.stats.update_stat('Enemies killed', 1)
|
self.level.player.stats.update_stat('Enemies killed', 1)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -93,3 +93,4 @@ def get_level_path(gameDir, levelNum):
|
|||||||
level_path = os.path.join(base_path, "levels", gameDir, f"{levelNum}.json")
|
level_path = os.path.join(base_path, "levels", gameDir, f"{levelNum}.json")
|
||||||
return level_path
|
return level_path
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -126,3 +126,4 @@ class GraspingHands(Object):
|
|||||||
obj_stop(self.crumbleChannel)
|
obj_stop(self.crumbleChannel)
|
||||||
self.crumbleChannel = None
|
self.crumbleChannel = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,3 +35,4 @@ class GraveObject(Object):
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,3 +56,4 @@ class ItemProperties:
|
|||||||
return item_type
|
return item_type
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -503,3 +503,4 @@ class Level:
|
|||||||
# Play throw sound
|
# Play throw sound
|
||||||
play_sound(self.sounds['throw_jack_o_lantern'])
|
play_sound(self.sounds['throw_jack_o_lantern'])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,3 +38,4 @@ class Object:
|
|||||||
obj_stop(self.channel)
|
obj_stop(self.channel)
|
||||||
self.channel = None
|
self.channel = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -253,6 +253,28 @@ class Player:
|
|||||||
if weapon in self.weapons:
|
if weapon in self.weapons:
|
||||||
self.currentWeapon = weapon
|
self.currentWeapon = weapon
|
||||||
|
|
||||||
|
def switch_to_weapon(self, weaponIndex):
|
||||||
|
"""Switch to weapon by index (1=shovel, 2=broom, 3=nunchucks)"""
|
||||||
|
weaponMap = {
|
||||||
|
1: "rusty_shovel",
|
||||||
|
2: "witch_broom",
|
||||||
|
3: "nunchucks"
|
||||||
|
}
|
||||||
|
|
||||||
|
targetWeaponName = weaponMap.get(weaponIndex)
|
||||||
|
if not targetWeaponName:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Find the weapon in player's inventory
|
||||||
|
for weapon in self.weapons:
|
||||||
|
if weapon.name == targetWeaponName:
|
||||||
|
self.equip_weapon(weapon)
|
||||||
|
speak(f"Switched to {weapon.name.replace('_', ' ')}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Weapon not found in inventory
|
||||||
|
return False
|
||||||
|
|
||||||
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)
|
||||||
@@ -272,3 +294,4 @@ class Player:
|
|||||||
return None
|
return None
|
||||||
return self.currentWeapon.get_attack_range(self.xPos, self.facingRight)
|
return self.currentWeapon.get_attack_range(self.xPos, self.facingRight)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -129,3 +129,4 @@ class PowerUp(Object):
|
|||||||
play_sound(self.sounds['get_nunchucks'])
|
play_sound(self.sounds['get_nunchucks'])
|
||||||
player.stats.update_stat('Items collected', 1)
|
player.stats.update_stat('Items collected', 1)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,3 +30,4 @@ class Projectile:
|
|||||||
enemy.take_damage(self.damage)
|
enemy.take_damage(self.damage)
|
||||||
self.isActive = False # Projectile is destroyed on hit
|
self.isActive = False # Projectile is destroyed on hit
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -291,3 +291,4 @@ class SaveManager:
|
|||||||
def has_saves(self):
|
def has_saves(self):
|
||||||
"""Check if any save files exist"""
|
"""Check if any save files exist"""
|
||||||
return len(self.get_save_files()) > 0
|
return len(self.get_save_files()) > 0
|
||||||
|
|
||||||
|
|||||||
@@ -119,3 +119,4 @@ class SkullStorm(Object):
|
|||||||
self.sounds['player_takes_damage'].play()
|
self.sounds['player_takes_damage'].play()
|
||||||
speak("Hit by falling skull!")
|
speak("Hit by falling skull!")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,3 +43,4 @@ class StatTracker:
|
|||||||
"""Get a total stat"""
|
"""Get a total stat"""
|
||||||
return self.total.get(statName, 0)
|
return self.total.get(statName, 0)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -244,3 +244,4 @@ class SurvivalGenerator:
|
|||||||
obj['x'] = xPos
|
obj['x'] = xPos
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|||||||
@@ -70,3 +70,4 @@ class Weapon:
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ class WickedQuest:
|
|||||||
self.gameStartTime = None
|
self.gameStartTime = None
|
||||||
self.lastThrowTime = 0
|
self.lastThrowTime = 0
|
||||||
self.throwDelay = 250
|
self.throwDelay = 250
|
||||||
|
self.lastWeaponSwitchTime = 0
|
||||||
|
self.weaponSwitchDelay = 200
|
||||||
self.player = None
|
self.player = None
|
||||||
self.currentGame = None
|
self.currentGame = None
|
||||||
self.runLock = False # Toggle behavior of the run keys
|
self.runLock = False # Toggle behavior of the run keys
|
||||||
@@ -216,6 +218,19 @@ class WickedQuest:
|
|||||||
if keys[pygame.K_e]:
|
if keys[pygame.K_e]:
|
||||||
speak(f"Wielding {self.currentLevel.player.currentWeapon.name.replace('_', ' ')}")
|
speak(f"Wielding {self.currentLevel.player.currentWeapon.name.replace('_', ' ')}")
|
||||||
|
|
||||||
|
# Weapon switching (1=shovel, 2=broom, 3=nunchucks)
|
||||||
|
currentTime = pygame.time.get_ticks()
|
||||||
|
if currentTime - self.lastWeaponSwitchTime >= self.weaponSwitchDelay:
|
||||||
|
if keys[pygame.K_1]:
|
||||||
|
if player.switch_to_weapon(1):
|
||||||
|
self.lastWeaponSwitchTime = currentTime
|
||||||
|
elif keys[pygame.K_2]:
|
||||||
|
if player.switch_to_weapon(2):
|
||||||
|
self.lastWeaponSwitchTime = currentTime
|
||||||
|
elif keys[pygame.K_3]:
|
||||||
|
if player.switch_to_weapon(3):
|
||||||
|
self.lastWeaponSwitchTime = currentTime
|
||||||
|
|
||||||
# Handle attack with either CTRL key
|
# Handle attack with either CTRL key
|
||||||
if (keys[pygame.K_LCTRL] or keys[pygame.K_RCTRL]) and player.start_attack(currentTime):
|
if (keys[pygame.K_LCTRL] or keys[pygame.K_RCTRL]) and player.start_attack(currentTime):
|
||||||
play_sound(self.sounds[player.currentWeapon.attackSound])
|
play_sound(self.sounds[player.currentWeapon.attackSound])
|
||||||
@@ -612,3 +627,4 @@ if __name__ == "__main__":
|
|||||||
game = WickedQuest()
|
game = WickedQuest()
|
||||||
game.run()
|
game.run()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user