From e7b8d48b0c8a7da8e17966f9523b4d13e1c103e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filips=20Kalni=C5=86=C5=A1?= Date: Sun, 26 Apr 2026 17:07:23 +0000 Subject: [PATCH] Update combat_system.py --- combat_system.py | 133 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 97 insertions(+), 36 deletions(-) diff --git a/combat_system.py b/combat_system.py index 4ee3ef0..2b40033 100644 --- a/combat_system.py +++ b/combat_system.py @@ -1,55 +1,116 @@ # combat_system.py import random +import pygame from settings import * -from items import get_item, ITEMS, WEAPON_STATS +from items import WEAPON_STATS + class CombatSystem: - def __init__(self, weapon_manager): + def __init__(self, weapon_manager=None): self.weapon_manager = weapon_manager + # ========================================================== + # SAFE VECTOR HANDLING + # ========================================================== + def _safe_vec(self, obj): + """Ensure we always get a usable Vector2""" + try: + if isinstance(obj, pygame.Vector2): + return obj + if hasattr(obj, "x") and hasattr(obj, "y"): + return pygame.Vector2(obj.x, obj.y) + if isinstance(obj, (list, tuple)) and len(obj) >= 2: + return pygame.Vector2(obj[0], obj[1]) + except: + pass + return pygame.Vector2(0, 0) + + # ========================================================== + # PLAYER ATTACK + # ========================================================== def player_attack(self, player, enemies): - """ - Handles player attack on enemies using the currently equipped weapon. - """ - # Get weapon ID from weapon manager - weapon_id = self.weapon_manager.get_current_weapon() - if weapon_id is None: - print("DEBUG: No weapon equipped") - return + try: + if not player or not enemies: + return - # Get weapon stats - damage = WEAPON_STATS.get(weapon_id, {}).get("damage", 1) - attack_range = WEAPON_STATS.get(weapon_id, {}).get("range", 50) + # Get weapon safely + weapon_id = None + if self.weapon_manager and hasattr(self.weapon_manager, "get_current_weapon"): + weapon_id = self.weapon_manager.get_current_weapon() - player_pos = player.pos + # Default weapon if none + weapon_data = WEAPON_STATS.get(weapon_id, {}) + damage = weapon_data.get("damage", 5) + attack_range = weapon_data.get("range", 60) - # Attack enemies within range - for enemy in enemies: - if not getattr(enemy, "alive", True): - continue # Skip dead enemies + player_pos = self._safe_vec(getattr(player, "pos", (0, 0))) - enemy_pos = enemy.pos - distance = (enemy_pos - player_pos).length() - if distance <= attack_range: - enemy.health -= damage - print(f"DEBUG: {enemy.name if hasattr(enemy,'name') else 'Enemy'} took {damage} damage! (HP left: {enemy.health})") - if enemy.health <= 0: - enemy.alive = False - print(f"DEBUG: {enemy.name if hasattr(enemy,'name') else 'Enemy'} has been defeated!") + for enemy in enemies: + if not enemy: + continue + if hasattr(enemy, "alive") and not enemy.alive: + continue + + enemy_pos = self._safe_vec(getattr(enemy, "pos", (0, 0))) + distance = (enemy_pos - player_pos).length() + + if distance <= attack_range: + direction = 1 if enemy_pos.x > player_pos.x else -1 + + # Use proper damage method if exists + if hasattr(enemy, "take_damage"): + enemy.take_damage(damage, direction) + else: + # Fallback + if hasattr(enemy, "health"): + enemy.health -= damage + if enemy.health <= 0 and hasattr(enemy, "alive"): + enemy.alive = False + + except Exception as e: + print("CombatSystem.player_attack ERROR:", e) + + # ========================================================== + # ENEMY ATTACK + # ========================================================== def enemy_attack(self, enemy, player): - """ - Handles enemy attack on player. - """ - if not getattr(enemy, "alive", True): - return + try: + if not enemy or not player: + return - # Ensure enemy has attack properties - attack_range = getattr(enemy, "attack_range", 50) - attack_damage = getattr(enemy, "attack_damage", ENEMY_ATTACK_DAMAGE) + if hasattr(enemy, "alive") and not enemy.alive: + return - distance = (enemy.pos - player.pos).length() - if distance <= attack_range: + enemy_pos = self._safe_vec(getattr(enemy, "pos", (0, 0))) + player_pos = self._safe_vec(getattr(player, "pos", (0, 0))) + + attack_range = getattr(enemy, "attack_range", 50) + attack_damage = getattr(enemy, "attack_damage", ENEMY_ATTACK_DAMAGE) + + distance = (enemy_pos - player_pos).length() + + if distance <= attack_range: + direction = 1 if player_pos.x > enemy_pos.x else -1 + + if hasattr(player, "take_damage"): + player.take_damage(attack_damage, direction) + else: + if hasattr(player, "health"): + player.health -= attack_damage + + except Exception as e: + print("CombatSystem.enemy_attack ERROR:", e) + + # ========================================================== + # UPDATE + # ========================================================== + def update(self, dt): + # Keep safe even if dt is weird + try: + dt = float(dt) + except: + dt = 0 player.health -= attack_damage print(f"DEBUG: Player took {attack_damage} damage! (HP left: {player.health})")