1
0

Add initial equipment, and allow equipping items. This completes the main tutorial

This commit is contained in:
Timothy Warren 2022-02-08 10:40:14 -05:00
parent 359258862d
commit ceeaf22d2f
4 changed files with 47 additions and 10 deletions

View File

@ -82,9 +82,22 @@ class ItemAction(Action):
class DropItem(ItemAction): class DropItem(ItemAction):
def perform(self) -> None: def perform(self) -> None:
if self.entity.equipment.item_is_equipped(self.item):
self.entity.equipment.toggle_equip(self.item)
self.entity.inventory.drop(self.item) self.entity.inventory.drop(self.item)
class EquipAction(Action):
def __init__(self, entity: Actor, item: Item):
super().__init__(entity)
self.item = item
def perform(self) -> None:
self.entity.equipment.toggle_equip(self.item)
class WaitAction(Action): class WaitAction(Action):
def perform(self) -> None: def perform(self) -> None:
pass pass

View File

@ -1,15 +1,14 @@
from __future__ import annotations from __future__ import annotations
import os import os
from typing import overload, Callable, Optional, Tuple, TYPE_CHECKING, Union from typing import overload, Callable, Optional, Tuple, TYPE_CHECKING, Union
import tcod.event import tcod.event
import actions import actions
from actions import Action, BumpAction, PickupAction, WaitAction
import color import color
import exceptions import exceptions
from actions import Action, BumpAction, PickupAction, WaitAction
if TYPE_CHECKING: if TYPE_CHECKING:
from engine import Engine from engine import Engine
@ -344,7 +343,15 @@ class InventoryEventHandler(AskUserEventHandler):
if number_of_items_in_inventory > 0: if number_of_items_in_inventory > 0:
for i, item in enumerate(self.engine.player.inventory.items): for i, item in enumerate(self.engine.player.inventory.items):
item_key = chr(ord("a") + i) item_key = chr(ord("a") + i)
console.print(x + 1, y + i + 1, f"({item_key}) {item.name}")
is_equipped = self.engine.player.equipment.item_is_equipped(item)
item_string = f"({item_key}) {item.name}"
if is_equipped:
item_string = f"{item_string} (E)"
console.print(x + 1, y + i + 1, item_string)
else: else:
console.print(x + 1, y + 1, "(Empty)") console.print(x + 1, y + 1, "(Empty)")
@ -375,8 +382,13 @@ class InventoryActivateHandler(InventoryEventHandler):
TITLE = "Select an item to use" TITLE = "Select an item to use"
def on_item_selected(self, item: Item) -> Optional[ActionOrHandler]: def on_item_selected(self, item: Item) -> Optional[ActionOrHandler]:
"""Return the action for the selected item.""" if item.consumable:
# Return the action for the selected item.
return item.consumable.get_action(self.engine.player) return item.consumable.get_action(self.engine.player)
elif item.equippable:
return actions.EquipAction(self.engine.player, item)
else:
return None
class InventoryDropHandler(InventoryEventHandler): class InventoryDropHandler(InventoryEventHandler):

View File

@ -6,8 +6,8 @@ from typing import Dict, Iterator, List, Tuple, TYPE_CHECKING
import tcod import tcod
import entity_factories import entity_factories
from game_map import GameMap
import tile_types import tile_types
from game_map import GameMap
if TYPE_CHECKING: if TYPE_CHECKING:
from engine import Engine from engine import Engine
@ -27,8 +27,8 @@ max_monsters_by_floor = [
item_chances: Dict[int, List[Tuple[Entity, int]]] = { item_chances: Dict[int, List[Tuple[Entity, int]]] = {
0: [(entity_factories.health_potion, 35)], 0: [(entity_factories.health_potion, 35)],
2: [(entity_factories.confusion_scroll, 10)], 2: [(entity_factories.confusion_scroll, 10)],
4: [(entity_factories.lightning_scroll, 25)], 4: [(entity_factories.lightning_scroll, 25), (entity_factories.sword, 5)],
6: [(entity_factories.fireball_scroll, 25)], 6: [(entity_factories.fireball_scroll, 25), (entity_factories.chain_mail, 15)],
} }
enemy_chances: Dict[int, List[Tuple[Entity, int]]] = { enemy_chances: Dict[int, List[Tuple[Entity, int]]] = {

View File

@ -10,10 +10,10 @@ from typing import Optional
import tcod import tcod
import color import color
from engine import Engine
import entity_factories import entity_factories
from game_map import GameWorld
import input_handlers import input_handlers
from engine import Engine
from game_map import GameWorld
# Load the background image and remove the alpha channel. # Load the background image and remove the alpha channel.
background_image = tcod.image.load("menu_background.png")[:, :, :3] background_image = tcod.image.load("menu_background.png")[:, :, :3]
@ -47,6 +47,18 @@ def new_game() -> Engine:
"Hello and welcome, adventurer, to yet another dungeon!", color.welcome_text "Hello and welcome, adventurer, to yet another dungeon!", color.welcome_text
) )
dagger = copy.deepcopy(entity_factories.dagger)
leather_armor = copy.deepcopy(entity_factories.leather_armor)
dagger.parent = player.inventory
leather_armor.parent = player.inventory
player.inventory.items.append(dagger)
player.equipment.toggle_equip(dagger, add_message=False)
player.inventory.items.append(leather_armor)
player.equipment.toggle_equip(leather_armor, add_message=False)
return engine return engine