warchron_app/src/warchron/model/battle.py
2026-02-12 10:07:03 +01:00

80 lines
2.8 KiB
Python

from __future__ import annotations
from typing import Any, Dict
class Battle:
def __init__(
self,
sector_id: str,
player_1_id: str | None = None,
player_2_id: str | None = None,
):
self.sector_id: str = sector_id # ref to Campaign.sector
self.player_1_id: str | None = player_1_id # ref to Campaign.participants
self.player_2_id: str | None = player_2_id # ref to Campaign.participants
self.winner_id: str | None = (
None # ref to Campaign.participants within player_1/2
)
self.score: str | None = None
self.victory_condition: str | None = None
self.comment: str | None = None
def set_id(self, new_id: str) -> None:
self.sector_id = new_id
def set_player_1(self, new_player_id: str | None) -> None:
self.player_1_id = new_player_id
def set_player_2(self, new_player_id: str | None) -> None:
self.player_2_id = new_player_id
def set_winner(self, new_player_id: str | None) -> None:
self.winner_id = new_player_id
def set_score(self, new_score: str | None) -> None:
self.score = new_score
def set_victory_condition(self, new_victory_condition: str | None) -> None:
self.victory_condition = new_victory_condition
def set_comment(self, new_comment: str | None) -> None:
self.comment = new_comment
def is_draw(self) -> bool:
if self.winner_id is not None:
return False
# Case 1: score entered → interpreted as unresolved outcome
if self.score and self.score.strip():
return True
# Case 2: explicit draw mention
if self.victory_condition:
if "draw" in self.victory_condition.casefold():
return True
return False
def is_finished(self) -> bool:
return self.winner_id is not None or self.is_draw()
def toDict(self) -> Dict[str, Any]:
return {
"sector_id": self.sector_id,
"player_1_id": self.player_1_id or None,
"player_2_id": self.player_2_id or None,
"winner_id": self.winner_id or None,
"score": self.score or None,
"victory_condition": self.victory_condition or None,
"comment": self.comment or None,
}
@staticmethod
def fromDict(data: Dict[str, Any]) -> Battle:
battle = Battle(
data["sector_id"],
data.get("player_1_id") or None,
data.get("player_2_id") or None,
)
battle.winner_id = data.get("winner_id") or None
battle.score = data.get("score") or None
battle.victory_condition = data.get("victory_condition") or None
battle.comment = data.get("comment") or None
return battle