summaryrefslogtreecommitdiffstats
path: root/src/jrummikub
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub')
-rw-r--r--src/jrummikub/control/RoundControl.java63
-rw-r--r--src/jrummikub/control/turn/HumanTurnControl.java2
-rw-r--r--src/jrummikub/view/IStoneCollectionPanel.java2
-rw-r--r--src/jrummikub/view/IView.java16
-rw-r--r--src/jrummikub/view/impl/StartTurnPanel.java33
-rw-r--r--src/jrummikub/view/impl/StoneCollectionPanel.java9
-rw-r--r--src/jrummikub/view/impl/TablePanel.java2
-rw-r--r--src/jrummikub/view/impl/View.java79
8 files changed, 162 insertions, 44 deletions
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java
index 3c50819..f060420 100644
--- a/src/jrummikub/control/RoundControl.java
+++ b/src/jrummikub/control/RoundControl.java
@@ -3,6 +3,7 @@ package jrummikub.control;
import static jrummikub.model.PlayerSettings.Type.*;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -42,6 +43,8 @@ public class RoundControl {
private List<Connection> connections = new ArrayList<Connection>();
private ITurnControl turnControl;
private boolean roundFinished;
+ private boolean lastTurnNotEnoughPoints;
+ private boolean lastTurnMeldError;
/**
* Create a new RoundControl using the given gameState and view
@@ -84,6 +87,13 @@ public class RoundControl {
}
}));
+ connections.add(view.getAcknowledgeInvalidEvent().add(new IListener() {
+ @Override
+ public void handle() {
+ nextPlayer();
+ }
+ }));
+
prepareTurn();
}
@@ -139,6 +149,7 @@ public class RoundControl {
TurnMode turnMode = TurnMode.NORMAL_TURN;
if (roundState.getTurnNumber() < 1) {
+ view.setStoneCollectionHidden(true);
turnMode = TurnMode.INSPECT_ONLY;
if (clonedHand.getIdenticalStoneCount() >= 3) {
turnMode = TurnMode.MAY_REDEAL;
@@ -199,10 +210,39 @@ public class RoundControl {
private void endOfTurn() {
turnControl = null;
roundState.getActivePlayer().setHand(clonedHand);
+ boolean goToNextPlayer = true;
+ lastTurnNotEnoughPoints = false;
+ lastTurnMeldError = false;
if (roundState.getTurnNumber() >= 1) {
- checkTurn();
- }
+ goToNextPlayer = checkTurn();
+ }
+ if (goToNextPlayer) {
+ nextPlayer();
+ } else {
+ view.setBottomPanel(BottomPanelType.INVALID_TURN_PANEL);
+ if (lastTurnNotEnoughPoints) {
+ view.setInitialMeldError(roundState.getGameSettings()
+ .getInitialMeldThreshold());
+ } else if (lastTurnMeldError) {
+ view.setInitialMeldFirstError();
+ } else {
+ List<Stone> markedStones = new ArrayList<Stone>();
+ for (Pair<StoneSet, Position> set : clonedTable) {
+ if (!set.getFirst().isValid(roundState.getGameSettings())) {
+ for (Stone stone : set.getFirst()) {
+ markedStones.add(stone);
+ }
+ }
+ }
+ view.setStoneCollectionHidden(true);
+ view.setSelectedStones(markedStones);
+ }
+ }
+ }
+ private void nextPlayer() {
+ view.setSelectedStones(Collections.<Stone> emptyList());
+ view.setStoneCollectionHidden(false);
if (roundState.getLastPlayer() == null) {
if (roundState.getGameHeap().getSize() == 0) {
roundState.setLastPlayer(roundState.getNthNextPlayer(0));
@@ -225,21 +265,23 @@ public class RoundControl {
}
}
- private void checkTurn() {
+ private boolean checkTurn() {
if (!clonedTable.isValid()) {
rejectMove();
- return;
+ return false;
}
if (!roundState.getActivePlayer().getLaidOut()) {
// Player touched forbidden stones
if (!tableSetDifference(clonedTable, roundState.getTable())
.isEmpty()) {
rejectMove();
- return;
+ lastTurnMeldError = true;
+ return false;
}
if (!laidOutValidPoints()) {
rejectMove();
- return;
+ lastTurnNotEnoughPoints = true;
+ return false;
}
}
Set<Stone> tableDiff = tableDifference(roundState.getTable(),
@@ -256,6 +298,7 @@ public class RoundControl {
endOfRound();
}
}
+ return true;
}
private void rejectMove() {
@@ -358,8 +401,8 @@ public class RoundControl {
.getGameSettings());
}
- bestScore = updateBestScore(bestScore, -stonePoints, playerHand
- .getSize());
+ bestScore = updateBestScore(bestScore, -stonePoints,
+ playerHand.getSize());
points.add(-stonePoints);
pointSum += stonePoints;
@@ -381,8 +424,8 @@ public class RoundControl {
private static Pair<Integer, Integer> updateBestScore(
Pair<Integer, Integer> bestScore, int stonePoints, int size) {
if (bestScore.getFirst() == stonePoints) {
- return new Pair<Integer, Integer>(stonePoints, Math.min(bestScore
- .getSecond(), size));
+ return new Pair<Integer, Integer>(stonePoints, Math.min(
+ bestScore.getSecond(), size));
} else if (bestScore.getFirst() < stonePoints) {
return new Pair<Integer, Integer>(stonePoints, size);
}
diff --git a/src/jrummikub/control/turn/HumanTurnControl.java b/src/jrummikub/control/turn/HumanTurnControl.java
index 2ab7b21..447c44d 100644
--- a/src/jrummikub/control/turn/HumanTurnControl.java
+++ b/src/jrummikub/control/turn/HumanTurnControl.java
@@ -441,12 +441,12 @@ public class HumanTurnControl extends AbstractTurnControl {
private void endOfTurn(boolean redeal) {
cleanUp();
+ view.setSelectedStones(new ArrayList<Stone>());
if (redeal) {
redealEvent.emit();
} else {
endOfTurnEvent.emit();
}
- view.setSelectedStones(new ArrayList<Stone>());
}
static private int compareJokers(Stone s1, Stone s2) {
diff --git a/src/jrummikub/view/IStoneCollectionPanel.java b/src/jrummikub/view/IStoneCollectionPanel.java
index 5fa234c..fa3ff73 100644
--- a/src/jrummikub/view/IStoneCollectionPanel.java
+++ b/src/jrummikub/view/IStoneCollectionPanel.java
@@ -4,4 +4,6 @@ package jrummikub.view;
* The view of the collection that shows the stones a player has selected
*/
public interface IStoneCollectionPanel extends IStonePanel {
+
+ void setHidden(boolean enable);
}
diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java
index 33f6284..61925fe 100644
--- a/src/jrummikub/view/IView.java
+++ b/src/jrummikub/view/IView.java
@@ -69,6 +69,14 @@ public interface IView {
public IEvent getStartTurnEvent();
/**
+ * The start turn event is emitted when the player knows what invalid stones
+ * he played
+ *
+ * @return the event
+ */
+ IEvent getAcknowledgeInvalidEvent();
+
+ /**
* The quit event is emitted when the player wants to quit the game
*
* @return the event
@@ -237,6 +245,8 @@ public interface IView {
/** */
START_TURN_PANEL,
/** */
+ INVALID_TURN_PANEL,
+ /** */
HUMAN_HAND_PANEL,
/** */
COMPUTER_HAND_PANEL,
@@ -244,4 +254,10 @@ public interface IView {
WIN_PANEL
}
+ void setInitialMeldError(int points);
+
+ void setStoneCollectionHidden(boolean enable);
+
+ void setInitialMeldFirstError();
+
}
diff --git a/src/jrummikub/view/impl/StartTurnPanel.java b/src/jrummikub/view/impl/StartTurnPanel.java
index 6d6e1b5..9418a3b 100644
--- a/src/jrummikub/view/impl/StartTurnPanel.java
+++ b/src/jrummikub/view/impl/StartTurnPanel.java
@@ -13,6 +13,7 @@ import javax.swing.border.EmptyBorder;
import jrummikub.util.Event;
import jrummikub.util.IEvent;
+import jrummikub.view.IView.BottomPanelType;
/**
* A panel that is displayed before a player's turn
@@ -29,6 +30,9 @@ class StartTurnPanel extends JPanel {
private JButton startTurnButton;
private Event startTurnEvent = new Event();
+ private Event acknowledgeInvalidEvent = new Event();
+
+ private Event buttonEvent = startTurnEvent;
/**
* Creates a new StartTurnPanel
@@ -50,7 +54,7 @@ class StartTurnPanel extends JPanel {
startTurnButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
- startTurnEvent.emit();
+ buttonEvent.emit();
}
});
add(startTurnButton);
@@ -66,10 +70,22 @@ class StartTurnPanel extends JPanel {
void setCurrentPlayerName(String playerName) {
startTurnLabel.setText(playerName + " ist jetzt an der Reihe.");
}
+
+ void setInitialMeldError(int points) {
+ startTurnLabel.setText("Es wurden weniger als " + points + " Punkte ausgelegt.");
+ }
+
+ void setInitialMeldFirstError() {
+ startTurnLabel.setText("Vor dem Rauskommen darf nicht angelegt werden.");
+ }
IEvent getStartTurnEvent() {
return startTurnEvent;
}
+
+ IEvent getAcknowledgeInvalidEvent() {
+ return acknowledgeInvalidEvent;
+ }
private void rescale() {
Insets insets = getInsets();
@@ -93,4 +109,19 @@ class StartTurnPanel extends JPanel {
buttonWidth, buttonHeight);
startTurnButton.setFont(startTurnButton.getFont().deriveFont(fontSize));
}
+
+ public void setType(BottomPanelType type) {
+ switch (type) {
+ case START_TURN_PANEL:
+ startTurnButton.setText("Zug beginnen");
+ buttonEvent = startTurnEvent;
+ break;
+ case INVALID_TURN_PANEL:
+ startTurnLabel.setText("Es liegen ung\u00FCltige Serien auf dem Tisch.");
+ startTurnButton.setText("N\u00E4chster Spieler");
+ buttonEvent = acknowledgeInvalidEvent;
+ break;
+ }
+
+ }
}
diff --git a/src/jrummikub/view/impl/StoneCollectionPanel.java b/src/jrummikub/view/impl/StoneCollectionPanel.java
index c742522..5b08f51 100644
--- a/src/jrummikub/view/impl/StoneCollectionPanel.java
+++ b/src/jrummikub/view/impl/StoneCollectionPanel.java
@@ -37,7 +37,7 @@ class StoneCollectionPanel extends AbstractStonePanel implements
private Event1<Point> otherClickEvent = new Event1<Point>();
- private boolean pauseMode = false;
+ private boolean hidden = false;
/**
* Creates a new StoneCollection instance
@@ -123,7 +123,7 @@ class StoneCollectionPanel extends AbstractStonePanel implements
}
}
- if (pauseMode) {
+ if (hidden) {
return;
}
@@ -155,8 +155,9 @@ class StoneCollectionPanel extends AbstractStonePanel implements
}
}
- void enablePauseMode(boolean enable) {
- pauseMode = enable;
+ @Override
+ public void setHidden(boolean enable) {
+ hidden = enable;
repaint();
}
}
diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java
index a06eae7..1e8a2b6 100644
--- a/src/jrummikub/view/impl/TablePanel.java
+++ b/src/jrummikub/view/impl/TablePanel.java
@@ -381,7 +381,7 @@ class TablePanel extends AbstractStonePanel implements ITablePanel {
}
void enablePauseMode(boolean enable) {
- stoneCollection.enablePauseMode(enable);
+ stoneCollection.setHidden(enable);
pauseMode = enable;
setScale();
diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java
index c18d3b3..83ca40b 100644
--- a/src/jrummikub/view/impl/View.java
+++ b/src/jrummikub/view/impl/View.java
@@ -154,7 +154,8 @@ public class View extends JFrame implements IView {
showSettingsPanel(false);
showLoginPanel(false);
showGameListPanel(false);
- getHandPanel().setStones(Collections.<Pair<Stone, Position>> emptyList());
+ getHandPanel().setStones(
+ Collections.<Pair<Stone, Position>> emptyList());
getTablePanel().setStoneSets(
Collections.<Pair<StoneSet, Position>> emptyList());
setSelectedStones(Collections.<Stone> emptyList());
@@ -305,8 +306,8 @@ public class View extends JFrame implements IView {
mainLayer.add(table);
playerPanel = new PlayerPanel();
- playerPanel.setBorder(new MatteBorder(PLAYER_PANEL_BORDER_WIDTH, 0, 0, 0,
- Color.BLACK));
+ playerPanel.setBorder(new MatteBorder(PLAYER_PANEL_BORDER_WIDTH, 0, 0,
+ 0, Color.BLACK));
mainLayer.add(playerPanel);
startTurnPanel = new StartTurnPanel();
@@ -397,6 +398,16 @@ public class View extends JFrame implements IView {
startTurnPanel.setCurrentPlayerName(playerName);
pausePanel.setCurrentPlayerName(playerName);
}
+
+ @Override
+ public void setInitialMeldError(int points) {
+ startTurnPanel.setInitialMeldError(points);
+ }
+
+ @Override
+ public void setInitialMeldFirstError() {
+ startTurnPanel.setInitialMeldFirstError();
+ }
@Override
public void setCurrentPlayerColor(Color color) {
@@ -414,6 +425,11 @@ public class View extends JFrame implements IView {
}
@Override
+ public IEvent getAcknowledgeInvalidEvent() {
+ return startTurnPanel.getAcknowledgeInvalidEvent();
+ }
+
+ @Override
public IEvent getNewRoundEvent() {
return winPanel.getNewRoundEvent();
}
@@ -430,24 +446,24 @@ public class View extends JFrame implements IView {
@SuppressWarnings("unchecked")
private List<Pair<Stone, Position>> createDecorationStones() {
- Pair<Stone, Position> stoneJ = new Pair<Stone, Position>(new Stone(-'J',
- StoneColor.BLACK), new Position(2.5f, 0));
- Pair<Stone, Position> stoneR = new Pair<Stone, Position>(new Stone(-'R',
- StoneColor.ORANGE), new Position(3.5f, 0));
- Pair<Stone, Position> stoneu1 = new Pair<Stone, Position>(new Stone(-'u',
- StoneColor.BLUE), new Position(4.5f, 0));
- Pair<Stone, Position> stonem1 = new Pair<Stone, Position>(new Stone(-'m',
- StoneColor.RED), new Position(5.5f, 0));
- Pair<Stone, Position> stonem2 = new Pair<Stone, Position>(new Stone(-'m',
- StoneColor.GREEN), new Position(6.5f, 0));
- Pair<Stone, Position> stonei = new Pair<Stone, Position>(new Stone(-'i',
- StoneColor.VIOLET), new Position(7.5f, 0));
- Pair<Stone, Position> stonek = new Pair<Stone, Position>(new Stone(-'k',
- StoneColor.AQUA), new Position(8.5f, 0));
- Pair<Stone, Position> stoneu2 = new Pair<Stone, Position>(new Stone(-'u',
- StoneColor.GRAY), new Position(9.5f, 0));
- Pair<Stone, Position> stoneb = new Pair<Stone, Position>(new Stone(-'b',
- StoneColor.BLACK), new Position(10.5f, 0));
+ Pair<Stone, Position> stoneJ = new Pair<Stone, Position>(new Stone(
+ -'J', StoneColor.BLACK), new Position(2.5f, 0));
+ Pair<Stone, Position> stoneR = new Pair<Stone, Position>(new Stone(
+ -'R', StoneColor.ORANGE), new Position(3.5f, 0));
+ Pair<Stone, Position> stoneu1 = new Pair<Stone, Position>(new Stone(
+ -'u', StoneColor.BLUE), new Position(4.5f, 0));
+ Pair<Stone, Position> stonem1 = new Pair<Stone, Position>(new Stone(
+ -'m', StoneColor.RED), new Position(5.5f, 0));
+ Pair<Stone, Position> stonem2 = new Pair<Stone, Position>(new Stone(
+ -'m', StoneColor.GREEN), new Position(6.5f, 0));
+ Pair<Stone, Position> stonei = new Pair<Stone, Position>(new Stone(
+ -'i', StoneColor.VIOLET), new Position(7.5f, 0));
+ Pair<Stone, Position> stonek = new Pair<Stone, Position>(new Stone(
+ -'k', StoneColor.AQUA), new Position(8.5f, 0));
+ Pair<Stone, Position> stoneu2 = new Pair<Stone, Position>(new Stone(
+ -'u', StoneColor.GRAY), new Position(9.5f, 0));
+ Pair<Stone, Position> stoneb = new Pair<Stone, Position>(new Stone(
+ -'b', StoneColor.BLACK), new Position(10.5f, 0));
Pair<Stone, Position> stone1 = new Pair<Stone, Position>(new Stone(
StoneColor.RED), new Position(2, 1));
@@ -462,9 +478,9 @@ public class View extends JFrame implements IView {
Pair<Stone, Position> stone6 = new Pair<Stone, Position>(new Stone(
StoneColor.BLACK), new Position(11, 1));
- return Arrays
- .asList(stoneJ, stoneR, stoneu1, stonem1, stonem2, stonei, stonek,
- stoneu2, stoneb, stone1, stone2, stone3, stone4, stone5, stone6);
+ return Arrays.asList(stoneJ, stoneR, stoneu1, stonem1, stonem2, stonei,
+ stonek, stoneu2, stoneb, stone1, stone2, stone3, stone4,
+ stone5, stone6);
}
@Override
@@ -475,17 +491,26 @@ public class View extends JFrame implements IView {
}
private void doSetBottomPanel(BottomPanelType type) {
- startTurnPanel.setVisible(type == BottomPanelType.START_TURN_PANEL);
+ boolean showStartTurnPanel = type == BottomPanelType.START_TURN_PANEL
+ || type == BottomPanelType.INVALID_TURN_PANEL;
+ startTurnPanel.setVisible(showStartTurnPanel);
+ startTurnPanel.setType(type);
winPanel.setVisible(type == BottomPanelType.WIN_PANEL);
- playerPanel.setVisible(type != BottomPanelType.START_TURN_PANEL
+ playerPanel.setVisible((!showStartTurnPanel)
&& type != BottomPanelType.WIN_PANEL && type != null);
if (type == BottomPanelType.START_GAME_PANEL) {
- table.setStoneSets(Collections.<Pair<StoneSet, Position>> emptyList());
+ table.setStoneSets(Collections
+ .<Pair<StoneSet, Position>> emptyList());
playerPanel.getHandPanel().setStones(createDecorationStones());
}
playerPanel.showButtons(type != BottomPanelType.START_GAME_PANEL);
playerPanel.enableButtons(type != BottomPanelType.COMPUTER_HAND_PANEL);
}
+
+ @Override
+ public void setStoneCollectionHidden(boolean enable) {
+ table.getStoneCollectionPanel().setHidden(enable);
+ }
}