Router : uses AppFrame o--> AppMenuBar : creates AppFrame o--> AppPopupMenu : creates AppMenuBar ..> SystemActions: performs AppPopupMenu ..> SystemActions : performs Router --* IllegalRouteException : throws Router --* RouterConfigException : throw AppFrame ..> AppCfg : uses AppCfg ..> DefaultCfg : uses DefaultCfg <|-- GameConfig : extends class AppFrame { - AppMenuBar menuBar - AppPopupMenu popupMenu - SystemActions systemActions + getAppMenuBar() AppMenuBar + getAppPopupMenu() AppPopupMenu + getSystemActions() SystemActions + initSize() void + initTitle() void + initFrame() void + initMacOSMenus() void + initIcon() void + initMenuBar() void } class AppCfg class DefaultCfg class GameConfig { <> } class AppMenuBar { - AppFrame appFrame + JMenu mainMenu; + JMenuItem aboutMenuItem; + JMenuItem preferencesMenuItem; + JMenuItem quitMenuItem; + JMenu gameMenu; + JMenuItem pauseResum"> Router : uses AppFrame o--> AppMenuBar : creates AppFrame o--> AppPopupMenu : creates AppMenuBar ..> SystemActions: performs AppPopupMenu ..> SystemActions : performs Router --* IllegalRouteException : throws Router --* RouterConfigException : throw AppFrame ..> AppCfg : uses AppCfg ..> DefaultCfg : uses DefaultCfg <|-- GameConfig : extends class AppFrame { - AppMenuBar menuBar - AppPopupMenu popupMenu - SystemActions systemActions + getAppMenuBar() AppMenuBar + getAppPopupMenu() AppPopupMenu + getSystemActions() SystemActions + initSize() void + initTitle() void + initFrame() void + initMacOSMenus() void + initIcon() void + initMenuBar() void } class AppCfg class DefaultCfg class GameConfig { <> } class AppMenuBar { - AppFrame appFrame + JMenu mainMenu; + JMenuItem aboutMenuItem; + JMenuItem preferencesMenuItem; + JMenuItem quitMenuItem; + JMenu gameMenu; + JMenuItem pauseResum"> Router : uses AppFrame o--> AppMenuBar : creates AppFrame o--> AppPopupMenu : creates AppMenuBar ..> SystemActions: performs AppPopupMenu ..> SystemActions : performs Router --* IllegalRouteException : throws Router --* RouterConfigException : throw AppFrame ..> AppCfg : uses AppCfg ..> DefaultCfg : uses DefaultCfg <|-- GameConfig : extends class AppFrame { - AppMenuBar menuBar - AppPopupMenu popupMenu - SystemActions systemActions + getAppMenuBar() AppMenuBar + getAppPopupMenu() AppPopupMenu + getSystemActions() SystemActions + initSize() void + initTitle() void + initFrame() void + initMacOSMenus() void + initIcon() void + initMenuBar() void } class AppCfg class DefaultCfg class GameConfig { <> } class AppMenuBar { - AppFrame appFrame + JMenu mainMenu; + JMenuItem aboutMenuItem; + JMenuItem preferencesMenuItem; + JMenuItem quitMenuItem; + JMenu gameMenu; + JMenuItem pauseResum">
%%{init: {"theme": "default"}%%
classDiagram
direction LR
AppFrame o--> Router : uses
AppFrame o--> AppMenuBar : creates
AppFrame o--> AppPopupMenu : creates
AppMenuBar ..> SystemActions: performs
AppPopupMenu ..> SystemActions : performs
Router --* IllegalRouteException : throws
Router --* RouterConfigException : throw
AppFrame ..> AppCfg : uses
AppCfg ..> DefaultCfg : uses
DefaultCfg <|-- GameConfig : extends
class AppFrame {
	- AppMenuBar menuBar
	- AppPopupMenu popupMenu
	- SystemActions systemActions
	+ getAppMenuBar() AppMenuBar
	+ getAppPopupMenu() AppPopupMenu
	+ getSystemActions() SystemActions
	+ initSize() void
  + initTitle() void
  + initFrame() void
  + initMacOSMenus() void
  + initIcon() void
  + initMenuBar() void
}
class AppCfg
class DefaultCfg
class GameConfig {
	<<abstract>>
}
class AppMenuBar {
	- AppFrame appFrame
  + JMenu mainMenu;
  + JMenuItem aboutMenuItem;
	+ JMenuItem preferencesMenuItem;
	+ JMenuItem quitMenuItem;
	+ JMenu gameMenu;
	+ JMenuItem pauseResumeMenuItem;
	+ JMenuItem newGameMenuItem;
	+ JMenuItem saveExitMenuItem;
	+ JMenuItem exitMenuItem;
	+ JMenu helpMenu;
	+ JMenuItem helpMenuItem;
	+ JMenu githubMenu;
	+ JMenuItem githubMenuItem;
  - setupMacOS() void
  - initMenus() void
}
class AppPopupMenu {
	- AppFrame appFrame
	+ MenuItem menuAbout
  - initMenuItems() void
}
class IllegalRouteException
class RouterConfigException
class Router {
	- ViewController controller
	- boolean isDefault
	- Class<ViewController> viewType
	- ViewPanel<ViewController> view
	+ isDefault() boolean 
	+ createView() ViewPanel 
	+ setViewType(viewType) void
	+ setControllerType(controllerType) void
	+ createController() ViewController
	+ preloadView() void
	+ getController(Object... args) ViewController 
	+ setRoute(Router router, Object... args) void
	+ update() void
	+ rebuild() void
  + getView() ViewController
}
class SystemActions {
	- AppFrame appFrame
  + openAboutDialog() void
  + quitApp() void
  + openGithubLink() void
  + openPreferencesDialog() void
  + openHelpDialog() void
	+ openNotImplemented() void
}
%%{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 {
		|| Attributes ||
	- config GameConfig 
	- mapState MapState 
	- map GameMap
	- players List<Player> 
	- playerCount int
	- Phase phase
	- currentplayer Player 
	- phaseCounter int
	- turnCounter int
	- roundCounter int
	- draftArmies int
	- currentcard ChanceCard 
	- initialTerrDistrubution ArrayList<TerritoryState>
	- roundCount int
		|| Methods ||
	+ nextPhase() void
	+ getInstance() Game 
	+ getPlayerCount() int
	+ getPhase() Phase
	+ initializePlayers() void
	+ doDraftPhase() void
	+ getDraftArmies() int
	+ setDraftArmies(TerritoryState state) void
	+ createGameMap() void
	+ addPlayer() Player
	+ getPlayers() List<Player> 
	+ getPlayersCount() int
	+ shufflePlayers() void
	+ shareTerritories() void
	+ getInitialArmies() int
	+ attackPhase(TerritoryState startLocation, TerritoryState attackLocation) void
	+ fortifyPhase(TerritoryState stateToSendArmiesFrom, TerritoryState stateToSendArmiesTo, int amount) void
	+ findAndSetConfig() void
}
class Dice {
	- sides int
	+ roll() int
	+ roll(int times) int
}
ChanceCardFactory --> ChanceCard : creates
ArmyCardFactory --> ArmyCard : creates
TerritoryCardFactory --> TerritoryCard : creates

class ArmyLabel {
	- armyCount int
	- color Color
	+ setArmyCount(int armyCount) void
	+ setColor(Color color) void
	+ getArmyCount() int
	- paintComponent(Graphics g) void
}

Army *--> ArmyType
class ArmyType {
    <<enumeration>>
    Infantry
    Cavalry
    Artillery
    Mercenary
}
ArmyCard --|> Card : extends
TerritoryCard --|> Card : extends
ChanceCard --|> Card : extends

class Card {
    - CardType type
}
class TerritoryCard {
	- name String
	- owner Player
	- territory TerritoryType
	- continent ContinentType
	- cardType CardType
	- description String
	- imageUrl String
	- canBeTraded boolean
	- tradeValue int
	+ getName() String
	+ getDescription() String 
	+ canBeTraded() boolean
	+ isOwned() boolean
	+ setOwner(Player owner) void
	+ setOwned(boolean owned) void
	+ getOwner() Player
}
class ArmyCard {
	- type ArmyType
}
class ChanceCard {
	- type Type
	+ Type enum
	+ withEffects	Type[] 
	+ getType() Type
	+ toString() String
	+ hasEffect() boolean
	+ getRandomType() Type
	+ typeToString(Type type) String
	
}
Card *--> CardType
class CardType {
    <<enumeration>>
    Army
    Territory
    Chance
}
ChanceCard *--> ChanceType
class ChanceType {
  + <<enumeration>>
    Revolt
    NuclearStrike
    Sabotage
    DiplomaticImmunity
    Mercenaries
    Revolution
    Draft
    Bombardment
    Reinforcements

	+ withEffects Type[]
	- type Type
	+ toString() String
	+ hasEffect() boolean
	+ getEffect() Type
	+ getRandomType() Type
	+ typeToString(Type type) String
}