73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import List
|
|
|
|
from .skills import S_ATTACKED_THIS_TURN, Skill
|
|
|
|
TEAM_PLAYER = 0
|
|
TEAM_ENEMY = 1
|
|
|
|
ROLE_ATTACKER = "attacker"
|
|
ROLE_SUPPORT = "support"
|
|
ROLE_TANK = "tank"
|
|
ROLES = (ROLE_ATTACKER, ROLE_SUPPORT, ROLE_TANK)
|
|
|
|
# Shared presentation for roles: human name, accent color, and icon file.
|
|
ROLE_NAMES = {
|
|
ROLE_ATTACKER: "Attacker",
|
|
ROLE_SUPPORT: "Support",
|
|
ROLE_TANK: "Tank",
|
|
}
|
|
ROLE_ICONS = {
|
|
ROLE_ATTACKER: "attacker_icon",
|
|
ROLE_SUPPORT: "supporter_icon",
|
|
ROLE_TANK: "tank_icon",
|
|
}
|
|
ROLE_COLORS = {
|
|
ROLE_ATTACKER: (235, 130, 90),
|
|
ROLE_SUPPORT: (120, 155, 235),
|
|
ROLE_TANK: (235, 200, 90),
|
|
}
|
|
|
|
|
|
@dataclass
|
|
class Unit:
|
|
name: str
|
|
team: int
|
|
plant_type: str
|
|
max_hp: int
|
|
attack: int
|
|
speed: int
|
|
defense: int
|
|
skills: List[Skill]
|
|
role: str = ""
|
|
crit: float = 0.10
|
|
passive: str = ""
|
|
passive_value: int = 0
|
|
sort_order: int = 0
|
|
runes: List = field(default_factory=list) # (effect_key, pct_fraction) per equipped rune
|
|
|
|
hp: int = field(init=False)
|
|
alive: bool = field(init=False)
|
|
status: dict = field(default_factory=dict)
|
|
acted: bool = field(default=False)
|
|
next_at: float = field(default=0.0)
|
|
level: int = field(default=1)
|
|
stage: int = field(default=1)
|
|
first_skill_used: bool = field(default=False) # primrose
|
|
used_once: bool = field(default=False) # generic "first time" flags
|
|
injected_index: int = field(default=-1, init=False)
|
|
injected_name: str = field(default="", init=False)
|
|
|
|
def __post_init__(self) -> None:
|
|
self.hp = self.max_hp
|
|
self.alive = True
|
|
self.status = {}
|
|
|
|
def reset_turn_flags(self) -> None:
|
|
self.acted = False
|
|
self.status.pop(S_ATTACKED_THIS_TURN, None)
|
|
|
|
def __repr__(self) -> str:
|
|
return self.name |