fix inluence_token setting auto cleanup and fix is_dirty
This commit is contained in:
parent
789756d586
commit
3c54a8d4a7
5 changed files with 114 additions and 18 deletions
|
|
@ -3,8 +3,14 @@ from uuid import uuid4
|
|||
from datetime import datetime
|
||||
from typing import Any, Dict, List
|
||||
|
||||
from warchron.model.war_event import WarEvent, InfluenceGained, InfluenceSpent
|
||||
from warchron.model.exception import ForbiddenOperation
|
||||
from warchron.constants import ContextType
|
||||
from warchron.model.war_event import (
|
||||
WarEvent,
|
||||
InfluenceGained,
|
||||
InfluenceSpent,
|
||||
TieResolved,
|
||||
)
|
||||
from warchron.model.exception import ForbiddenOperation, RequiresConfirmation
|
||||
from warchron.model.war_participant import WarParticipant
|
||||
from warchron.model.objective import Objective
|
||||
from warchron.model.campaign_participant import CampaignParticipant
|
||||
|
|
@ -55,10 +61,67 @@ class War:
|
|||
def set_influence_token(self, new_state: bool) -> None:
|
||||
if self.is_over:
|
||||
raise ForbiddenOperation("Can't set influence token of a closed war.")
|
||||
# TODO raise RequiresConfirmation
|
||||
# * disable: cleanup if any token has already been gained/spent
|
||||
# * enable: retrigger battle_outcomes and resolve tie again if any draw
|
||||
self.influence_token = new_state
|
||||
|
||||
def cleanup_token_and_tie() -> None:
|
||||
new_events: List[WarEvent] = []
|
||||
for ev in self.events:
|
||||
if isinstance(ev, (InfluenceSpent, InfluenceGained)):
|
||||
continue
|
||||
if isinstance(ev, TieResolved):
|
||||
ev.set_participant(None)
|
||||
new_events.append(ev)
|
||||
self.events = new_events
|
||||
self.influence_token = new_state
|
||||
|
||||
def reset_tie_break() -> None:
|
||||
new_events: List[WarEvent] = []
|
||||
for ev in self.events:
|
||||
if isinstance(ev, (TieResolved)):
|
||||
if ev.context_type == ContextType.BATTLE:
|
||||
battle = self.get_battle(ev.context_id)
|
||||
campaign = self.get_campaign_by_sector(battle.sector_id)
|
||||
round = campaign.get_round_by_battle(ev.context_id)
|
||||
round.is_over = False
|
||||
elif ev.context_type == ContextType.CAMPAIGN:
|
||||
campaign = self.get_campaign(ev.context_id)
|
||||
campaign.is_over = False
|
||||
else:
|
||||
new_events.append(ev)
|
||||
self.events = new_events
|
||||
# TODO Reopen rounds with battle on sector with influence objective
|
||||
for camp in self.campaigns:
|
||||
for sect in camp.get_all_sectors():
|
||||
if sect.influence_objective_id is not None:
|
||||
round = camp.get_round_by_battle(sect.id)
|
||||
round.is_over = False
|
||||
|
||||
if new_state is False:
|
||||
if not self.events:
|
||||
self.influence_token = new_state
|
||||
return
|
||||
raise RequiresConfirmation(
|
||||
"Some influence tokens already exist in this war.\n"
|
||||
"All tokens will be deleted and tie-breaks will become draw.\n"
|
||||
"Do you want to continue?",
|
||||
action=cleanup_token_and_tie,
|
||||
)
|
||||
if new_state is True:
|
||||
has_tie_resolved = any(isinstance(ev, TieResolved) for ev in self.events)
|
||||
|
||||
grant_influence = any(
|
||||
(sect.influence_objective_id is not None)
|
||||
for camp in self.campaigns
|
||||
for sect in camp.get_all_sectors()
|
||||
)
|
||||
if not has_tie_resolved and not grant_influence:
|
||||
self.influence_token = new_state
|
||||
return
|
||||
raise RequiresConfirmation(
|
||||
"Some influence tokens and draws exist in this war.\n"
|
||||
"All influence outcomes and tie-breaks will be reset.\n"
|
||||
"Do you want to continue?",
|
||||
action=reset_tie_break,
|
||||
)
|
||||
|
||||
def set_state(self, new_state: bool) -> None:
|
||||
self.is_over = new_state
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue