@startuml

skinparam classAttributeIconSize 0

package "Moderator Client" {

  class StoryEvent {
    {field} +eventId: int
    {field} +description: String
    {field} +parent: StoryEvent
    {field} +children: StoryEvent[]
    {method} +StoryEvent(parent: StoryEvent, id: int)
    {method} +addChild(): void
  }

  class StoryGraph {
    {field} +id: int
    {field} +character: Character
    {field} +root: StoryEvent
    {field} +currentEvent: StoryEvent
    {method} +StoryGraph(id: int)
    {method} +loadGraphFromFile(): Graph
    {method} +saveGraphToFile(): void
    {method} +getNextPossibleEvent(): StoryEvent[]
    {method} +setCurrentEvent(newCurrentEvent: StoryEvent): void
    {method} +getNextStoryEventById(id: int): StoryEvent
  }

  class Skill {
    {field} +id: int
    {field} +value: int
    {field} +description: String
    {method} + Skill(id: int, val: int, desc: String)
    {method} + setValue(val: int): void
    {method} + getValue(): int
  }

  class Character {
    {field} +sprite: Texture
    {field} +abilities: Skill[]
    {field} +name: String
    {method} +Character()
  }

  class "ModeratorView" as mf {
    {field} +timeoutDuration: int
    {method} +ModeratorView()
    {method} +pausePolling(Boolean): void
    {method} +offlineMode(val: boolean): void
  }

  class "PollEvaluator" as pe {

    {field} possibleDecisions: StoryEvent[]
    {field} timeout: int
    {field} voteCounter: int[]
    {method} +PollEvaluator()
    {method} +checkServerStatus(): void
    {method} +broadcastNextDecision(): void
    {method} +evaluateVotes(): int
    {method} +addVote(): void
  }

  class "ModeratorClientExchange" as mcei <<interface>>{
    {field} +websocket:WebSocket
    {method} +ModeratorClientExchange()
    {method} +getCurrentPollEval(): int
    {method} +makeJSON()
  }
}

package "Server" {

  class "ServerModeratorExchange" as smei <<interface>>{
    {field} +websocket: WebSocket
    {field} +ip: int
    {field} +port: int
    {method} +ServerModeratorExchange(ip: int, port: int)
    {method} +requestCurrentPossibleDecisions(): StoryEvent[]
  }

  class "ServerPlayerAudienceExchange" as spaei <<interface>>{
    {field} +websocket: WebSocket
    {field} +ip: int
    {field} +port: int
    {method} +ServerPlayerAudienceExchange(ip: int, port: int)
    {method} +requestDecision(): int
  }

}


package "PlayerAudience Client"{

  class "PlayerAudienceClientExchange" as pacei <<interface>>{
    {field} +websocket: WebSocket
    {field} +ip: int
    {field} +port: int
    {method} +PlayerAudienceClientExchange(ip: int, port: int)
    {method} +requestCurrentPossibleDecisions(): StoryEvent[]
  }

  class "PlayerAudienceView" as pav {
    {method} +PlayerAudienceView()
  }
}

StoryEvent "n" --* "1" StoryGraph
StoryGraph -- mf
StoryGraph -- Character
Character "1" *-- "n" Skill
mf -- pe
pe -- mcei
smei -- spaei
pacei -up- pav
mcei -- smei
pacei -- spaei
@enduml