New weapon, witch's broom, added. New enemy type, witch, added.

This commit is contained in:
Storm Dragon
2025-02-07 15:13:27 -05:00
parent 419f605466
commit e0e097a397
13 changed files with 119 additions and 7 deletions

View File

@@ -24,7 +24,7 @@
"x_range": [21, 29], "x_range": [21, 29],
"y": 0, "y": 0,
"enemy_type": "goblin", "enemy_type": "goblin",
"health": 4, "health": 2,
"damage": 2, "damage": 2,
"attack_range": 1, "attack_range": 1,
"attack_pattern": { "attack_pattern": {
@@ -37,7 +37,7 @@
"hazard": true, "hazard": true,
"sound": "grave", "sound": "grave",
"static": true, "static": true,
"zombie_spawn_chance": 15 "zombie_spawn_chance": 10
}, },
{ {
"x_range": [33, 38], "x_range": [33, 38],
@@ -61,7 +61,8 @@
"x": 55, "x": 55,
"y": 3, "y": 3,
"sound": "coffin", "sound": "coffin",
"type": "coffin" "type": "coffin",
"item": "guts"
}, },
{ {
"x_range": [65, 70], "x_range": [65, 70],
@@ -74,7 +75,7 @@
"x_range": [71, 79], "x_range": [71, 79],
"y": 0, "y": 0,
"enemy_type": "goblin", "enemy_type": "goblin",
"health": 5, "health": 2,
"damage": 2, "damage": 2,
"attack_range": 1, "attack_range": 1,
"attack_pattern": { "attack_pattern": {
@@ -93,7 +94,7 @@
"hazard": true, "hazard": true,
"sound": "grave", "sound": "grave",
"static": true, "static": true,
"zombie_spawn_chance": 20 "zombie_spawn_chance": 10
}, },
{ {
"x_range": [105, 108], "x_range": [105, 108],
@@ -127,11 +128,52 @@
"sound": "coin", "sound": "coin",
"collectible": true, "collectible": true,
"static": true "static": true
},
{
"x": 160,
"y": 0,
"hazard": true,
"sound": "grave",
"static": true,
"zombie_spawn_chance": 10
},
{
"x": 170,
"y": 3,
"sound": "coffin",
"type": "coffin",
"item": "extra_life"
},
{
"x_range": [175, 180],
"y": 3,
"sound": "coin",
"collectible": true,
"static": true
},
{
"x": 185,
"y": 0,
"hazard": true,
"sound": "grave",
"static": true,
"zombie_spawn_chance": 10
},
{
"x_range": [189, 198],
"y": 0,
"enemy_type": "witch",
"health": 4,
"damage": 2,
"attack_range": 1.5,
"attack_pattern": {
"type": "patrol"
}
} }
], ],
"boundaries": { "boundaries": {
"left": 0, "left": 0,
"right": 170 "right": 200
}, },
"footstep_sound": "footstep_tall_grass" "footstep_sound": "footstep_tall_grass"
} }

BIN
sounds/_edge.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/get_cauldron.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/get_witch_broom.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/player_broom_attack.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/player_broom_hit.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/witch.ogg (Stored with Git LFS) Normal file

Binary file not shown.

BIN
sounds/witch_dies.ogg (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -1,5 +1,6 @@
from libstormgames import * from libstormgames import *
from src.object import Object from src.object import Object
from src.powerup import PowerUp
import pygame import pygame
class Enemy(Object): class Enemy(Object):
@@ -171,5 +172,25 @@ class Enemy(Object):
if deathSound in self.sounds: if deathSound in self.sounds:
self.channel = obj_play(self.sounds, deathSound, self.level.player.xPos, self.xPos, loop=False) self.channel = obj_play(self.sounds, deathSound, self.level.player.xPos, self.xPos, loop=False)
# Handle witch-specific drops
if self.enemyType == "witch":
# Determine which item to drop
hasBroom = any(weapon.name == "witch_broom" for weapon in self.level.player.weapons)
itemType = "cauldron" if hasBroom else "witch_broom"
# Create drop 1-2 tiles away in random direction
direction = random.choice([-1, 1])
dropDistance = random.randint(1, 2)
dropX = self.xPos + (direction * dropDistance)
droppedItem = PowerUp(
dropX,
self.yPos,
itemType,
self.sounds,
direction
)
self.level.bouncing_items.append(droppedItem)
# Update stats # Update stats
self.level.player.stats.update_stat('Enemies killed', 1) self.level.player.stats.update_stat('Enemies killed', 1)

View File

@@ -8,6 +8,8 @@ class ItemType(Enum):
HAND_OF_GLORY = auto() HAND_OF_GLORY = auto()
JACK_O_LANTERN = auto() JACK_O_LANTERN = auto()
EXTRA_LIFE = auto() EXTRA_LIFE = auto()
CAULDRON = auto()
WITCH_BROOM = auto()
class ItemProperties: class ItemProperties:
"""Manages item properties and availability""" """Manages item properties and availability"""
@@ -23,7 +25,9 @@ class ItemProperties:
ItemType.GUTS: "guts", ItemType.GUTS: "guts",
ItemType.HAND_OF_GLORY: "hand_of_glory", ItemType.HAND_OF_GLORY: "hand_of_glory",
ItemType.JACK_O_LANTERN: "jack_o_lantern", ItemType.JACK_O_LANTERN: "jack_o_lantern",
ItemType.EXTRA_LIFE: "extra_life" ItemType.EXTRA_LIFE: "extra_life",
ItemType.CAULDRON: "cauldron",
ItemType.WITCH_BROOM: "witch_broom"
} }
@staticmethod @staticmethod

View File

@@ -129,6 +129,10 @@ class Player:
"""Get current max health""" """Get current max health"""
return self._maxHealth return self._maxHealth
def restore_health(self):
"""Restore health to maximum"""
self._health = self._maxHealth
def get_current_speed(self): def get_current_speed(self):
"""Calculate current speed based on state""" """Calculate current speed based on state"""
baseSpeed = self.moveSpeed baseSpeed = self.moveSpeed

View File

@@ -1,5 +1,6 @@
from libstormgames import * from libstormgames import *
from src.object import Object from src.object import Object
from src.weapon import Weapon
class PowerUp(Object): class PowerUp(Object):
def __init__(self, x, y, item_type, sounds, direction): def __init__(self, x, y, item_type, sounds, direction):
@@ -44,12 +45,18 @@ class PowerUp(Object):
"""Apply the item's effect when collected""" """Apply the item's effect when collected"""
if self.item_type == 'hand_of_glory': if self.item_type == 'hand_of_glory':
player.start_invincibility() player.start_invincibility()
elif self.item_type == 'cauldron':
player.restore_health()
elif self.item_type == 'guts': elif self.item_type == 'guts':
player.add_guts() player.add_guts()
elif self.item_type == 'jack_o_lantern': elif self.item_type == 'jack_o_lantern':
player.add_jack_o_lantern() player.add_jack_o_lantern()
elif self.item_type == 'extra_life': elif self.item_type == 'extra_life':
player.extra_life() player.extra_life()
elif self.item_type == 'witch_broom':
broomWeapon = Weapon.create_witch_broom()
player.add_weapon(broomWeapon)
player.equip_weapon(broomWeapon)
# Stop movement sound when collected # Stop movement sound when collected
if self.channel: if self.channel:

View File

@@ -10,6 +10,19 @@ class Weapon:
self.lastAttackTime = 0 self.lastAttackTime = 0
self.hitEnemies = set() self.hitEnemies = set()
@classmethod
def create_witch_broom(cls):
"""Create the witch's broom weapon"""
return cls(
name="witch_broom",
damage=3,
range=2.5,
attackSound="player_broom_attack",
hitSound="player_broom_hit",
cooldown=500,
attackDuration=200
)
def can_attack(self, currentTime): def can_attack(self, currentTime):
"""Check if enough time has passed since last attack""" """Check if enough time has passed since last attack"""
return currentTime - self.lastAttackTime >= self.cooldown return currentTime - self.lastAttackTime >= self.cooldown