Overall Notes: Phases might only affect the Game Class instead of Player.

%%{init: {"theme": "default"}%%
%% Draft ChanceCard
sequenceDiagram
participant Phase as :Phase
participant Binazir as :Binazir
participant Player as :Player
participant Deck as :Deck
participant ChanceCard as :ChanceCard
Note over Player: Draft ChanceCard

Phase->>Player: Phase(Draft)
Binary->>Player: Phae(Draft)
Player->>+Deck: DrawChanceCard()
Deck-->>-Player: ReturnChanceCard()
Player->>+ChanceCard: ApplyEffects()
ChanceCard-->>-Player: Effects
Player->>+Deck: UpdateLastChanceCard()
Deck-->>-Player: Updated last chance card

%%{init: {"theme": "default"}%%
%% Exchange Army
%% NOTE: This can change depends on the army changeing conditions.
sequenceDiagram
participant Phase as :Phase
participant Player as :Player
participant Game as :Game
participant Inventory as :Inventory
Note over Player: Fortify :Phase

Phase->>Player: Phase(Fortify)
Player->>+Game: ViewArmyOptions()
Game-->>-Player: DisplayArmyOptions()
Player->>+Game: SelectArmyChanges()
Game-->>-Player: ConfirmArmyChanges()
Player->>+Inventory: UpdateArmy()
Inventory-->>-Player: Updated army
%%{init: {"theme": "default"}%%
%% Game Setup
sequenceDiagram
    participant Player as :Player
    participant NameModule as :Name
    participant AvatarModule as :Avatar

    Note over Player: Game Setup

    loop For Each Player
        Player ->>+ NameModule: EnterName()
        NameModule -->>- Player: Name Confirmed
        Player ->>+ AvatarModule: ChooseAvatar()
        AvatarModule -->>- Player: Avatar Confirmed
        Player ->> Player: ChooseColor()
        Player -->> Player: Color Confirmed
    end
%%{init: {"theme": "default"}%%
%% Conquer Territory
%% NOTE: TerritoryCard Class Has not been used, this can be changed
sequenceDiagram
participant Player as :Player
participant Game as :Game
participant Territory as :Territory
participant Inventory as :Inventory

Note over Player: Conquer Territory

    Player->>+Game: BattleResult(Win)
    Game->>+Territory: ChangeOwner()
    Territory-->>-Game: Owner Changed
    Game->>Player: TerritoryConquered()
    Game->>+Inventory: AddTerritoryCard()
    Inventory-->>-Game: Territory card added
    Game->>Player: Territory card added

%%{init: {"theme": "default"}%%
%% Enable/Disable Territories | BUILDING MODE
%% NOTE: The disabled territories are ejected from related Continent \\n
%% so it can be leaved as it is (the list of territories).
sequenceDiagram
participant Phase as :Phase
participant Game as :Game
participant Player as :Player
participant Territory as :Territory
participant Continent as :Continent
participant WorldMap as :WorldMap
Note over Phase: Building Mode
Phase->>+Game: Phase(Building)

loop Each Player's Turn
    Game->>Player: SelectTerritories()
    Player->>+Game: Chosen Territories
    Game->>+Territory: EnableDisableTerritories()
    Territory-->>-Game: Territories Updated
    Game->>+Continent: SetContinentList()
    Continent-->>-Game: New Continent List
    Game->>+WorldMap: FixWorldMap()
    WorldMap-->>-Game: World Map Fixed
    Game->>Player: UpdateArmyNumber()
end
%%{init: {"theme": "default"}%%
%% Initial Army Placement
sequenceDiagram
participant Game as :Game
participant Player as :Player
participant Territory as :Territory
participant Inventory as :Inventory

Note over Game: Initial Army Placement

loop Each Player's Turn
    Game->>Player: GetArmyNumber()
    loop While Army Number > 0
        Player->>+Territory: PlaceArmy()
        Territory-->>-Player: Army placed
        Player->>+Inventory: UpdateArmyNumber()
        Inventory-->>-Player: Army number updated
    end
end
%%{init: {"theme": "default"}%%
%% Grant Army 
sequenceDiagram
participant Phase as :Phase
participant Player as :Player
participant Game as :Game
participant Inventory as :Inventory
participant Territory as :Territory

Note over Phase: Grant Army
Phase->>Player: Phase(Fortify)

Player->>+Game: GetTerritoryNum
Game-->>-Player: Territory Count
Game->>+Player: GiveArmy()
Player->>+Inventory: AddArmy()
Inventory-->>-Player: Army Number Updated
loop While ArmyNumber > 0
  Player->>Territory: SelectTerritory()
  Player->>+Territory: UpdateArmy()
  Territory-->>-Player: Army Count on Territory Updated
  Player->>+Inventory: PlaceArmy()
  Inventory-->>-Player: Army Number Updated
end%%{init: {"theme": "default"}%%
%%{init: {"theme": "default"}%%
%% Pause/Resume Game
%% NOTE: phase paused can be canceled
sequenceDiagram
participant Player as :Player
participant Game as :Game
participant Phase as :Phase
Note over Player: :Pause/Resume

Player->>+Game: Pause/ResumaGame()
Game->>+Phase: SetPhase(Paused)
Phase-->>-Game: Phase Set to Paused
Game-->>-Player: Game Paused

Note over Phase: Paused
Note over Player, Game: No actions allowed during pause

Player->>+Game: Pause/ResumeGame
Game->>+Phase: SetPhase(Playing)
Phase-->>-Game: Phase Set to Playing
Game-->>-Player: Game Resumed

Note over Phase: Playing
%%{init: {"theme": "default"}%%
%% DEFENSE
%% NOTE: This can be included to the launch offense section.
sequenceDiagram
participant Attacker as :Player[Attacker]
participant Game as :Game
participant Defender as :Player[Defender]
participant Dice as :Dice
Attacker->>+Game: LaunchOffense()
Game->>+Defender: NotifyAttack()

loop Until one side has no armies left
    Game->>+Attacker: Attacker's turn to roll dice
    Attacker->>+Dice: RollDice()
    Dice-->>-Attacker: DiceResult()

    Game->>+Defender: Defender's turn to roll dice
    Defender->>+Dice: RollDice()
    Dice-->>-Defender: DiceResult()

    Game->>Game: Compare dice results and update army counts

end

Game->>Game: Determine winner and update territories
%%{init: {"theme": "default"}%%
%% End Turn
sequenceDiagram
participant Player1 as :Player1
participant Player2 as :Player2
participant Game as :Game

Note over Player1: End Turn

Player1->>+Game: End Turn
Game->>Game: End Turn for Player1, Start Turn for Player2
Game->>+Player2: StartTurn()