Ghost enemy added, boss for level 10. Levels updated, probably still not final version, but getting close.

This commit is contained in:
Storm Dragon
2025-02-13 13:53:08 -05:00
parent 3edee44fa0
commit 2f96300845
16 changed files with 227 additions and 54 deletions

View File

@@ -43,6 +43,20 @@ class Enemy(Object):
self.damage = level.player.get_max_health() # Instant death
self.health = 1 # Easy to kill
self.attackCooldown = 1500 # Slower attack rate
elif enemyType == "ghost":
self.isVulnerable = False
self.vulnerabilityTimer = 0
self.vulnerabilityDuration = kwargs.get('vulnerability_duration', 3000) # Default 3 seconds
self.invulnerabilityDuration = kwargs.get('invulnerability_duration', 5000) # Default 5 seconds
self.movementSpeed *= kwargs.get('speed_multiplier', 0.8) # Default 80% speed
self.health = kwargs.get('health', 3) # Default 3 HP
self.damage = kwargs.get('damage', 2) # Default 2 damage
self.attackRange = kwargs.get('attack_range', 1) # Use provided or default 1
self.attackCooldown = kwargs.get('attack_cooldown', 1200) # Default 1.2 seconds
self.attackPattern = kwargs.get('attack_pattern', {
'type': 'hunter',
'turn_threshold': 2
})
elif enemyType == "spider":
speedMultiplier = kwargs.get('speed_multiplier', 2.0)
self.movementSpeed *= speedMultiplier # Spiders are faster
@@ -76,6 +90,25 @@ class Enemy(Object):
if not self.isActive or self.health <= 0:
return
# Ghost vulnerability state management
if self.enemyType == "ghost":
if self.isVulnerable and (currentTime - self.vulnerabilityTimer > self.vulnerabilityDuration):
# Switch to invulnerable
self.isVulnerable = False
self.vulnerabilityTimer = currentTime
# Change sound back to base ghost sound
if self.channel:
obj_stop(self.channel)
self.channel = obj_play(self.sounds, "ghost", player.xPos, self.xPos)
elif not self.isVulnerable and (currentTime - self.vulnerabilityTimer > self.invulnerabilityDuration):
# Switch to vulnerable
self.isVulnerable = True
self.vulnerabilityTimer = currentTime
# Change to vulnerable sound
if self.channel:
obj_stop(self.channel)
self.channel = obj_play(self.sounds, "ghost_is_vulnerable", player.xPos, self.xPos)
# Check if player has entered territory
if not self.hunting:
if self.patrolStart <= player.xPos <= self.patrolEnd:
@@ -142,6 +175,10 @@ class Enemy(Object):
def take_damage(self, amount):
"""Handle enemy taking damage"""
# Ghost can only take damage when vulnerable
if self.enemyType == "ghost" and not self.isVulnerable:
return
self.health -= amount
if self.health <= 0:
self.die()