65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass, field, asdict
|
|
from typing import List, Dict
|
|
|
|
@dataclass
|
|
class Actor:
|
|
id: str
|
|
name: str
|
|
init: float
|
|
hp: int = 0
|
|
ac: int = 0
|
|
type: str = 'pc' # 'pc' | 'npc' | 'monster'
|
|
note: str = ''
|
|
avatar: str = '' # URL or local filename under /avatars
|
|
active: bool = True
|
|
visible: bool = True
|
|
dead: bool = False
|
|
conc: bool = False
|
|
reveal_ac: bool = False
|
|
effects: List[str] = field(default_factory=list)
|
|
|
|
@dataclass
|
|
class Preset:
|
|
id: str
|
|
name: str
|
|
hp: int = 0
|
|
ac: int = 0
|
|
type: str = 'pc'
|
|
note: str = ''
|
|
avatar: str = ''
|
|
|
|
@dataclass
|
|
class PresetGroup:
|
|
id: str
|
|
name: str
|
|
member_ids: List[str] = field(default_factory=list) # preset ids
|
|
|
|
# Conditions + icons
|
|
KNOWN_CONDITIONS = [
|
|
'poisoned','prone','grappled','restrained','stunned','blinded','deafened',
|
|
'charmed','frightened','paralyzed','petrified','unconscious'
|
|
]
|
|
CONDITION_ICON_FILES: Dict[str, str] = { c: f"{c}.svg" for c in KNOWN_CONDITIONS }
|
|
|
|
CURATED_ICON_SLUGS: Dict[str, tuple] = {
|
|
'blinded': ('delapouite', 'blindfold'),
|
|
'deafened': ('skoll', 'hearing-disabled'),
|
|
'charmed': ('lorc', 'charm'),
|
|
'frightened': ('lorc', 'terror'),
|
|
'poisoned': ('sbed', 'poison-cloud'),
|
|
'prone': ('delapouite', 'half-body-crawling'),
|
|
'grappled': ('lorc', 'grab'),
|
|
'restrained': ('lorc', 'manacles'),
|
|
'stunned': ('skoll', 'knockout'),
|
|
'paralyzed': ('delapouite', 'frozen-body'),
|
|
'petrified': ('delapouite', 'stone-bust'),
|
|
'unconscious':('lorc', 'coma'),
|
|
}
|
|
|
|
CONDITION_EMOJI = {
|
|
'poisoned':'☠️','prone':'🧎','grappled':'🤝','restrained':'🪢','stunned':'💫',
|
|
'blinded':'🙈','deafened':'🧏','charmed':'💖','frightened':'😱','paralyzed':'🧍',
|
|
'petrified':'🪨','unconscious':'💤'
|
|
}
|