Initial commit: Plants turn-based battle game
@@ -0,0 +1,64 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
import pygame
|
||||
|
||||
_ASSETS = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def sprite(name: str, variant: str = "") -> str:
|
||||
"""Path to a unit sprite, e.g. sprite('sweet pea') -> assets/sprites/sweet_pea.png.
|
||||
With a variant ('full' or 'head') looks under the split folders, e.g.
|
||||
sprite('daisy', 'head') -> assets/sprites/plant_head/daisy_head.png."""
|
||||
base = name.lower().replace(' ', '_')
|
||||
if variant:
|
||||
return os.path.join(_ASSETS, "sprites", f"plant_{variant}", f"{base}_{variant}.png")
|
||||
return os.path.join(_ASSETS, "sprites", f"{base}.png")
|
||||
|
||||
|
||||
def load_sprite(name: str, variant: str = "") -> "pygame.Surface":
|
||||
"""Load a unit sprite, trying the split variant first ('full'/'head') and
|
||||
falling back to the legacy single sprite when the variant file is missing.
|
||||
Returns a surface or None."""
|
||||
def _exists(nm):
|
||||
p = sprite(nm)
|
||||
if os.path.exists(p):
|
||||
return p
|
||||
return None
|
||||
try:
|
||||
if variant:
|
||||
path = sprite(name, variant)
|
||||
if not os.path.exists(path):
|
||||
path = _exists(name)
|
||||
if path is None:
|
||||
return None
|
||||
else:
|
||||
path = _exists(name)
|
||||
if path is None:
|
||||
return None
|
||||
return pygame.image.load(path).convert_alpha()
|
||||
except (pygame.error, OSError):
|
||||
return None
|
||||
|
||||
|
||||
def icon(category: str, name: str) -> str:
|
||||
"""Path to an icon under a category folder, e.g. icon('currency_icons', 'coin')
|
||||
-> assets/icons/currency_icons/coin.png"""
|
||||
return os.path.join(_ASSETS, "icons", category, f"{name}.png")
|
||||
|
||||
|
||||
def type_icon_path(ptype: str) -> str:
|
||||
"""Path to a plant type icon, e.g. type_icon_path('radiant') -> assets/icons/types/radiant_icon.png"""
|
||||
return icon("types", f"{ptype}_icon")
|
||||
|
||||
|
||||
def plot_icon_path(name: str) -> str:
|
||||
"""Path to a soil plot sprite, e.g. plot_icon_path('soil_barren') -> assets/icons/plot/soil_barren.png"""
|
||||
return icon("plot", name)
|
||||
|
||||
|
||||
def rune_icon_path(color: str) -> str:
|
||||
"""Path to a rune sprite by color, e.g. rune_icon_path('red') -> assets/icons/runes/ruby_rune.png"""
|
||||
from engine import runes
|
||||
return icon("runes", runes.RUNE_ICON_FILES.get(color, "rune_brown"))
|
||||
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 209 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 386 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 44 KiB |