add/edit/delete sectors and participants in campaign

This commit is contained in:
Maxime Réaux 2026-01-30 00:34:22 +01:00
parent 495a5adb98
commit 2816da010c
22 changed files with 1799 additions and 923 deletions

View file

@ -1,6 +1,5 @@
from __future__ import annotations
from uuid import uuid4
from datetime import datetime
from warchron.model.round import Round
@ -9,8 +8,8 @@ class Campaign:
self.id: str = str(uuid4())
self.name: str = name
self.month: int = month
self.participants = {}
self.sectors = {}
self.participants: dict[str, CampaignParticipant] = {}
self.sectors: dict[str, Sector] = {}
self.rounds = []
self.is_over = False
@ -46,6 +45,61 @@ class Campaign:
camp.set_state(data.get("is_over", False))
return camp
# Campaign participant methods
def get_all_campaign_participants_ids(self) -> set[str]:
return set(self.participants.keys())
def has_participant(self, player_id: str) -> bool:
return player_id in self.participants
def add_campaign_participant(self, player_id: str, leader: str, theme: str) -> CampaignParticipant:
if player_id in self.participants:
raise ValueError("Player already registered in this campaign")
participant = CampaignParticipant(player_id, leader, theme)
self.participants[participant.id] = participant
return participant
def get_campaign_participant(self, id: str) -> CampaignParticipant:
return self.participants[id]
def get_all_campaign_participants(self) -> list[CampaignParticipant]:
return list(self.participants.values())
def update_campaign_participant(self, player_id: str, *, leader: str, theme: str):
part = self.get_campaign_participant(player_id)
part.set_leader(leader)
part.set_theme(theme)
def remove_campaign_participant(self, player_id: str):
del self.participants[player_id]
# Sector methods
def add_sector(self, name: str, round_id: str, major_id: str, minor_id: str, influence_id: str) -> Sector:
sect = Sector(name, round_id, major_id, minor_id, influence_id)
self.sectors[sect.id] = sect
return sect
def get_sector(self, id: str) -> Sector:
return self.sectors[id]
def get_all_sectors(self) -> list[Sector]:
return list(self.sectors.values())
def update_sector(self, sector_id: str, *, name: str, round_id: str, major_id: str, minor_id: str, influence_id: str):
sect = self.get_sector(sector_id)
sect.set_name(name)
sect.set_round(round_id)
sect.set_major(major_id)
sect.set_minor(minor_id)
sect.set_influence(influence_id)
def remove_sector(self, sector_id: str):
del self.sectors[sector_id]
# Round methods
def has_round(self, round_id: str) -> bool:
return any(r.id == round_id for r in self.rounds)
@ -66,23 +120,59 @@ class Campaign:
self.rounds.remove(rnd)
def get_round_index(self, round_id: str) -> int:
if round_id is None:
return None
for index, rnd in enumerate(self.rounds, start=1):
if rnd.id == round_id:
return index
raise KeyError("Round not found in campaign")
def get_round_name(self, round_id: str | None) -> str:
if round_id is None:
return ""
for rnd in self.rounds:
if rnd.id == round_id:
return rnd.name
return ""
class CampaignParticipant:
def __init__(self,war_participant_id: str, leader: str):
self.id: str = war_participant_id # ref to War.participants
def __init__(self,player_id: str, leader: str, theme: str):
self.id: str = player_id # ref to War.participants
self.leader: str = leader
self.victory_points = 0
self.objective_points = {}
self.theme: str = theme
def set_id(self, new_id: str):
self.id = new_id
def set_leader(self, new_faction: str):
self.leader = new_faction
def set_theme(self, new_theme: str):
self.theme = new_theme
class Sector:
def __init__(self, name: str, round_id: str, major_id: str, minor_id: str, influence_id: str):
self.id: str = str(uuid4())
self.name: str = name
self.round_id: str = round_id
self.major_objective_id: str = major_id
self.minor_objective_id: str = minor_id
self.influence_objective_id: str = influence_id
self.round_id: str = round_id
def set_id(self, new_id: str):
self.id = new_id
def set_name(self, new_name: str):
self.name = new_name
def set_round(self, new_round_id: str):
self.round_id = new_round_id
def set_major(self, new_major_id: str):
self.major_objective_id = new_major_id
def set_minor(self, new_minor_id: str):
self.minor_objective_id = new_minor_id
def set_influence(self, new_influence_id: str):
self.influence_objective_id = new_influence_id