|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from typing import TYPE_CHECKING, Optional |
| 4 | + |
| 5 | +import game.components.base_component |
| 6 | +import game.equipment_types |
| 7 | + |
| 8 | +if TYPE_CHECKING: |
| 9 | + import game.entity |
| 10 | + |
| 11 | + |
| 12 | +class Equipment(game.components.base_component.BaseComponent): |
| 13 | + parent: game.entity.Actor |
| 14 | + |
| 15 | + def __init__(self, weapon: Optional[game.entity.Item] = None, armor: Optional[game.entity.Item] = None): |
| 16 | + self.weapon = weapon |
| 17 | + self.armor = armor |
| 18 | + |
| 19 | + @property |
| 20 | + def defense_bonus(self) -> int: |
| 21 | + bonus = 0 |
| 22 | + |
| 23 | + if self.weapon is not None and self.weapon.equippable is not None: |
| 24 | + bonus += self.weapon.equippable.defense_bonus |
| 25 | + |
| 26 | + if self.armor is not None and self.armor.equippable is not None: |
| 27 | + bonus += self.armor.equippable.defense_bonus |
| 28 | + |
| 29 | + return bonus |
| 30 | + |
| 31 | + @property |
| 32 | + def power_bonus(self) -> int: |
| 33 | + bonus = 0 |
| 34 | + |
| 35 | + if self.weapon is not None and self.weapon.equippable is not None: |
| 36 | + bonus += self.weapon.equippable.power_bonus |
| 37 | + |
| 38 | + if self.armor is not None and self.armor.equippable is not None: |
| 39 | + bonus += self.armor.equippable.power_bonus |
| 40 | + |
| 41 | + return bonus |
| 42 | + |
| 43 | + def item_is_equipped(self, item: game.entity.Item) -> bool: |
| 44 | + return self.weapon == item or self.armor == item |
| 45 | + |
| 46 | + def unequip_message(self, item_name: str) -> None: |
| 47 | + self.parent.parent.engine.message_log.add_message(f"You remove the {item_name}.") |
| 48 | + |
| 49 | + def equip_message(self, item_name: str) -> None: |
| 50 | + self.parent.parent.engine.message_log.add_message(f"You equip the {item_name}.") |
| 51 | + |
| 52 | + def equip_to_slot(self, slot: str, item: game.entity.Item, add_message: bool) -> None: |
| 53 | + current_item = getattr(self, slot) |
| 54 | + |
| 55 | + if current_item is not None: |
| 56 | + self.unequip_from_slot(slot, add_message) |
| 57 | + |
| 58 | + setattr(self, slot, item) |
| 59 | + |
| 60 | + if add_message: |
| 61 | + self.equip_message(item.name) |
| 62 | + |
| 63 | + def unequip_from_slot(self, slot: str, add_message: bool) -> None: |
| 64 | + current_item = getattr(self, slot) |
| 65 | + |
| 66 | + if add_message: |
| 67 | + self.unequip_message(current_item.name) |
| 68 | + |
| 69 | + setattr(self, slot, None) |
| 70 | + |
| 71 | + def toggle_equip(self, equippable_item: game.entity.Item, add_message: bool = True) -> None: |
| 72 | + if ( |
| 73 | + equippable_item.equippable |
| 74 | + and equippable_item.equippable.equipment_type == game.equipment_types.EquipmentType.WEAPON |
| 75 | + ): |
| 76 | + slot = "weapon" |
| 77 | + else: |
| 78 | + slot = "armor" |
| 79 | + |
| 80 | + if getattr(self, slot) == equippable_item: |
| 81 | + self.unequip_from_slot(slot, add_message) |
| 82 | + else: |
| 83 | + self.equip_to_slot(slot, equippable_item, add_message) |
0 commit comments