80 lines
2.8 KiB
Python
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
|