diff --git a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java index 06d0fdf..6d2d854 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java @@ -72,7 +72,7 @@ public class ClientLauncherTUI { private void getInput(Scanner scanner, ClientController controller, String username) { String action = scanner.next(); int pos=-1; - if(!action.equals("8")&&!action.equals("A")&&!action.equals("B")&&!action.equals("C")&&!action.equals("D")) { + if(!action.equals("7")&&!action.equals("8")&&!action.equals("9")&&!action.equals("A")&&!action.equals("B")&&!action.equals("C")) { try { System.out.println("Insert the required position:"); @@ -84,14 +84,16 @@ public class ClientLauncherTUI { } } switch(action) { - case "1" -> controller.slotChoice(username, pos); - case "2" -> controller.drawUpperBuildingCard(username, pos); - case "3" -> controller.drawUpperTribeCard(username, pos); - case "4" -> controller.drawLowerBuildingCard(username, pos); - case "5" -> controller.drawLowerTribeCard(username, pos); - case "6" -> controller.pickOptionalTribeCard(username, pos); - case "7" -> controller.pickOptionalBuildingCard(username, pos); - case "8" -> controller.noOptionalCard(username); + case "0" -> controller.slotChoice(username, pos); + case "1" -> controller.drawUpperBuildingCard(username, pos); + case "2" -> controller.drawUpperTribeCard(username, pos); + case "3" -> controller.drawLowerBuildingCard(username, pos); + case "4" -> controller.drawLowerTribeCard(username, pos); + case "5" -> controller.pickOptionalTribeCard(username, pos); + case "6" -> controller.pickOptionalBuildingCard(username, pos); + case "7" -> controller.noOptionalCard(username); + case "8" -> controller.skipUpper(username); + case "9" -> controller.skipLower(username); case "A" -> view.fullRender(); case "B" -> view.renderBoard(); case "C" -> view.renderPlayer(); diff --git a/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java b/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java index 1b96cd4..c6b64bf 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java @@ -80,6 +80,13 @@ public class ClientController { client.doEvent(new DrawLowerBuildingCard(playerUsername,pos)); } + public void skipUpper(String playerUsername) { + client.doEvent(new SkipUpper(playerUsername)); + } + + public void skipLower(String playerUsername) { client.doEvent(new SkipLower(playerUsername));} + + /** * Attempts to pick an optional tribe card for the specified player from the specified position. * diff --git a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java index dd6b120..556e97f 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/GameController.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Controller; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; import it.polimi.ingsw.gc14.Model.Player; /** @@ -118,6 +119,20 @@ public class GameController { return model.DrawLowerBuildingCardByIndex(model.getPlayerByUsername(playerUsername), pos); } + public boolean SkipUpperDrawing(String playerUsername) { + Player player= model.getPlayerByUsername(playerUsername); + if(player==null) + return false; + return model.SkipUpperDrawing(model.getPlayerByUsername(playerUsername)); + } + + public boolean SkipLowerDrawing(String playerUsername) { + Player player= model.getPlayerByUsername(playerUsername); + if(player==null) + return false; + return model.SkipLowerDrawing(model.getPlayerByUsername(playerUsername)); + } + /** * Attempts to pick an optional tribe card for the specified player from the specified position. * diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index add7416..42b5261 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -318,6 +318,44 @@ public class Game implements Serializable { return true; } + public boolean SkipUpperDrawing(Player player) { + if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) + { + return false; + } + if(!player.equals(currentState.getCurrentPlayer())) + { + return false; + } + if(currentState.getNUpper() <1) + return false; + if(hasDrawableUp()) + return false; + currentState.UpperDrawn(); + if((currentState.getNLower() ==0 ||( !hasDrawableDown() && getLowerListBuilding().isEmpty())) && ((currentState.getNUpper() ==0)||(getUpperListBuilding().isEmpty()))) + nextPlayerSetup(); + return true; + } + + public boolean SkipLowerDrawing(Player player) { + if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) + { + return false; + } + if(!player.equals(currentState.getCurrentPlayer())) + { + return false; + } + if(currentState.getNUpper() <1) + return false; + if(hasDrawableDown()) + return false; + currentState.LowerDrawn(); + if((currentState.getNLower() ==0 ||( getLowerListBuilding().isEmpty())) && ((currentState.getNUpper() ==0)||(!hasDrawableUp()&&getUpperListBuilding().isEmpty()))) + nextPlayerSetup(); + return true; + } + /** * Attempts to draw the lower tribe card at the specified index for the specified player. * The operation succeeds only if the index is valid, the game stage is {@code RESOLVING_ACTIONS}, @@ -569,7 +607,7 @@ public class Game implements Serializable { for (Slot s : slotMap.keySet()) { if (slotMap.get(s) != null) { currentState.PlayerUpdate(slotMap.get(s), s); - if(!((currentState.getNLower() ==0 ||( getLowerListTribeCards().size()==0 && getLowerListBuilding().size()==0)) && ((currentState.getNUpper() ==0)||( getUpperListTribeCards().size()==0 && getUpperListBuilding().size()==0)))) + if(!((currentState.getNLower() ==0 ||(!hasDrawableDown() && getLowerListBuilding().size()==0)) && ((currentState.getNUpper() ==0)||(!hasDrawableUp() && getUpperListBuilding().size()==0)))) break; else { @@ -587,7 +625,7 @@ public class Game implements Serializable { for (Slot s : slotMap.keySet()) { if (slotMap.get(s) != null) { currentState.PlayerUpdate(slotMap.get(s), s); - if((currentState.getNLower() ==0 ||( getLowerListTribeCards().size()==0 && getLowerListBuilding().size()==0)) && ((currentState.getNUpper() ==0)||( getUpperListTribeCards().size()==0 && getUpperListBuilding().size()==0))) { + if((currentState.getNLower() ==0 ||(!hasDrawableDown() && getLowerListBuilding().size()==0)) && ((currentState.getNUpper() ==0)||( !hasDrawableUp() && getUpperListBuilding().size()==0))) { orderLogicCard.push(currentState.getCurrentPlayer()); slotMap.put(currentState.getSlot(), null); @@ -661,7 +699,14 @@ public class Game implements Serializable { } } - + private boolean hasDrawableUp() + { + return getUpperListTribeCards().stream().filter(x-> !x.IsEventCard()).count()==0; + } + private boolean hasDrawableDown() + { + return getLowerListTribeCards().stream().filter(x-> !x.IsEventCard()).count()==0; + } /** * Resolves all pending event cards if the current game stage is {@code RESOLVING_EVENT}. * All pending events are activated on the player list. diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java b/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java index 0f8f03c..33d5efb 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java @@ -9,5 +9,7 @@ public enum EventType { DRAW_LOWER_BUILD, PICK_OPTIONAL_TRIBE, PICK_OPTIONAL_BUILD, + SKIP_UPPER, + SKIP_LOWER, NO_OPTIONAL_CARD } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipLower.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipLower.java new file mode 100644 index 0000000..e962398 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipLower.java @@ -0,0 +1,23 @@ +package it.polimi.ingsw.gc14.Network.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.EventType; +import it.polimi.ingsw.gc14.Network.NetworkEvent; +import it.polimi.ingsw.gc14.View.IView; + +import java.io.Serializable; + +//TODO javadoc +public class SkipLower extends NetworkEvent implements Serializable{ + //TODO javadoc + public SkipLower(String username){ + super(username, EventType.SKIP_LOWER, false); + } + + //TODO javadoc + @Override + public boolean apply(GameController gameController){ + return gameController.SkipLowerDrawing(username); + } + +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipUpper.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipUpper.java new file mode 100644 index 0000000..3faee82 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipUpper.java @@ -0,0 +1,24 @@ +package it.polimi.ingsw.gc14.Network.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.EventType; +import it.polimi.ingsw.gc14.Network.NetworkEvent; +import it.polimi.ingsw.gc14.View.IView; + +import java.io.Serializable; + +//TODO javadoc +public class SkipUpper extends NetworkEvent implements Serializable{ + + //TODO javadoc + public SkipUpper(String username){ + super(username, EventType.SKIP_UPPER, false); + } + + //TODO javadoc + @Override + public boolean apply(GameController gameController){ + return gameController.SkipUpperDrawing(username); + } + +} diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java index 1b0ca3f..e97f1ad 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java @@ -100,14 +100,16 @@ public class TUI implements IView { { var table=new AsciiTable(BorderStyle.ROUNDED,2); table.addHeader( "Menu Options","Render Options"); - table.addRow( List.of("1-SlotChoice(pos)","A-Full Render")); - table.addRow(List.of("2-DrawUpperTribe(pos)","B-Board Render")); - table.addRow(List.of("3-DrawUpperBuilding(pos)","C-Players Render")); - table.addRow(List.of("4-DrawLowerTribe(pos)","")); - table.addRow(List.of("5-DrawLowerBuilding(pos)","")); - table.addRow(List.of("6-PickOptionalTribe(pos)","")); - table.addRow(List.of("7-PickOptionalBuilding(pos)","")); - table.addRow(List.of("8-NoOptional","")); + table.addRow( List.of("0-SlotChoice(pos)","A-Full Render")); + table.addRow(List.of("1-DrawUpperTribe(pos)","B-Board Render")); + table.addRow(List.of("2-DrawUpperBuilding(pos)","C-Players Render")); + table.addRow(List.of("3-DrawLowerTribe(pos)","")); + table.addRow(List.of("4-DrawLowerBuilding(pos)","")); + table.addRow(List.of("5-PickOptionalTribe(pos)","")); + table.addRow(List.of("6-PickOptionalBuilding(pos)","")); + table.addRow(List.of("7-NoOptional","")); + table.addRow(List.of("8-NoUpperCard","")); + table.addRow(List.of("9-NoLowerCard","")); return table.build(); }