|
|
@@ -259,6 +259,68 @@ class Chronometer(Text):
|
|
|
self.render()
|
|
|
|
|
|
|
|
|
+class Inventory:
|
|
|
+ def __init__(
|
|
|
+ self,
|
|
|
+ background_color: tuple = settings.INVENTORY_DEFAULT_BACKGROUND_COLOR,
|
|
|
+ text_color: tuple = settings.INVENTORY_DEFAULT_TEXT_COLOR,
|
|
|
+ font: str = '',
|
|
|
+ size: int = 30,
|
|
|
+ ):
|
|
|
+ self.background_color = background_color
|
|
|
+ self.text_color = text_color
|
|
|
+ self._items = {}
|
|
|
+ self.rect = pygame.Rect(
|
|
|
+ 0, 0, settings.WINDOW_WIDTH, settings.WINDOW_HEIGHT
|
|
|
+ )
|
|
|
+ try:
|
|
|
+ if not font:
|
|
|
+ raise FileNotFoundError
|
|
|
+ self.font = pygame.font.Font(join(settings.FONTS_DIR, font), size)
|
|
|
+ except FileNotFoundError:
|
|
|
+ self.font = pygame.font.Font(None, size)
|
|
|
+
|
|
|
+ def add(self, item):
|
|
|
+ if item in self._items.keys():
|
|
|
+ self._items[item] += 1
|
|
|
+ else:
|
|
|
+ self._items.update({item: 1})
|
|
|
+
|
|
|
+ def show(self, key: str = ''):
|
|
|
+ if not isinstance(key, str):
|
|
|
+ raise TypeError(_('Key pressed must be a string.'))
|
|
|
+ if not key or _get_keys()[utils.eval_key(key)]:
|
|
|
+ _globals.visible_inventory = self
|
|
|
+
|
|
|
+ def hide(self, key: str = ''):
|
|
|
+ if not isinstance(key, str):
|
|
|
+ raise TypeError(_('Key pressed must be a string.'))
|
|
|
+ if not key or _get_keys()[utils.eval_key(key)]:
|
|
|
+ _globals.visible_inventory = None
|
|
|
+
|
|
|
+ def draw(self):
|
|
|
+ shape = pygame.Surface(self.rect.size, pygame.SRCALPHA)
|
|
|
+ pygame.draw.rect(shape, self.background_color, self.rect)
|
|
|
+ _globals._window.blit(shape, self.rect)
|
|
|
+ for pos, item in enumerate(self._items.keys()):
|
|
|
+ width = item.thumbnail.get_width()
|
|
|
+ height = item.thumbnail.get_height()
|
|
|
+ x = (
|
|
|
+ settings.INVENTORY_MARGIN
|
|
|
+ + (pos // settings.INVENTORY_DEFAULT_ITEMS_BY_ROW)
|
|
|
+ * settings.CHARACTER_DEFAULT_THUMBNAIL_SIZE
|
|
|
+ * 4
|
|
|
+ )
|
|
|
+ y = settings.INVENTORY_MARGIN + (pos % 7) * (
|
|
|
+ height + settings.CHARACTER_DEFAULT_THUMBNAIL_SIZE // 2
|
|
|
+ )
|
|
|
+ _globals._window.blit(item.thumbnail, (x, y))
|
|
|
+ _globals._window.blit(
|
|
|
+ self.font.render(f'x{self._items[item]}', 1, self.text_color),
|
|
|
+ (x + width + 10, y + 5),
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
class LevelBar(pygame.Surface):
|
|
|
def __init__(
|
|
|
self,
|