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
+48 -6
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
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+21
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)
+5 -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
+4
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
+7
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:
+13
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