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:
81
src/enemy.py
81
src/enemy.py
@@ -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)
|
||||
|
Reference in New Issue
Block a user