1+ from __future__ import annotations
2+
3+ from typing import Optional , TYPE_CHECKING
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 (
48+ f"You remove the { item_name } ."
49+ )
50+
51+ def equip_message (self , item_name : str ) -> None :
52+ self .parent .parent .engine .message_log .add_message (
53+ f"You equip the { item_name } ."
54+ )
55+
56+ def equip_to_slot (self , slot : str , item : game .entity .Item , add_message : bool ) -> None :
57+ current_item = getattr (self , slot )
58+
59+ if current_item is not None :
60+ self .unequip_from_slot (slot , add_message )
61+
62+ setattr (self , slot , item )
63+
64+ if add_message :
65+ self .equip_message (item .name )
66+
67+ def unequip_from_slot (self , slot : str , add_message : bool ) -> None :
68+ current_item = getattr (self , slot )
69+
70+ if add_message :
71+ self .unequip_message (current_item .name )
72+
73+ setattr (self , slot , None )
74+
75+ def toggle_equip (self , equippable_item : game .entity .Item , add_message : bool = True ) -> None :
76+ if (
77+ equippable_item .equippable
78+ and equippable_item .equippable .equipment_type == game .equipment_types .EquipmentType .WEAPON
79+ ):
80+ slot = "weapon"
81+ else :
82+ slot = "armor"
83+
84+ if getattr (self , slot ) == equippable_item :
85+ self .unequip_from_slot (slot , add_message )
86+ else :
87+ self .equip_to_slot (slot , equippable_item , add_message )
0 commit comments