summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/network/NetworkRoundControl.java
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();
	}
}