@startuml img/sequence_complete.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant playerPanel as "playerPanel\n: PlayerPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant roundControl as "roundControl\n: RoundControl"
participant ITurnControlFactory
participant humanTurnControlFactory as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl as "turnControl\n: HumanTurnControl"
participant humanTurnControlFactory2 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl2 as "turnControl\n: HumanTurnControl"
participant humanTurnControlFactory3 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl3 as "turnControl\n: HumanTurnControl"
participant humanTurnControlFactory4 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl4 as "turnControl\n: HumanTurnControl"
participant roundState as "roundState\n: RoundState"
participant table as "table\n: Table"
participant clonedTable as "clonedTable\n: Table"
participant clonedTable2 as "clonedTable2\n: Table"
participant clonedTable3 as "clonedTable3\n: Table"
participant clonedTable4 as "clonedTable4\n: Table"
participant playerA as "playerA\n: Player"
participant playerASettings as "playerASettings\n: PlayerSettings"
participant playerAHand as "playerAHand\n: Hand"
participant playerB as "playerB\n: Player"
participant playerBSettings as "playerBSettings\n: PlayerSettings"
participant playerBHand as "playerBHand\n: Hand"
participant gameHeap as "gameHeap\n: StoneHeap"

== Initialize player B's turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerB
deactivate roundState

roundControl -> playerB : getPlayerSettings() : PlayerSettings
activate playerB
roundControl <<-- playerB : playerBSettings
deactivate playerB

roundControl -> playerBSettings : getTurnControlType() : ITurnControlFactory.Type
activate playerBSettings
roundControl <<-- playerBSettings : HUMAN
deactivate playerBSettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory : <<create>>
activate humanTurnControlFactory
humanTurnControlFactory -->> ITurnControlFactory
deactivate humanTurnControlFactory

ITurnControlFactory -->> roundControl : humanTurnControlFactory : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory : create() : ITurnControl
activate humanTurnControlFactory
create turnControl
humanTurnControlFactory -> turnControl : <<create>>
activate turnControl
turnControl -->> humanTurnControlFactory
deactivate turnControl

humanTurnControlFactory -->> roundControl : turnControl
deactivate humanTurnControlFactory

' roundControl -> table : clone()
' activate table
' create clonedTable
' table -> clonedTable : <<create>>
' activate clonedTable
' table <<-- clonedTable
' deactivate clonedTable
' roundControl <<-- table : clonedTable
' deactivate table

roundControl -> turnControl : setup(player, clonedTable, view, false, false) : void
activate turnControl
turnControl -->> roundControl
deactivate turnControl

roundControl -> turnControl : startTurn() : void
activate turnControl

turnControl -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl
deactivate handPanel

turnControl -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl
deactivate view


turnControl -->> roundControl
deactivate turnControl

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

== Player B appends stone to set ==

[-> handPanel
activate handPanel

handPanel -> turnControl : stoneClick(stone1, false) : void
activate turnControl

turnControl -> view : setSelectedStones({stone1}) : void
activate view
turnControl <<- view
deactivate view

handPanel <<-- turnControl
deactivate turnControl

[<<-- handPanel
deactivate handPanel

[-> tablePanel
activate tablePanel

tablePanel -> turnControl : connectorClick(stoneSet1, true) : void
activate turnControl

' TODO self calls?

turnControl -> turnControl : pickUpSelectedStones() : void
activate turnControl

turnControl -> playerBHand : pickUp(stone1) : boolean
activate playerBHand
turnControl <<-- playerBHand : true
deactivate playerBHand

turnControl <<-- turnControl
deactivate turnControl


turnControl -> clonedTable : getPosition(stoneSet1) : Position
activate clonedTable
turnControl <<-- clonedTable : position
deactivate clonedTable

turnControl -> clonedTable : pickUp(stoneSet1) : boolean
activate clonedTable
turnControl <<-- clonedTable : true
deactivate clonedTable

turnControl -> clonedTable : drop(joinedStoneSet, newPosition) : void
activate clonedTable
turnControl <<-- clonedTable
deactivate clonedTable

turnControl -> tablePanel : setStoneSets(clonedTable) : void
activate tablePanel
turnControl <<- tablePanel
deactivate tablePanel

turnControl -> handPanel : setStones(playerBHand) : void
activate handPanel
turnControl <<- handPanel
deactivate handPanel

turnControl -> view : setSelectedStones({}) : void
activate view
turnControl <<- view
deactivate view


tablePanel <<-- turnControl
deactivate turnControl

[<<-- tablePanel
deactivate tablePanel

== End of player B's turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl : endOfTurn() : void
activate turnControl

turnControl -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable : isValid() : boolean
activate clonedTable

roundControl <<-- clonedTable : false
deactivate clonedTable
destroy clonedTable

roundControl -> roundControl : rejectMove() : void
activate roundControl

roundControl -> gameHeap : putBack({stone1}) : void
activate gameHeap

roundControl <<-- gameHeap
deactivate gameHeap

loop 4 times
roundControl -> gameHeap : drawStone() : Stone
activate gameHeap

roundControl <<-- gameHeap : stone
deactivate gameHeap

roundControl -> playerBHand : drop(stone) : void
activate playerBHand

roundControl <<-- playerBHand
deactivate playerBHand

end

' reject move
roundControl <<-- roundControl
deactivate roundControl


' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> roundControl : prepareTurn() : void
activate roundControl


roundControl -> table : clone()
activate table
create clonedTable2
table -> clonedTable2 : <<create>>
activate clonedTable2
table <<-- clonedTable2
deactivate clonedTable2
roundControl <<-- table : clonedTable2
deactivate table

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable2) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel


roundControl <<-- roundControl
deactivate roundControl


turnControl <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl
deactivate turnControl
destroy turnControl

[<<-- playerPanel
deactivate playerPanel

== Initialize player A's turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerA
deactivate roundState

roundControl -> playerA : getPlayerSettings() : PlayerSettings
activate playerA
roundControl <<-- playerA : playerASettings
deactivate playerA

roundControl -> playerASettings : getTurnControlType() : ITurnControlFactory.Type
activate playerASettings
roundControl <<-- playerASettings : HUMAN
deactivate playerASettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory2 : <<create>>
activate humanTurnControlFactory2
humanTurnControlFactory2 -->> ITurnControlFactory
deactivate humanTurnControlFactory2

ITurnControlFactory -->> roundControl : humanTurnControlFactory2 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory2 : create() : ITurnControl
activate humanTurnControlFactory2
create turnControl2
humanTurnControlFactory -> turnControl2 : <<create>>
activate turnControl2
turnControl2 -->> humanTurnControlFactory
deactivate turnControl2

humanTurnControlFactory2 -->> roundControl : turnControl2
deactivate humanTurnControlFactory2

roundControl -> turnControl2 : setup(player, clonedTable2, view, false, false) : void
activate turnControl2
turnControl2 -->> roundControl
deactivate turnControl2

roundControl -> turnControl2 : startTurn() : void
activate turnControl2

turnControl2 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl2
deactivate handPanel

turnControl2 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl2
deactivate view


turnControl2 -->> roundControl
deactivate turnControl2

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view





== End of player A's turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl : endOfTurn() : void
activate turnControl

turnControl -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable2 : isValid() : boolean
activate clonedTable2

roundControl <<-- clonedTable2 : true
deactivate clonedTable2
destroy clonedTable2

roundControl -> roundControl : dealStone() : void
activate roundControl


roundControl -> gameHeap : drawStone() : Stone
activate gameHeap

roundControl <<-- gameHeap : stone
deactivate gameHeap

roundControl -> playerAHand : drop(stone) : void
activate playerAHand

roundControl <<-- playerAHand
deactivate playerAHand


' deal stone
roundControl <<-- roundControl
deactivate roundControl

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> roundControl : prepareTurn() : void
activate roundControl


roundControl -> table : clone()
activate table
create clonedTable3
table -> clonedTable3 : <<create>>
activate clonedTable3
table <<-- clonedTable3
deactivate clonedTable3
roundControl <<-- table : clonedTable3
deactivate table

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable3) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel


roundControl <<-- roundControl
deactivate roundControl


turnControl <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl
deactivate turnControl
destroy turnControl

[<<-- playerPanel
deactivate playerPanel


== Initialize player B's 2nd turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerB
deactivate roundState

roundControl -> playerB : getPlayerSettings() : PlayerSettings
activate playerB
roundControl <<-- playerB : playerBSettings
deactivate playerB

roundControl -> playerBSettings : getTurnControlType() : ITurnControlFactory.Type
activate playerBSettings
roundControl <<-- playerBSettings : HUMAN
deactivate playerBSettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory3
ITurnControlFactory -> humanTurnControlFactory3 : <<create>>
activate humanTurnControlFactory3
humanTurnControlFactory3 -->> ITurnControlFactory
deactivate humanTurnControlFactory3

ITurnControlFactory -->> roundControl : humanTurnControlFactory3 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory3 : create() : ITurnControl
activate humanTurnControlFactory3
create turnControl3
humanTurnControlFactory3 -> turnControl3 : <<create>>
activate turnControl3
turnControl3 -->> humanTurnControlFactory3
deactivate turnControl3

humanTurnControlFactory3 -->> roundControl : turnControl3
deactivate humanTurnControlFactory3

roundControl -> turnControl3 : setup(player, clonedTable3, view, false, false) : void
activate turnControl3
turnControl3 -->> roundControl
deactivate turnControl3

roundControl -> turnControl3 : startTurn() : void
activate turnControl3

turnControl3 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl3
deactivate handPanel

turnControl3 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl3
deactivate view


turnControl3 -->> roundControl
deactivate turnControl3

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

== Player B's three stone set ==


' first stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone2, false) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' second stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone3, true) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2, stone3}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' third stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone4, true) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2, stone3, stone4}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' put down

[-> tablePanel
activate tablePanel

tablePanel -> turnControl3 : tableClick(newPosition2)
activate turnControl3
'pickups

turnControl3 -> turnControl3 : pickUpSelectedStones() : void
activate turnControl3

turnControl3 -> playerBHand : pickUp(stone2) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand

turnControl3 -> playerBHand : pickUp(stone3) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand

turnControl3 -> playerBHand : pickUp(stone4) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand


turnControl3 <<-- turnControl3
deactivate turnControl3

turnControl3 -> clonedTable3 : drop(stoneSet2, newPosition2) : void
activate clonedTable3
turnControl3 <<-- clonedTable3
deactivate clonedTable3


turnControl3 -> tablePanel : setStoneSets(clonedTable3) : void
activate tablePanel
turnControl3 <<- tablePanel
deactivate tablePanel

turnControl3 -> handPanel : setStones(playerBHand) : void
activate handPanel
turnControl3 <<- handPanel
deactivate handPanel

turnControl3 -> view : setSelectedStones({}) : void
activate view
turnControl3 <<- view
deactivate view

tablePanel <<-- turnControl3
deactivate turnControl3

[<<-- tablePanel
deactivate tablePanel

== Player B ends the 2nd turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl3 : endOfTurn() : void
activate turnControl3

turnControl3 -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable3 : isValid() : boolean
activate clonedTable3

roundControl <<-- clonedTable3 : true
deactivate clonedTable3

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> playerBHand : getSize() : int
activate playerBHand

roundControl <<-- playerBHand : 10
deactivate playerBHand

roundControl -> roundControl : prepareTurn() : void
activate roundControl

roundControl -> clonedTable3 : clone()
activate clonedTable3
create clonedTable4
table -> clonedTable4 : <<create>>
activate clonedTable4
table <<-- clonedTable4
deactivate clonedTable4
roundControl <<-- clonedTable3 : clonedTable4
deactivate clonedTable3

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable4) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel

roundControl <<-- roundControl
deactivate roundControl

turnControl3 <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl3
deactivate turnControl3
destroy turnControl3

[<<-- playerPanel
deactivate playerPanel

== Initialize player A's 2nd turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerA
deactivate roundState

roundControl -> playerA : getPlayerSettings() : PlayerSettings
activate playerA
roundControl <<-- playerA : playerASettings
deactivate playerA

roundControl -> playerASettings : getTurnControlType() : ITurnControlFactory.Type
activate playerASettings
roundControl <<-- playerASettings : HUMAN
deactivate playerASettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory4 : <<create>>
activate humanTurnControlFactory4
humanTurnControlFactory4 -->> ITurnControlFactory
deactivate humanTurnControlFactory4

ITurnControlFactory -->> roundControl : humanTurnControlFactory4 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory4 : create() : ITurnControl
activate humanTurnControlFactory4
create turnControl4
humanTurnControlFactory -> turnControl4 : <<create>>
activate turnControl4
turnControl4 -->> humanTurnControlFactory
deactivate turnControl4

humanTurnControlFactory4 -->> roundControl : turnControl4
deactivate humanTurnControlFactory4

roundControl -> turnControl4 : setup(player, clonedTable4, view, false, false) : void
activate turnControl4
turnControl4 -->> roundControl
deactivate turnControl4

roundControl -> turnControl4 : startTurn() : void
activate turnControl4

turnControl4 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl4
deactivate handPanel

turnControl4 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl4
deactivate view


turnControl4 -->> roundControl
deactivate turnControl4

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

== Player A appends two stones to set ==

[-> handPanel
activate handPanel

handPanel -> turnControl4 : stoneClick(stone5, false) : void
activate turnControl4

turnControl4 -> view : setSelectedStones({stone5}) : void
activate view
turnControl4 <<- view
deactivate view

handPanel <<-- turnControl4
deactivate turnControl4

[<<-- handPanel
deactivate handPanel

[-> handPanel
activate handPanel

handPanel -> turnControl4 : stoneClick(stone6, true) : void
activate turnControl4

turnControl4 -> view : setSelectedStones({stone5, stone6}) : void
activate view
turnControl4 <<- view
deactivate view

handPanel <<-- turnControl4
deactivate turnControl4

[<<-- handPanel
deactivate handPanel


[-> tablePanel
activate tablePanel

tablePanel -> turnControl4 : connectorClick(stoneSet3, true) : void
activate turnControl4

' TODO self calls?

turnControl4 -> turnControl4 : pickUpSelectedStones() : void
activate turnControl4

turnControl4 -> playerAHand : pickUp(stone5) : boolean
activate playerAHand
turnControl4 <<-- playerAHand : true
deactivate playerAHand

turnControl4 -> playerAHand : pickUp(stone6) : boolean
activate playerAHand
turnControl4 <<-- playerAHand : true
deactivate playerAHand


turnControl4 <<-- turnControl4
deactivate turnControl4


turnControl4 -> clonedTable4 : getPosition(stoneSet3) : Position
activate clonedTable4
turnControl4 <<-- clonedTable4 : position2
deactivate clonedTable4

turnControl4 -> clonedTable4 : pickUp(stoneSet3) : boolean
activate clonedTable4
turnControl4 <<-- clonedTable4 : true
deactivate clonedTable4

turnControl4 -> clonedTable4 : drop(joinedStoneSet2, newPosition2) : void
activate clonedTable4
turnControl4 <<-- clonedTable4
deactivate clonedTable4

turnControl4 -> tablePanel : setStoneSets(clonedTable4) : void
activate tablePanel
turnControl4 <<- tablePanel
deactivate tablePanel

turnControl4 -> handPanel : setStones(playerAHand) : void
activate handPanel
turnControl4 <<- handPanel
deactivate handPanel

turnControl4 -> view : setSelectedStones({}) : void
activate view
turnControl4 <<- view
deactivate view


tablePanel <<-- turnControl4
deactivate turnControl4

[<<-- tablePanel
deactivate tablePanel


== Player A ends the 2nd turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl4 : endOfTurn() : void
activate turnControl4

turnControl4 -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable4 : isValid() : boolean
activate clonedTable4

roundControl <<-- clonedTable4 : true
deactivate clonedTable4

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> playerAHand : getSize() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> roundControl : score()
activate roundControl

roundControl -> playerAHand : getSize() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> playerAHand : getStonePoints() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> playerBHand : getSize() : int
activate playerBHand

roundControl <<-- playerBHand : 10
deactivate playerBHand

roundControl -> playerBHand : getStonePoints() : int
activate playerBHand

roundControl <<-- playerBHand : 42
deactivate playerBHand

roundControl <<-- roundControl
deactivate roundControl

[<- roundControl : endOfRoundEvent.emit(score)
[-->> roundControl

turnControl4 <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl4
deactivate turnControl4

[<<-- playerPanel
deactivate playerPanel

@enduml



@startuml img/sequence_01.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant roundControl as "roundControl\n: RoundControl"
participant ITurnControlFactory
participant humanTurnControlFactory as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl as "turnControl\n: HumanTurnControl"
participant roundState as "roundState\n: RoundState"
participant playerB as "playerB\n: Player"
participant playerBSettings as "playerBSettings\n: PlayerSettings"

== Initialize player B's turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerB
deactivate roundState

roundControl -> playerB : getPlayerSettings() : PlayerSettings
activate playerB
roundControl <<-- playerB : playerBSettings
deactivate playerB

roundControl -> playerBSettings : getTurnControlType() : ITurnControlFactory.Type
activate playerBSettings
roundControl <<-- playerBSettings : HUMAN
deactivate playerBSettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory : <<create>>
activate humanTurnControlFactory
humanTurnControlFactory -->> ITurnControlFactory
deactivate humanTurnControlFactory

ITurnControlFactory -->> roundControl : humanTurnControlFactory : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory : create() : ITurnControl
activate humanTurnControlFactory
create turnControl
humanTurnControlFactory -> turnControl : <<create>>
activate turnControl
turnControl -->> humanTurnControlFactory
deactivate turnControl

humanTurnControlFactory -->> roundControl : turnControl
deactivate humanTurnControlFactory

' roundControl -> table : clone()
' activate table
' create clonedTable
' table -> clonedTable : <<create>>
' activate clonedTable
' table <<-- clonedTable
' deactivate clonedTable
' roundControl <<-- table : clonedTable
' deactivate table

roundControl -> turnControl : setup(player, clonedTable, view, false, false) : void
activate turnControl
turnControl -->> roundControl
deactivate turnControl

roundControl -> turnControl : startTurn() : void
activate turnControl

turnControl -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl
deactivate handPanel

turnControl -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl
deactivate view


turnControl -->> roundControl
deactivate turnControl

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

@enduml

@startuml img/sequence_02.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant playerPanel as "playerPanel\n: PlayerPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant turnControl as "turnControl\n: HumanTurnControl"
participant clonedTable as "clonedTable\n: Table"
participant playerBHand as "playerBHand\n: Hand"

== Player B appends stone to set ==

[-> handPanel
activate handPanel

handPanel -> turnControl : stoneClick(stone1, false) : void
activate turnControl

turnControl -> view : setSelectedStones({stone1}) : void
activate view
turnControl <<- view
deactivate view

handPanel <<-- turnControl
deactivate turnControl

[<<-- handPanel
deactivate handPanel

[-> tablePanel
activate tablePanel

tablePanel -> turnControl : connectorClick(stoneSet1, true) : void
activate turnControl

' TODO self calls?

turnControl -> turnControl : pickUpSelectedStones() : void
activate turnControl

turnControl -> playerBHand : pickUp(stone1) : boolean
activate playerBHand
turnControl <<-- playerBHand : true
deactivate playerBHand

turnControl <<-- turnControl
deactivate turnControl


turnControl -> clonedTable : getPosition(stoneSet1) : Position
activate clonedTable
turnControl <<-- clonedTable : position
deactivate clonedTable

turnControl -> clonedTable : pickUp(stoneSet1) : boolean
activate clonedTable
turnControl <<-- clonedTable : true
deactivate clonedTable

turnControl -> clonedTable : drop(joinedStoneSet, newPosition) : void
activate clonedTable
turnControl <<-- clonedTable
deactivate clonedTable

turnControl -> tablePanel : setStoneSets(clonedTable) : void
activate tablePanel
turnControl <<- tablePanel
deactivate tablePanel

turnControl -> handPanel : setStones(playerBHand) : void
activate handPanel
turnControl <<- handPanel
deactivate handPanel

turnControl -> view : setSelectedStones({}) : void
activate view
turnControl <<- view
deactivate view


tablePanel <<-- turnControl
deactivate turnControl

[<<-- tablePanel
deactivate tablePanel

@enduml

@startuml img/sequence_03.png
hide footbox

== End of player B's turn ==

participant view as "view\n: View"
participant playerPanel as "playerPanel\n: PlayerPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant roundControl as "roundControl\n: RoundControl"
participant turnControl as "turnControl\n: HumanTurnControl"
participant table as "table\n: Table"
participant clonedTable as "clonedTable\n: Table"
participant clonedTable2 as "clonedTable2\n: Table"
participant playerBHand as "playerBHand\n: Hand"
participant gameHeap as "gameHeap\n: StoneHeap"

[-> playerPanel
activate playerPanel

playerPanel -> turnControl : endOfTurn() : void
activate turnControl

turnControl -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable : isValid() : boolean
activate clonedTable

roundControl <<-- clonedTable : false
deactivate clonedTable
destroy clonedTable

roundControl -> roundControl : rejectMove() : void
activate roundControl

roundControl -> gameHeap : putBack({stone1}) : void
activate gameHeap

roundControl <<-- gameHeap
deactivate gameHeap

loop 4 times
roundControl -> gameHeap : drawStone() : Stone
activate gameHeap

roundControl <<-- gameHeap : stone
deactivate gameHeap

roundControl -> playerBHand : drop(stone) : void
activate playerBHand

roundControl <<-- playerBHand
deactivate playerBHand

end

' reject move
roundControl <<-- roundControl
deactivate roundControl


' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> roundControl : prepareTurn() : void
activate roundControl


roundControl -> table : clone()
activate table
create clonedTable2
table -> clonedTable2 : <<create>>
activate clonedTable2
table <<-- clonedTable2
deactivate clonedTable2
roundControl <<-- table : clonedTable2
deactivate table

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable2) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel


roundControl <<-- roundControl
deactivate roundControl


turnControl <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl
deactivate turnControl
destroy turnControl

[<<-- playerPanel
deactivate playerPanel


@enduml

@startuml img/sequence_04.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant roundControl as "roundControl\n: RoundControl"
participant ITurnControlFactory
participant humanTurnControlFactory as "humanTurnControlFactory\n: ITurnControlFactory"
participant humanTurnControlFactory2 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl2 as "turnControl\n: HumanTurnControl"
participant roundState as "roundState\n: RoundState"
participant clonedTable2 as "clonedTable2\n: Table"
participant playerA as "playerA\n: Player"
participant playerASettings as "playerASettings\n: PlayerSettings"


== Initialize player A's turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerA
deactivate roundState

roundControl -> playerA : getPlayerSettings() : PlayerSettings
activate playerA
roundControl <<-- playerA : playerASettings
deactivate playerA

roundControl -> playerASettings : getTurnControlType() : ITurnControlFactory.Type
activate playerASettings
roundControl <<-- playerASettings : HUMAN
deactivate playerASettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory2 : <<create>>
activate humanTurnControlFactory2
humanTurnControlFactory2 -->> ITurnControlFactory
deactivate humanTurnControlFactory2

ITurnControlFactory -->> roundControl : humanTurnControlFactory2 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory2 : create() : ITurnControl
activate humanTurnControlFactory2
create turnControl2
humanTurnControlFactory -> turnControl2 : <<create>>
activate turnControl2
turnControl2 -->> humanTurnControlFactory
deactivate turnControl2

humanTurnControlFactory2 -->> roundControl : turnControl2
deactivate humanTurnControlFactory2

roundControl -> turnControl2 : setup(player, clonedTable2, view, false, false) : void
activate turnControl2
turnControl2 -->> roundControl
deactivate turnControl2

roundControl -> turnControl2 : startTurn() : void
activate turnControl2

turnControl2 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl2
deactivate handPanel

turnControl2 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl2
deactivate view


turnControl2 -->> roundControl
deactivate turnControl2

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view


@enduml

@startuml img/sequence_05.png
hide footbox

participant view as "view\n: View"
participant playerPanel as "playerPanel\n: PlayerPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant roundControl as "roundControl\n: RoundControl"
participant turnControl as "turnControl\n: HumanTurnControl"
participant table as "table\n: Table"
participant clonedTable2 as "clonedTable2\n: Table"
participant clonedTable3 as "clonedTable3\n: Table"
participant playerAHand as "playerAHand\n: Hand"
participant gameHeap as "gameHeap\n: StoneHeap"

== End of player A's turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl : endOfTurn() : void
activate turnControl

turnControl -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable2 : isValid() : boolean
activate clonedTable2

roundControl <<-- clonedTable2 : true
deactivate clonedTable2
destroy clonedTable2

roundControl -> roundControl : dealStone() : void
activate roundControl


roundControl -> gameHeap : drawStone() : Stone
activate gameHeap

roundControl <<-- gameHeap : stone
deactivate gameHeap

roundControl -> playerAHand : drop(stone) : void
activate playerAHand

roundControl <<-- playerAHand
deactivate playerAHand


' deal stone
roundControl <<-- roundControl
deactivate roundControl

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> roundControl : prepareTurn() : void
activate roundControl


roundControl -> table : clone()
activate table
create clonedTable3
table -> clonedTable3 : <<create>>
activate clonedTable3
table <<-- clonedTable3
deactivate clonedTable3
roundControl <<-- table : clonedTable3
deactivate table

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable3) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel


roundControl <<-- roundControl
deactivate roundControl


turnControl <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl
deactivate turnControl
destroy turnControl

[<<-- playerPanel
deactivate playerPanel

@enduml

@startuml img/sequence_06.png
hide footbox
participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant roundControl as "roundControl\n: RoundControl"
participant ITurnControlFactory
participant humanTurnControlFactory3 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl3 as "turnControl\n: HumanTurnControl"
participant roundState as "roundState\n: RoundState"
participant clonedTable3 as "clonedTable3\n: Table"
participant playerB as "playerB\n: Player"
participant playerBSettings as "playerBSettings\n: PlayerSettings"


== Initialize player B's 2nd turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerB
deactivate roundState

roundControl -> playerB : getPlayerSettings() : PlayerSettings
activate playerB
roundControl <<-- playerB : playerBSettings
deactivate playerB

roundControl -> playerBSettings : getTurnControlType() : ITurnControlFactory.Type
activate playerBSettings
roundControl <<-- playerBSettings : HUMAN
deactivate playerBSettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory3
ITurnControlFactory -> humanTurnControlFactory3 : <<create>>
activate humanTurnControlFactory3
humanTurnControlFactory3 -->> ITurnControlFactory
deactivate humanTurnControlFactory3

ITurnControlFactory -->> roundControl : humanTurnControlFactory3 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory3 : create() : ITurnControl
activate humanTurnControlFactory3
create turnControl3
humanTurnControlFactory3 -> turnControl3 : <<create>>
activate turnControl3
turnControl3 -->> humanTurnControlFactory3
deactivate turnControl3

humanTurnControlFactory3 -->> roundControl : turnControl3
deactivate humanTurnControlFactory3

roundControl -> turnControl3 : setup(player, clonedTable3, view, false, false) : void
activate turnControl3
turnControl3 -->> roundControl
deactivate turnControl3

roundControl -> turnControl3 : startTurn() : void
activate turnControl3

turnControl3 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl3
deactivate handPanel

turnControl3 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl3
deactivate view


turnControl3 -->> roundControl
deactivate turnControl3

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

@enduml

@startuml img/sequence_07.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant turnControl3 as "turnControl\n: HumanTurnControl"
participant table as "table\n: Table"
participant clonedTable3 as "clonedTable3\n: Table"
participant playerBHand as "playerBHand\n: Hand"

== Player B's three stone set ==


' first stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone2, false) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' second stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone3, true) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2, stone3}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' third stone
[-> handPanel
activate handPanel

handPanel -> turnControl3 : stoneClick(stone4, true) : void
activate turnControl3

turnControl3 -> view : setSelectedStones({stone2, stone3, stone4}) : void
activate view
turnControl3 <<- view
deactivate view

handPanel <<-- turnControl3
deactivate turnControl3

[<<-- handPanel
deactivate handPanel

' put down

[-> tablePanel
activate tablePanel

tablePanel -> turnControl3 : tableClick(newPosition2)
activate turnControl3
'pickups

turnControl3 -> turnControl3 : pickUpSelectedStones() : void
activate turnControl3

turnControl3 -> playerBHand : pickUp(stone2) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand

turnControl3 -> playerBHand : pickUp(stone3) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand

turnControl3 -> playerBHand : pickUp(stone4) : boolean
activate playerBHand
turnControl3 <<-- playerBHand : true
deactivate playerBHand


turnControl3 <<-- turnControl3
deactivate turnControl3

turnControl3 -> clonedTable3 : drop(stoneSet2, newPosition2) : void
activate clonedTable3
turnControl3 <<-- clonedTable3
deactivate clonedTable3


turnControl3 -> tablePanel : setStoneSets(clonedTable3) : void
activate tablePanel
turnControl3 <<- tablePanel
deactivate tablePanel

turnControl3 -> handPanel : setStones(playerBHand) : void
activate handPanel
turnControl3 <<- handPanel
deactivate handPanel

turnControl3 -> view : setSelectedStones({}) : void
activate view
turnControl3 <<- view
deactivate view

tablePanel <<-- turnControl3
deactivate turnControl3

[<<-- tablePanel
deactivate tablePanel

@enduml

@startuml img/sequence_08.png
hide footbox

participant view as "view\n: View"
participant playerPanel as "playerPanel\n: PlayerPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant roundControl as "roundControl\n: RoundControl"
participant turnControl3 as "turnControl\n: HumanTurnControl"
participant table as "table\n: Table"
participant clonedTable3 as "clonedTable3\n: Table"
participant clonedTable4 as "clonedTable4\n: Table"
participant playerBHand as "playerBHand\n: Hand"

== Player B ends the 2nd turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl3 : endOfTurn() : void
activate turnControl3

turnControl3 -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable3 : isValid() : boolean
activate clonedTable3

roundControl <<-- clonedTable3 : true
deactivate clonedTable3

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> playerBHand : getSize() : int
activate playerBHand

roundControl <<-- playerBHand : 10
deactivate playerBHand

roundControl -> roundControl : prepareTurn() : void
activate roundControl

roundControl -> clonedTable3 : clone()
activate clonedTable3
create clonedTable4
table -> clonedTable4 : <<create>>
activate clonedTable4
table <<-- clonedTable4
deactivate clonedTable4
roundControl <<-- clonedTable3 : clonedTable4
deactivate clonedTable3

roundControl -> view : setBottomPanel(START_TURN_PANEL) : void
activate view
roundControl <<-- view
deactivate view

roundControl -> tablePanel : setStoneSets(clonedTable4) : void
activate tablePanel
roundControl <<- tablePanel
deactivate tablePanel

roundControl <<-- roundControl
deactivate roundControl

turnControl3 <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl3
deactivate turnControl3
destroy turnControl3

[<<-- playerPanel
deactivate playerPanel

@enduml

@startuml img/sequence_09.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant roundControl as "roundControl\n: RoundControl"
participant ITurnControlFactory
participant humanTurnControlFactory as "humanTurnControlFactory\n: ITurnControlFactory"
participant humanTurnControlFactory4 as "humanTurnControlFactory\n: ITurnControlFactory"
participant turnControl4 as "turnControl\n: HumanTurnControl"
participant roundState as "roundState\n: RoundState"
participant clonedTable4 as "clonedTable4\n: Table"
participant playerA as "playerA\n: Player"
participant playerASettings as "playerASettings\n: PlayerSettings"


== Initialize player A's 2nd turn ==

[-> view
activate view
view -> roundControl : startTurn() : void
activate roundControl

roundControl -> roundState : getActivePlayer() : Player
activate roundState
roundControl <<-- roundState : playerA
deactivate roundState

roundControl -> playerA : getPlayerSettings() : PlayerSettings
activate playerA
roundControl <<-- playerA : playerASettings
deactivate playerA

roundControl -> playerASettings : getTurnControlType() : ITurnControlFactory.Type
activate playerASettings
roundControl <<-- playerASettings : HUMAN
deactivate playerASettings


roundControl -> ITurnControlFactory : getFactory(HUMAN) : ITurnControlFactory
activate ITurnControlFactory

create humanTurnControlFactory
ITurnControlFactory -> humanTurnControlFactory4 : <<create>>
activate humanTurnControlFactory4
humanTurnControlFactory4 -->> ITurnControlFactory
deactivate humanTurnControlFactory4

ITurnControlFactory -->> roundControl : humanTurnControlFactory4 : ITurnControlFactory
deactivate ITurnControlFactory

roundControl -> humanTurnControlFactory4 : create() : ITurnControl
activate humanTurnControlFactory4
create turnControl4
humanTurnControlFactory -> turnControl4 : <<create>>
activate turnControl4
turnControl4 -->> humanTurnControlFactory
deactivate turnControl4

humanTurnControlFactory4 -->> roundControl : turnControl4
deactivate humanTurnControlFactory4

roundControl -> turnControl4 : setup(player, clonedTable4, view, false, false) : void
activate turnControl4
turnControl4 -->> roundControl
deactivate turnControl4

roundControl -> turnControl4 : startTurn() : void
activate turnControl4

turnControl4 -> handPanel : setStones(hand.clone()) : void
activate handPanel
handPanel -->> turnControl4
deactivate handPanel

turnControl4 -> view : setBottomPanel(HUMAN_HAND_PANEL) : void
activate view
view -->> turnControl4
deactivate view


turnControl4 -->> roundControl
deactivate turnControl4

view <<-- roundControl
deactivate roundControl

[<<-- view
deactivate view

@enduml

@startuml img/sequence_10.png
hide footbox

participant view as "view\n: View"
participant handPanel as "handPanel\n: HandPanel"
participant tablePanel as "tablePanel\n: TablePanel"
participant turnControl4 as "turnControl\n: HumanTurnControl"
participant clonedTable4 as "clonedTable4\n: Table"
participant playerAHand as "playerAHand\n: Hand"

== Player A appends two stones to set ==

[-> handPanel
activate handPanel

handPanel -> turnControl4 : stoneClick(stone5, false) : void
activate turnControl4

turnControl4 -> view : setSelectedStones({stone5}) : void
activate view
turnControl4 <<- view
deactivate view

handPanel <<-- turnControl4
deactivate turnControl4

[<<-- handPanel
deactivate handPanel

[-> handPanel
activate handPanel

handPanel -> turnControl4 : stoneClick(stone6, true) : void
activate turnControl4

turnControl4 -> view : setSelectedStones({stone5, stone6}) : void
activate view
turnControl4 <<- view
deactivate view

handPanel <<-- turnControl4
deactivate turnControl4

[<<-- handPanel
deactivate handPanel


[-> tablePanel
activate tablePanel

tablePanel -> turnControl4 : connectorClick(stoneSet3, true) : void
activate turnControl4

' TODO self calls?

turnControl4 -> turnControl4 : pickUpSelectedStones() : void
activate turnControl4

turnControl4 -> playerAHand : pickUp(stone5) : boolean
activate playerAHand
turnControl4 <<-- playerAHand : true
deactivate playerAHand

turnControl4 -> playerAHand : pickUp(stone6) : boolean
activate playerAHand
turnControl4 <<-- playerAHand : true
deactivate playerAHand


turnControl4 <<-- turnControl4
deactivate turnControl4


turnControl4 -> clonedTable4 : getPosition(stoneSet3) : Position
activate clonedTable4
turnControl4 <<-- clonedTable4 : position2
deactivate clonedTable4

turnControl4 -> clonedTable4 : pickUp(stoneSet3) : boolean
activate clonedTable4
turnControl4 <<-- clonedTable4 : true
deactivate clonedTable4

turnControl4 -> clonedTable4 : drop(joinedStoneSet2, newPosition2) : void
activate clonedTable4
turnControl4 <<-- clonedTable4
deactivate clonedTable4

turnControl4 -> tablePanel : setStoneSets(clonedTable4) : void
activate tablePanel
turnControl4 <<- tablePanel
deactivate tablePanel

turnControl4 -> handPanel : setStones(playerAHand) : void
activate handPanel
turnControl4 <<- handPanel
deactivate handPanel

turnControl4 -> view : setSelectedStones({}) : void
activate view
turnControl4 <<- view
deactivate view


tablePanel <<-- turnControl4
deactivate turnControl4

[<<-- tablePanel
deactivate tablePanel

@enduml

@startuml img/sequence_11.png
hide footbox

participant playerPanel as "playerPanel\n: PlayerPanel"
participant roundControl as "roundControl\n: RoundControl"
participant turnControl4 as "turnControl\n: HumanTurnControl"
participant clonedTable4 as "clonedTable4\n: Table"
participant playerAHand as "playerAHand\n: Hand"
participant playerBHand as "playerBHand\n: Hand"

== Player A ends the 2nd turn ==

[-> playerPanel
activate playerPanel

playerPanel -> turnControl4 : endOfTurn() : void
activate turnControl4

turnControl4 -> roundControl : endOfTurn() : void
activate roundControl

roundControl -> roundControl : checkTurn() : void
activate roundControl

roundControl -> clonedTable4 : isValid() : boolean
activate clonedTable4

roundControl <<-- clonedTable4 : true
deactivate clonedTable4

' check turn
roundControl <<-- roundControl
deactivate roundControl

roundControl -> playerAHand : getSize() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> roundControl : score()
activate roundControl

roundControl -> playerAHand : getSize() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> playerAHand : getStonePoints() : int
activate playerAHand

roundControl <<-- playerAHand : 0
deactivate playerAHand

roundControl -> playerBHand : getSize() : int
activate playerBHand

roundControl <<-- playerBHand : 10
deactivate playerBHand

roundControl -> playerBHand : getStonePoints() : int
activate playerBHand

roundControl <<-- playerBHand : 42
deactivate playerBHand

roundControl <<-- roundControl
deactivate roundControl

[<- roundControl : endOfRoundEvent.emit(score)
[-->> roundControl

turnControl4 <<-- roundControl
deactivate roundControl

playerPanel <<-- turnControl4
deactivate turnControl4

[<<-- playerPanel
deactivate playerPanel

@enduml