blob: 29ec3979c064b7103261f871e76ae4b4eb77c0f3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
package jrummikub.control.network;
import jrummikub.control.RoundControl;
import jrummikub.control.turn.ITurnControl;
import jrummikub.model.IRoundState;
import jrummikub.model.ITable;
import jrummikub.util.IListener;
import jrummikub.util.IListener1;
import jrummikub.view.IView;
/**
* Round control for network games
*/
public class NetworkRoundControl extends RoundControl {
private IConnectionControl connectionControl;
private boolean currentlyActive = false;
private boolean inited = false;
/**
* Creates new network round control
*
* @param roundState
* current round state
* @param view
* the view
* @param connectionControl
* connection control for the current connection
* @param startActive
* true for host
*/
public NetworkRoundControl(IRoundState roundState, IView view,
final IConnectionControl connectionControl, final boolean startActive) {
super(roundState, view, false);
this.connectionControl = connectionControl;
connections.add(connectionControl.getRoundStateUpdateEvent().add(
new IListener1<IRoundState>() {
@Override
public void handle(IRoundState state) {
setRoundState(state);
currentlyActive = startActive;
updateActive();
inited = true;
prepareTurn();
}
}));
connections.add(connectionControl.getTurnStartEvent().add(new IListener() {
@Override
public void handle() {
NetworkRoundControl.super.startTurn();
}
}));
connections.add(connectionControl.getNextPlayerEvent().add(new IListener() {
@Override
public void handle() {
NetworkRoundControl.super.nextPlayer();
}
}));
}
private void updateActive() {
switch (roundState.getActivePlayer().getPlayerSettings().getType()) {
case HUMAN:
currentlyActive = true;
break;
case NETWORK:
currentlyActive = false;
break;
}
}
@Override
protected void addTurnControlListeners(ITurnControl turnControl) {
turnControl.getTableUpdateEvent().add(new IListener1<ITable>() {
@Override
public void handle(ITable table) {
connectionControl.updateTable(table);
}
});
}
@Override
protected ITurnControl createTurnControl() {
if (!currentlyActive) {
return new NetworkTurnControl(connectionControl);
}
return super.createTurnControl();
}
@Override
protected void prepareTurn() {
if (!inited) {
return;
}
updateActive();
super.prepareTurn();
}
@Override
protected void startTurn() {
if (currentlyActive) {
connectionControl.startTurn();
}
}
@Override
protected void deal() {
super.deal();
connectionControl.updateRoundState(roundState);
}
@Override
protected void nextPlayer() {
if (currentlyActive) {
connectionControl.nextPlayer();
}
}
@Override
protected void endOfTurn(InvalidTurnInfo invalidTurnInfo) {
if (currentlyActive) {
connectionControl.endTurn(roundState, invalidTurnInfo);
}
super.endOfTurn(invalidTurnInfo);
}
@Override
protected void redeal() {
if (currentlyActive) {
connectionControl.redeal();
}
super.redeal();
}
}
|