Game Classes

%%{init: {"theme": "default"}%%
classDiagram
direction LR
Game "1" --> "1" GameMap : contains
Game "1" --> "*" Player : contains
Game "1" --> "1" Dice : contains
Game "1" --> "1" Deck : contains
class Game {
	- GameMap map
	- List~Player~ players
	- Player currentPlayer
	- int roundCount
}
class Dice {
    - int sides
    + roll(): int
    + roll(int times): int
}
Deck --> ChanceCardFactory : uses
Deck --> ArmyCardFactory : uses
Deck --> TerritoryCardFactory : uses
ChanceCardFactory --> ChanceCard : creates
ArmyCardFactory --> ArmyCard : creates
TerritoryCardFactory --> TerritoryCard : creates
class Deck {
    - List~Card~ cards
    + createDeck(): Deck
    + createArmyCards(): void
    + createTerritoryCards(): void
    + isEmpty(): boolean
    + checkDeck(): void
    + shuffle(): void
    + drawChanceCard(): ChanceCard
    + drawCard(): Card
}
Infantry --|> Army : extends
Mercenary --|> Infantry : extends
Cavalry --|> Army : extends
Artillery --|> Army : extends
ArmyFactory --> Army : creates
class ArmyFactory {
    <<interface>>
}
class Army {
    - ArmyType type
    - int value
}
class Infantry {
    ...
}
class Mercenary {
    ...
}
class Cavalry {
    ...
}
class Artillery {
    ...
}
Army *--> ArmyType
class ArmyType {
    <<enumeration>>
    Infantry
    Cavalry
    Artillery
    Mercenary
}
ArmyCard --|> Card : extends
TerritoryCard --|> Card : extends
ChanceCard --|> Card : extends
class Card {
    - CardType type
}
class TerritoryCard {
    - Territory territory
    + getContinent(): Continent
}
class ArmyCard {
    - ArmyType armyType
}
class ChanceCard {
    - ChanceType type
    - String name
    - String description
    + getEffect(): ChanceCardEffect
}
Card *--> CardType
class CardType {
    <<enumeration>>
    Army
    Territory
    Chance
}
ChanceCard *--> ChanceType
class ChanceType {
    <<enumeration>>
    Revolt
    NuclearStrike
    Sabotage
    DiplomaticImmunity
    Mercenaries
    Revolution
    Draft
    Bombardment
    Reinforcements
}
class ChanceCardEffect {
    <<interface>>
    + applyEffect(): void
}
ChanceCard --> ChanceEffects : uses
ChanceEffects --> ChanceCardEffect : produces
class ChanceEffects {
    + static all: List~ChanceCardEffect~
    + static allExcept(ChanceType...types): List~ChanceCardEffect~
    + static getFromType(ChanceType type): ChanceCardEffect
    + static getRandom(): ChanceType
    + static getRandom(ChanceType...types): ChanceType
}
ChanceCardEffect --> Game : applies