summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/RoundControl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/control/RoundControl.java')
-rw-r--r--src/jrummikub/control/RoundControl.java80
1 files changed, 48 insertions, 32 deletions
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java
index 4227741..2bcbc7e 100644
--- a/src/jrummikub/control/RoundControl.java
+++ b/src/jrummikub/control/RoundControl.java
@@ -8,7 +8,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import jrummikub.control.turn.AIControl;
import jrummikub.control.turn.ITurnControl;
import jrummikub.control.turn.TurnControlFactory;
import jrummikub.control.turn.TurnMode;
@@ -16,15 +15,14 @@ import jrummikub.model.IHand;
import jrummikub.model.IPlayer;
import jrummikub.model.IRoundState;
import jrummikub.model.ITable;
+import jrummikub.model.PlayerSettings;
import jrummikub.model.PlayerSettings.Type;
import jrummikub.model.Position;
import jrummikub.model.Score;
import jrummikub.model.Stone;
import jrummikub.model.StoneSet;
import jrummikub.util.Connection;
-import jrummikub.util.Event;
import jrummikub.util.Event1;
-import jrummikub.util.IEvent;
import jrummikub.util.IEvent1;
import jrummikub.util.IListener;
import jrummikub.util.IListener2;
@@ -113,7 +111,7 @@ public class RoundControl {
private ITurnControl turnControl;
protected IRoundState roundState;
private IView view;
- private Event restartRoundEvent = new Event();
+ private Event1<PlayerSettings> restartRoundEvent = new Event1<PlayerSettings>();
private Event1<IRoundState> roundStateUpdateEvent = new Event1<IRoundState>();
private Event1<Score> endOfRoundEvent = new Event1<Score>();
protected List<Connection> connections = new ArrayList<Connection>();
@@ -180,7 +178,6 @@ public class RoundControl {
* Continue a saved round after loading
*/
public void continueRound() {
-
connections.add(view.getStartTurnEvent().add(new IListener() {
@Override
public void handle() {
@@ -222,6 +219,35 @@ public class RoundControl {
roundStateUpdateEvent.emit(state);
}
+ protected BottomPanelType showStartTurnPanel() {
+ boolean isHuman = roundState.getActivePlayer().getPlayerSettings()
+ .getType() == HUMAN;
+ boolean oneHuman = roundState.getGameSettings().oneHuman();
+
+ if (!isHuman) {
+ return null;
+ }
+
+ if (roundState.getLastPlayer() != null) {
+ view.setLastStonePlayerName(roundState.getLastPlayer()
+ .getPlayerSettings().getName());
+ return BottomPanelType.START_LAST_TURN_PANEL;
+ }
+
+ if (roundState.getTurnNumber() < 1
+ && roundState.getGameState().getLastPlayerRedealed() != null) {
+ view.setRedealedPlayerName(roundState.getGameState()
+ .getLastPlayerRedealed().getName());
+ return BottomPanelType.START_REDEAL_TURN_PANEL;
+ }
+
+ if (oneHuman) {
+ return null;
+ }
+
+ return BottomPanelType.START_TURN_PANEL;
+ }
+
/**
* Prepare a player's turn by checking the player types and setting the
* correct turn control
@@ -229,12 +255,7 @@ public class RoundControl {
protected void prepareTurn() {
doPrepareTurn();
- boolean isHuman = roundState.getActivePlayer().getPlayerSettings()
- .getType() == HUMAN;
- boolean oneHuman = roundState.getGameSettings().oneHuman();
- boolean isAI = (turnControl instanceof AIControl);
-
- if (isAI || (isHuman && oneHuman)) {
+ if (showStartTurnPanel() == null) {
startTurn();
}
}
@@ -245,12 +266,9 @@ public class RoundControl {
protected void doPrepareTurn() {
updateSidePanel();
- boolean isHuman = roundState.getActivePlayer().getPlayerSettings()
- .getType() == HUMAN;
- boolean oneHuman = roundState.getGameSettings().oneHuman();
-
- if (isHuman && !oneHuman) {
- view.setBottomPanel(BottomPanelType.START_TURN_PANEL);
+ BottomPanelType startTurnPanel = showStartTurnPanel();
+ if (startTurnPanel != null) {
+ view.setBottomPanel(startTurnPanel);
}
view.getTablePanel().setStoneSets(roundState.getTable().clone());
@@ -259,19 +277,13 @@ public class RoundControl {
view.setCurrentPlayerColor(roundState.getActivePlayer().getPlayerSettings()
.getColor());
view.setCurrentPlayerHasLaidOut(roundState.getActivePlayer().getLaidOut());
-
- turnControl = createTurnControl(roundState.getActivePlayer()
- .getPlayerSettings().getType());
}
/**
* Start a players turn with the correct turn control
*/
protected void startTurn() {
- if (turnControl == null) {
- doPrepareTurn();
- }
-
+ doPrepareTurn();
boolean isHuman = roundState.getActivePlayer().getPlayerSettings()
.getType() == HUMAN;
@@ -294,6 +306,7 @@ public class RoundControl {
view.getPlayerPanel().setEndTurnMode(turnMode);
}
+ turnControl = createTurnControl();
turnControl.setup(
new ITurnControl.TurnInfo(roundState, turnMode, mayPause),
roundState.getGameSettings(), view);
@@ -330,7 +343,7 @@ public class RoundControl {
view.getSidePanel().setPlayers(players);
view.getSidePanel().setHeapCapacity(
roundState.getGameSettings().getTotalStones());
- view.getSidePanel().setHeapSize(roundState.getGameHeap().getSize());
+ view.getSidePanel().setHeapSize(roundState.getStoneHeap().getSize());
}
/**
@@ -349,8 +362,9 @@ public class RoundControl {
* of the new turn control
* @return the new turn control
*/
- protected ITurnControl createTurnControl(Type type) {
- return TurnControlFactory.getFactory(type).create();
+ protected ITurnControl createTurnControl() {
+ return TurnControlFactory.getFactory(
+ roundState.getActivePlayer().getPlayerSettings().getType()).create();
}
/**
@@ -361,11 +375,11 @@ public class RoundControl {
for (int i = 0; i < roundState.getPlayerCount(); i++) {
IHand hand = roundState.getNthNextPlayer(i).getHand();
for (int j = 0; j < roundState.getGameSettings().getNumberOfStonesDealt(); j++) {
- hand.drop(roundState.getGameHeap().drawStone(), new Position(0, 0));
+ hand.drop(roundState.getStoneHeap().drawStone(), new Position(0, 0));
}
}
- view.getSidePanel().setHeapSize(roundState.getGameHeap().getSize());
+ view.getSidePanel().setHeapSize(roundState.getStoneHeap().getSize());
}
/**
@@ -429,7 +443,7 @@ public class RoundControl {
}
if (roundState.getLastPlayer() == null) {
- if (roundState.getGameHeap().getSize() == 0) {
+ if (roundState.getStoneHeap().getSize() == 0) {
roundState.setLastPlayer(roundState.getActivePlayer());
roundState.nextPlayer();
roundState.nextTurn();
@@ -547,7 +561,7 @@ public class RoundControl {
*
* @return the event
*/
- public IEvent getRestartRoundEvent() {
+ public IEvent1<PlayerSettings> getRestartRoundEvent() {
return restartRoundEvent;
}
@@ -556,10 +570,12 @@ public class RoundControl {
* to do so
*/
protected void redeal() {
+ view.setBottomPanel(BottomPanelType.NONHUMAN_HAND_PANEL);
+
turnControl = null;
for (Connection c : new ArrayList<Connection>(connections)) {
c.remove();
}
- restartRoundEvent.emit();
+ restartRoundEvent.emit(roundState.getActivePlayer().getPlayerSettings());
}
}