Allow for custom footsteps. Some work on footsteps to make the sound less crazy. Various other updates. Added initial documentation and credits files.

This commit is contained in:
Storm Dragon
2025-02-05 02:04:57 -05:00
parent 883dafaac0
commit c29bcd40b7
17 changed files with 431 additions and 43 deletions

View File

@@ -2,7 +2,6 @@ from libstormgames import *
from src.object import Object
import pygame
class Enemy(Object):
def __init__(self, xRange, y, enemyType, sounds, level, **kwargs):
# Initialize base object properties
@@ -20,16 +19,20 @@ class Enemy(Object):
self.health = kwargs.get('health', 5) # Default 5 HP
self.damage = kwargs.get('damage', 1) # Default 1 damage
self.attackRange = kwargs.get('attack_range', 1) # Default 1 tile range
self.movementRange = kwargs.get('movement_range', 5) # Default 5 tile patrol
self.sounds = sounds # Store reference to game sounds
# Movement and behavior properties
self.movingRight = True # Initial direction
self.movementSpeed = 0.03 # Base speed
self.patrolStart = self.xRange[0]
self.patrolEnd = self.xRange[0] + self.movementRange
self.patrolStart = self.xRange[0] # Use xRange directly for patrol boundaries
self.patrolEnd = self.xRange[1]
self.lastAttackTime = 0
self.attackCooldown = 1000 # 1 second between attacks
self._currentX = self.xRange[0] # Initialize current position
# Attack pattern configuration
self.attackPattern = kwargs.get('attack_pattern', {'type': 'patrol'})
self.turnThreshold = self.attackPattern.get('turn_threshold', 5)
# Enemy type specific adjustments
if enemyType == "zombie":
@@ -41,21 +44,69 @@ class Enemy(Object):
@property
def xPos(self):
"""Current x position"""
return self._currentX if hasattr(self, '_currentX') else self.xRange[0]
return self._currentX
@xPos.setter
def xPos(self, value):
"""Set current x position"""
self._currentX = value
def update_movement(self, player):
"""Update enemy movement based on attack pattern"""
if self.attackPattern['type'] == 'hunter':
# Calculate distance to player
distanceToPlayer = player.xPos - self.xPos
if abs(distanceToPlayer) <= (self.patrolEnd - self.patrolStart): # Use full range
# Player is within movement range
if self.movingRight:
# Moving right
if distanceToPlayer < -self.turnThreshold:
# Player is too far behind us, turn around
self.movingRight = False
else:
self.xPos += self.movementSpeed
else:
# Moving left
if distanceToPlayer > self.turnThreshold:
# Player is too far ahead of us, turn around
self.movingRight = True
else:
self.xPos -= self.movementSpeed
# Ensure we stay within our range
if self.xPos <= self.patrolStart:
self.xPos = self.patrolStart
self.movingRight = True
elif self.xPos >= self.patrolEnd:
self.xPos = self.patrolEnd
self.movingRight = False
else:
# Player out of range, return to normal patrol
self.patrol_movement()
else:
# Default patrol behavior
self.patrol_movement()
def patrol_movement(self):
"""Standard back-and-forth patrol movement"""
if self.movingRight:
self.xPos += self.movementSpeed
if self.xPos >= self.patrolEnd:
self.movingRight = False
else:
self.xPos -= self.movementSpeed
if self.xPos <= self.patrolStart:
self.movingRight = True
def update(self, currentTime, player):
"""Update enemy position and handle attacks"""
if not self.isActive or self.health <= 0:
return
# Zombie behavior - always chase player
# Handle movement based on enemy type
if self.enemyType == "zombie":
# Determine direction to player
# Zombies always chase player
if player.xPos > self.xPos:
self.movingRight = True
self.xPos += self.movementSpeed
@@ -63,20 +114,13 @@ class Enemy(Object):
self.movingRight = False
self.xPos -= self.movementSpeed
else:
# Normal patrol behavior for other enemies
if self.movingRight:
self.xPos += self.movementSpeed
if self.xPos >= self.patrolEnd:
self.movingRight = False
else:
self.xPos -= self.movementSpeed
if self.xPos <= self.patrolStart:
self.movingRight = True
# Other enemies use their attack pattern
self.update_movement(player)
# Check for attack opportunity
if self.can_attack(currentTime, player):
self.attack(currentTime, player)
def can_attack(self, currentTime, player):
"""Check if enemy can attack player"""
# Must have cooled down from last attack
@@ -128,4 +172,3 @@ class Enemy(Object):
# Update stats
self.level.player.stats.update_stat('Enemies killed', 1)
self.level.player.stats.update_stat('Enemies remaining', -1)