diff --git a/minimodel b/minimodel new file mode 100644 index 0000000..e69de29 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 d9717dc..4184710 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java @@ -1,11 +1,14 @@ package it.polimi.ingsw.gc14.Controller; -import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.*; +import it.polimi.ingsw.gc14.Model.GamePackage.Board; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; import it.polimi.ingsw.gc14.Network.IClient; import it.polimi.ingsw.gc14.Network.NetworkEvents.*; import it.polimi.ingsw.gc14.View.IView; import java.rmi.RemoteException; +import java.util.Map; import java.util.Objects; /** @@ -15,7 +18,7 @@ import java.util.Objects; public class ClientController { /** Game Controller of the client */ - public GameController localController; + public MiniModel miniModel; /** View of the client */ public IView view; @@ -31,7 +34,6 @@ public class ClientController { */ public ClientController(IView view) { this.view = view; - this.localController = new GameController(); this.client = null; } @@ -49,9 +51,9 @@ public class ClientController { * Sets the model in the GameController and updates the view. * @param model the model to set */ - public void setModel(Game model) { - localController.setModel(model); - view.setModel(localController.getModel()); + public void setModel(MiniModel model) { + this.miniModel = model; + view.setModel(miniModel); } @@ -72,7 +74,7 @@ public class ClientController { */ public void drawUpperTribeCard(String playerUsername, int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) { view.showError("It's not your turn!"); } @@ -94,7 +96,7 @@ public class ClientController { * @param pos the index of the card to draw */ public void drawLowerTribeCard(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else try { @@ -112,7 +114,7 @@ public class ClientController { * @param pos the index of the card to draw */ public void drawUpperBuildingCard(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -132,7 +134,7 @@ public class ClientController { * @param pos the index of the card to draw */ public void drawLowerBuildingCard(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername,miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -150,7 +152,7 @@ public class ClientController { * @param playerUsername the name of the player performing the action */ public void skipTurn(String playerUsername) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername,miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -171,7 +173,7 @@ public class ClientController { * @param pos the index of the card to draw */ public void pickOptionalTribeCard(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername,miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -190,7 +192,7 @@ public class ClientController { * @param pos the index of the card to draw */ public void pickOptionalBuildingCard(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -208,7 +210,7 @@ public class ClientController { * @param playerUsername the name of the player performing the action */ public void noOptionalCard(String playerUsername) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { @@ -226,7 +228,7 @@ public class ClientController { * @param pos the index of the selected slot */ public void slotChoice(String playerUsername,int pos) { - if(!Objects.equals(playerUsername, localController.getModel().getCurrentState().getCurrentPlayer().getUserName())) + if(!Objects.equals(playerUsername, miniModel.currentState.getCurrentPlayer().getUserName())) view.showError("It's not your turn!"); else { try { 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 2c74d4c..6863c8a 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -41,6 +41,9 @@ public class Game implements Serializable { return playersList; } + //TODO + private Queue totemChoiceQueue = new LinkedList<>(); + //TODO public Map disconnetedPlayers = new HashMap<>(); //TODO @@ -75,6 +78,8 @@ public class Game implements Serializable { return true; } + //Totem + public void ClearDisconnected() { disconnetedPlayers.clear(); @@ -128,6 +133,8 @@ public class Game implements Serializable { * The board associated with this game. */ private Board board; + //TODO + public Board getBoard() {return board;} /** * Returns clones of the upper tribe cards currently available on the board. @@ -919,105 +926,5 @@ public class Game implements Serializable { return true; } - /** - * Prints a string representation of the {@code Game}. Used in the TUI implementation to draw: - *
  • {@link it.polimi.ingsw.gc14.Model.GamePackage.Board Board} - *
  • {@link it.polimi.ingsw.gc14.Model.Player Players} - *
  • {@link #getUpperListTribeCards() Upper TribeCard List}
  • {@link #getUpperListBuilding() Upper Building List} - *
  • {@link #getLowerListTribeCards() Lower TribeCard List}
  • {@link #getLowerListBuilding() Lower Building List} - *
  • {@link it.polimi.ingsw.gc14.Model.OrderLogicCard Offer Track} - * - * @return {@code String} - a string representation of the {@code Game}. - */ - @Override - public String toString() { - return PlayersStamp()+"\n"+BoardStamp()+"\n"; - } - /** - * Returns a string representation of all the players currently in the game, - * arranged side by side in pairs. - * If the number of players is odd, the last player is printed on its own line. - * - * @return {@code String} - a string representation of all the players. - */ - public String PlayersStamp() - { - StringBuilder stringBuilder=new StringBuilder(); - for(int i=0;i stringUpOffer=new ArrayList<>(); - List stringDownOffer=new ArrayList<>(); - - int index=0; - for(Map.Entry entry:slotMap.entrySet()) - { - stringDownOffer.add((index++)+"."+entry.getKey().toStringTUI()); - if(entry.getValue()!=null) - stringUpOffer.add(entry.getValue().getUserName()); - else - stringUpOffer.add(" "); - } - - var TribeTableUpper = new AsciiTable(BorderStyle.UNICODE,1); - var TribeTableLower = new AsciiTable(BorderStyle.UNICODE,1); - - List stringUpperListTribe=new ArrayList<>(); - List stringLowerListTribe=new ArrayList<>(); - stringUpperListTribe.add("Char/Events"); - stringLowerListTribe.add("Char/Events"); - for(int i=0;iTribeTableUpper.addRow(x)); - stringLowerListTribe.forEach(x->TribeTableLower.addRow(x)); - offerTrack.addRow(stringUpOffer); - offerTrack.addRow(stringDownOffer); - return "CURRENT STATE\n"+getCurrentState()+"\n"+orderLogicCard.toString()+"\n"+ AsciiTable.sideBySide(Arrays.stream((TribeTableUpper.build().split("\n"))).toList(), Arrays.stream(BuildTableUpper.build().split("\n")).toList(),2)+"\n"+offerTrack.build()+"\n"+AsciiTable.sideBySide(List.of(TribeTableLower.build().split("\n")), Arrays.stream(BuildTableLower.build().split("\n")).toList(),2); - } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java b/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java new file mode 100644 index 0000000..154f057 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java @@ -0,0 +1,68 @@ +package it.polimi.ingsw.gc14.Model; + +import it.polimi.ingsw.gc14.Model.Cards.BuildingCard; +import it.polimi.ingsw.gc14.Model.Cards.TribeCard; +import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Character; +import it.polimi.ingsw.gc14.Model.GamePackage.Board; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; + +import java.io.Serializable; +import java.rmi.RemoteException; +import java.util.*; +//TODO +public class MiniModel implements Serializable { + public Board board; + public Map slotPlayerMap; + public OrderLogicCard orderLogicCard; + public CurrentState currentState; + public Map players; + public ListavailableTotems; + public MiniModel(Board board) { + this.board = board; + } + public MiniModel(Board board, Map slotPlayerMap, OrderLogicCard orderLogicCard, CurrentState currentState, List players, ListavailableTotems) { + this.board = board; + this.slotPlayerMap = slotPlayerMap; + this.orderLogicCard = orderLogicCard; + this.currentState = currentState; + this.players=new HashMap<>(); + setPlayers(players); + } + public void setBoard(Board board) { + this.board = board; + } + public void setAvailableTotems(ListavailableTotems) { + this.availableTotems = availableTotems; + } + public void setSlotPlayerMap(Map slotPlayerMap) { + this.slotPlayerMap = slotPlayerMap; + } + public void setOrderLogicCard(OrderLogicCard orderLogicCard) { + this.orderLogicCard = orderLogicCard; + } + public void setCurrentState(CurrentState currentState) { + this.currentState = currentState; + } + public void setPlayers(List players) { + for (Player player : players) { + this.players.put(player.getUserName(),player); + } + } + public void setPlayer(Player player) + { + players.put(player.getUserName(),player); + } + public int getPositionByUsername(String username) + { + int i=0; + for (Player player : players.values()) + { + if(player.getUserName().equals(username)) + { + return i; + } + i++; + } + return -1; + } +} 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 8d01f34..2bf097f 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/EventType.java @@ -6,6 +6,7 @@ package it.polimi.ingsw.gc14.Network; */ public enum EventType { ADD_PLAYER, + TOTEM_CHOICE, SLOT_CHOICE, DRAW_UPPER_TRIBE, DRAW_LOWER_TRIBE, @@ -16,5 +17,6 @@ public enum EventType { SKIP_NO_DRAWABLE, DISCONNECTED_PLAYER, RECONNECT_PLAYER, + NEXT_ROUND, NO_OPTIONAL_CARD } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvent.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvent.java index 6d6a159..aeacecd 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvent.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvent.java @@ -1,8 +1,14 @@ package it.polimi.ingsw.gc14.Network; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; +import it.polimi.ingsw.gc14.Model.MiniModel; +import it.polimi.ingsw.gc14.Model.OrderLogicCard; +import it.polimi.ingsw.gc14.Model.Player; +import it.polimi.ingsw.gc14.Model.Slot; import java.io.Serializable; +import java.util.Map; /** * Represents an event sent over the network @@ -21,6 +27,17 @@ public abstract class NetworkEvent implements Serializable { /** EventType of the event */ protected EventType eventType; + protected Map slotPlayerMap; + protected OrderLogicCard orderLogicCard; + protected CurrentState currentState; + protected Player player; + + public void setData(Map slotPlayerMap, OrderLogicCard orderLogicCard, CurrentState currentState,Player player) { + this.slotPlayerMap = slotPlayerMap; + this.orderLogicCard = orderLogicCard; + this.currentState = currentState; + this.player = player; + } /** * @return the type of the event */ @@ -73,4 +90,7 @@ public abstract class NetworkEvent implements Serializable { * @return true if the event could be applied; false otherwise */ public abstract boolean apply(GameController gameController); + + //TODO + public abstract boolean apply(MiniModel model); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java index 607d3e9..9513190 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -41,4 +42,16 @@ public class AddPlayer extends NetworkEvent implements Serializable { { return gameController.addPlayer(username); } + + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java new file mode 100644 index 0000000..fe52676 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java @@ -0,0 +1,50 @@ +package it.polimi.ingsw.gc14.Network.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; +import it.polimi.ingsw.gc14.Model.MiniModel; +import it.polimi.ingsw.gc14.Model.OrderLogicCard; +import it.polimi.ingsw.gc14.Model.Player; +import it.polimi.ingsw.gc14.Model.Slot; +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; +import java.util.List; +import java.util.Map; + +/** + * NetworkEvent to draw a tribe card from the lower card list. + */ +public class ApplyNextRound extends NetworkEvent implements Serializable{ + + List players; + //TODO + public ApplyNextRound(Map slotPlayerMap, OrderLogicCard orderLogicCard, CurrentState currentState, List players){ + super("SERVER",EventType.NEXT_ROUND,false); + this.slotPlayerMap = slotPlayerMap; + this.orderLogicCard = orderLogicCard; + this.currentState = currentState; + this.players = players; + } + + /** + * @param gameController the Game Controller on which to apply the event + * @return true if the player could draw the card, false otherwise + */ + @Override + public boolean apply(GameController gameController){ + return false; + } + public boolean apply(MiniModel miniModel) + { + miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setPlayers(players); + miniModel.board.nextRound(); + return true; + } + +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java index f38151a..06234c7 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; @@ -29,5 +30,17 @@ public class DisconnectedPlayer extends NetworkEvent implements Serializable{ return gameController.DisconnectedPlayer(username); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + } + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java index b2499cf..b5c6ba4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -34,4 +35,20 @@ public class DrawLowerBuildingCard extends NetworkEvent implements Serializable return gameController.drawLowerBuildingCard(username, pos); } + + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + + miniModel.board.removeLowerBuildingCard(miniModel.board.lowerListBuilding.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java index d06c34e..0095579 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -34,5 +35,19 @@ public class DrawLowerTribeCard extends NetworkEvent implements Serializable{ public boolean apply(GameController gameController){ return gameController.drawLowerTribeCard(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + + miniModel.board.removeLowerTribeCard(miniModel.board.lowerListTribe.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java index 1da744e..3ff7415 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -35,4 +36,18 @@ public class DrawUpperBuildingCard extends NetworkEvent implements Serializable return gameController.drawUpperBuildingCard(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + + miniModel.board.removeUpperTribeCard(miniModel.board.upperListTribe.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java index 7794b10..c426172 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -34,6 +35,19 @@ public class DrawUpperTribeCard extends NetworkEvent implements Serializable{ public boolean apply(GameController gameController){ return gameController.drawUpperTribeCard(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.board.removeUpperTribeCard(miniModel.board.upperListTribe.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/NoOptionalCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/NoOptionalCard.java index 6e5e328..985a9e4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/NoOptionalCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/NoOptionalCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -29,4 +30,16 @@ public class NoOptionalCard extends NetworkEvent implements Serializable{ public boolean apply(GameController gameController){ return gameController.noOptionalCard(username); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalBuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalBuildingCard.java index dc3a420..ebe5933 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalBuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalBuildingCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -34,4 +35,18 @@ public class PickOptionalBuildingCard extends NetworkEvent implements Serializa public boolean apply(GameController gameController){ return gameController.pickOptionalBuildingCard(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + + miniModel.board.removeUpperBuildingCard(miniModel.board.upperListBuilding.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalTribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalTribeCard.java index 8da74be..bd4d10f 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalTribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/PickOptionalTribeCard.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -35,4 +36,19 @@ public class PickOptionalTribeCard extends NetworkEvent implements Serializable return gameController.pickOptionalTribeCard(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + + miniModel.board.removeUpperTribeCard(miniModel.board.upperListTribe.get(pos)); + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java index d6f61a9..2289a58 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; @@ -27,4 +28,16 @@ public class ReconnectPlayer extends NetworkEvent implements Serializable{ return gameController.ReconnectPlayer(username); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + } + } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipNoDrawable.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipNoDrawable.java index 249c218..cd13f3b 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipNoDrawable.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipNoDrawable.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; @@ -29,4 +30,17 @@ public class SkipNoDrawable extends NetworkEvent implements Serializable{ return gameController.SkipNoDrawable(username); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java index 6de4ea0..541d5b2 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java @@ -1,6 +1,7 @@ package it.polimi.ingsw.gc14.Network.NetworkEvents; import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.IView; @@ -35,4 +36,17 @@ public class SlotChoice extends NetworkEvent implements Serializable { return gameController.slotChoice(username, pos); } + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + return true; + + } + } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java new file mode 100644 index 0000000..136600d --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java @@ -0,0 +1,57 @@ +package it.polimi.ingsw.gc14.Network.NetworkEvents; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Model.MiniModel; +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; +import java.util.List; + +/** + * NetworkEvent to select a slot where to place the player totem. + */ +public class TotemChoice extends NetworkEvent implements Serializable { + + /** Index of the card to draw */ + private int pos; + private ListavailableTotems; + public void setAvailableTotems(List availableTotems) { + this.availableTotems = availableTotems; + } + /** + * Class constructor. + * Initializes all the attributes. + * @param username the name of the player requesting the event + * @param pos the index of the card to draw + */ + public TotemChoice(String username, int pos) { + super(username, EventType.TOTEM_CHOICE, false); + this.pos = pos; + } + + /** + * @param gameController the Game Controller on which to apply the event + * @return true if the player could draw the card, false otherwise + */ + @Override + public boolean apply(GameController gameController) { + return gameController.slotChoice(username, pos); + } + + //TODO + @Override + public boolean apply(MiniModel miniModel){ + if(isError) + return false; + miniModel.setPlayer(player); + miniModel.setOrderLogicCard(orderLogicCard); + miniModel.setCurrentState(currentState); + miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setAvailableTotems(availableTotems); + return true; + + } + +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java index 817e3d3..c9c3224 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.Network.RMI.Client; import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.RMI.Common.IClientCallback; @@ -37,7 +38,7 @@ public class ClientCallbackImpl extends UnicastRemoteObject implements IClientCa * @throws RemoteException if any RMI error occurs */ @Override - public void onGameInit(Game model) throws RemoteException { + public void onGameInit(MiniModel model) throws RemoteException { clientController.setModel(model); clientController.view.render(); } @@ -55,7 +56,7 @@ public class ClientCallbackImpl extends UnicastRemoteObject implements IClientCa if(event.getIsError()) { clientController.view.showError(event.toString()); } else { - event.apply(clientController.localController); + event.apply(clientController.miniModel); clientController.view.render(); } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IClientCallback.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IClientCallback.java index c44c309..c68c5b9 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IClientCallback.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IClientCallback.java @@ -1,10 +1,13 @@ package it.polimi.ingsw.gc14.Network.RMI.Common; -import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.*; +import it.polimi.ingsw.gc14.Model.GamePackage.Board; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; import it.polimi.ingsw.gc14.Network.NetworkEvent; import java.io.Serializable; import java.rmi.*; +import java.util.Map; /** * Callback interface used by the server to notify an RMI client about @@ -21,7 +24,7 @@ public interface IClientCallback extends Remote, Serializable { * @param model the current game model. * @throws RemoteException if an RMI communication error occurs. */ - void onGameInit(Game model) throws RemoteException; + void onGameInit(MiniModel miniModel) throws RemoteException; /** * Notifies the client about a network action to process. diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java index e9862ad..099d391 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java @@ -3,6 +3,8 @@ package it.polimi.ingsw.gc14.Network.RMI.Server; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.LimitedMap; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.NetworkEvents.*; import it.polimi.ingsw.gc14.Network.RMI.Common.IClientCallback; @@ -25,7 +27,6 @@ import java.rmi.*; public class RMIServer extends UnicastRemoteObject implements IGameServer { private String host; private GameController controller; - private Game model; private Registry registry; private int nPort; @@ -89,7 +90,8 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { clients.put(username, callback); System.out.println("Reconnected player: " + username); startWatchdog(username); - callback.onGameInit(controller.getModel()); + Game game = controller.getModel(); + callback.onGameInit(new MiniModel(game.getBoard(),game.getSlotMap(), game.orderLogicCard,game.getCurrentState(),game.getPlayers())); System.out.println("Model sent: " + username); actionQueue.add(new ReconnectPlayer(username)); return true; @@ -98,8 +100,7 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { else { if (playerList.isEmpty()) { - model = new Game(preferredInt); - controller.setModel(model); + controller.setModel(new Game(preferredInt)); playerList.setLimit(preferredInt); } if (controller.addPlayer(username)) { @@ -115,7 +116,8 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { clients.put(username, callback); System.out.println("Reconnected player: " + username); startWatchdog(username); - callback.onGameInit(controller.getModel()); + Game game = controller.getModel(); + callback.onGameInit(new MiniModel(game.getBoard(),game.getSlotMap(), game.orderLogicCard,game.getCurrentState(),game.getPlayers())); System.out.println("Model sent: " + username); actionQueue.add(new ReconnectPlayer(username)); return true; @@ -165,10 +167,11 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { * Mirrors {@code TCPServer.notifyAll(Game)} + the {@code ClientHandler.notifyModel} * call that stores the model for disconnect-turn checking. */ - public void notifyAll(Game model) throws RemoteException { - this.model = model; + public void notifyAll(MiniModel model) throws RemoteException { // Keep every watchdog's game reference up to date - watchdogs.values().forEach(wd -> wd.setGame(model)); + synchronized (controller){ + watchdogs.values().forEach(wd -> wd.setGame(controller.getModel())); + } for (IClientCallback cb : clients.values()) { cb.onGameInit(model); } @@ -326,7 +329,10 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { private void startWatchdog(String username) { RMIHeartbeat wd = new RMIHeartbeat( username, playerList, clients, actionQueue); - if (model != null) wd.setGame(model); + synchronized (controller) + { + if (controller.getModel() != null) wd.setGame(controller.getModel()); + } watchdogs.put(username, wd); wd.start(); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java index 498ced8..17f922b 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Client; import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.IClient; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.NetworkEvents.*; @@ -165,11 +166,11 @@ public class TCPClient implements IClient { if (event.getIsError()) { controller.view.showError(event.toString()); } else { - event.apply(controller.localController); + event.apply(controller.miniModel); controller.view.render(); } - } else if (read instanceof Game model) { + } else if (read instanceof MiniModel model) { controller.setModel(model); controller.view.render(); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java index d321664..15773f7 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Server; import it.polimi.ingsw.gc14.LimitedMap; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.NetworkEvents.DisconnectedPlayer; @@ -24,7 +25,6 @@ public class ClientHandler implements Runnable { private boolean running ; - private Game game; /** * Returns the username associated with this client. * @@ -108,6 +108,7 @@ public class ClientHandler implements Runnable { */ public synchronized void notifyEvent(NetworkEvent event) { try { + out.reset(); out.writeObject(event); } catch (IOException e) { e.printStackTrace(); @@ -120,9 +121,9 @@ public class ClientHandler implements Runnable { * Sends the current game model to this client. * @param game The current state of the game to send to the client. */ - public synchronized void notifyModel(Game game) { - this.game = game; + public synchronized void notifyMiniModel(MiniModel game) { try { + out.reset(); out.writeObject(game); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java index e2d5215..9de535c 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/TCPServer.java @@ -3,6 +3,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Server; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.LimitedMap; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Model.Player; import it.polimi.ingsw.gc14.Network.ClientPlayer; import it.polimi.ingsw.gc14.Network.EventType; @@ -124,7 +125,8 @@ public class TCPServer { ); clientSocket.getOutputStream().write(1); pendingHeartbeat.put(username, handler); - handler.notifyModel(controller.getModel()); + Game game = controller.getModel(); + handler.notifyMiniModel(new MiniModel(game.getBoard(),game.getSlotMap(), game.orderLogicCard,game.getCurrentState(),game.getPlayers())); Thread thread = new Thread(handler); thread.start(); clientHandlers.add(handler); @@ -172,7 +174,8 @@ public class TCPServer { ); clientSocket.getOutputStream().write(1); pendingHeartbeat.put(username, handler); - handler.notifyModel(controller.getModel()); + Game game = controller.getModel(); + handler.notifyMiniModel(new MiniModel(game.getBoard(),game.getSlotMap(), game.orderLogicCard,game.getCurrentState(),game.getPlayers())); Thread thread = new Thread(handler); thread.start(); clientHandlers.add(handler); @@ -232,7 +235,7 @@ public class TCPServer { }); } - public void notifyAll(Game model) { - clientHandlers.forEach(h -> h.notifyModel(model)); + public void notifyAll(MiniModel model) { + clientHandlers.forEach(h -> h.notifyMiniModel(model)); } } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index 6f30116..7d29e2c 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -4,9 +4,11 @@ package it.polimi.ingsw.gc14; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.Model.Game; import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Model.Player; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; +import it.polimi.ingsw.gc14.Network.NetworkEvents.ApplyNextRound; import it.polimi.ingsw.gc14.Network.NetworkEvents.DisconnectedPlayer; import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer; import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer; @@ -110,10 +112,22 @@ public class ServerLauncher { disconnectionTimer.cancel(false); disconnectionTimer = null; } + int roundPrec=gameController.getModel().getCurrentState().getRound(); synchronized(gameController){ event.setIsError(!event.apply(gameController)); + if(!event.getIsError()) + { + event.setData(gameController.getModel().getSlotMap(),gameController.getModel().orderLogicCard,gameController.getModel().getCurrentState(),gameController.getModel().getPlayerByUsername(event.getUsername())); + } serverRMI.notifyAll(event); serverTCP.notifyAll(event); + if(gameController.getModel().getCurrentState().getRound()!=roundPrec) + { + Game game=gameController.getModel(); + ApplyNextRound nextRound=new ApplyNextRound(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayers()); + serverRMI.notifyAll(nextRound); + serverTCP.notifyAll(nextRound); + } if(!event.getIsError()){ if(this.gameController.getModel().getCurrentState().getGameStage() == GameStages.ENDED){ this.deleteSave(); @@ -196,9 +210,14 @@ public class ServerLauncher { new Thread(()->{ try { System.out.println("\n\nNotifying model"); - serverRMI.notifyAll(gameController.getModel()); - serverTCP.notifyAll(gameController.getModel()); - view = new TUI(gameController.getModel()); + MiniModel miniModel; + synchronized (gameController) { + Game game = gameController.getModel(); + miniModel= new MiniModel(game.getBoard(),game.getSlotMap(), game.orderLogicCard,game.getCurrentState(),game.getPlayers()); + } + serverRMI.notifyAll(miniModel); + serverTCP.notifyAll(miniModel); + view = new TUI(miniModel); view.fullRender(); } catch (RemoteException e) { throw new RuntimeException(e); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 9eaa70e..de4647c 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.View.GUI; import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.View.GUI.MainView; import it.polimi.ingsw.gc14.View.IView; import javafx.application.Platform; @@ -11,7 +12,7 @@ public class GUI implements IView { // stessa interfaccia che implementa TUI private final Stage stage; private final MainView mainView; - private Game model; + private MiniModel model; private ClientController controller; private String username; @@ -21,9 +22,9 @@ public class GUI implements IView { // stessa interfaccia che implementa TUI } @Override - public void setModel(Game model) { + public void setModel(MiniModel model) { this.model = model; - mainView.setModel(model, controller, username); + mainView.setModel(model,controller, username); Platform.runLater(() -> { stage.setScene(mainView.getScene()); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index fc9b1bf..608e885 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -47,12 +47,12 @@ public class MainFXMLController { private Popup popup; private HBox popupCards; - private Game model; + private MiniModel model; private ClientController controller; private String username; private final Map cardCache = new HashMap<>(); - public void setModel(Game model) {this.model = model;} + public void setModel(MiniModel model) {this.model = model;} public void setController(ClientController controller) {this.controller = controller;} public void setUsername(String username) {this.username = username;} @@ -116,9 +116,9 @@ public class MainFXMLController { img.setClip(clip); StackPane wrapper = new StackPane(img); - Player player = model.getSlotMap().get(slot); - if (player != null) { - int index = model.getPlayers().indexOf(player); + Player player = model.slotPlayerMap.get(slot); + if (player != null && model.getPositionByUsername(player.getUserName())!=-1) { + int index = model.getPositionByUsername(player.getUserName()); ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png"))); totem.setFitHeight(70); totem.setPreserveRatio(true); @@ -221,7 +221,7 @@ public class MainFXMLController { upperList.getChildren().clear(); int i = 0; - for (TribeCard card : model.getUpperListTribeCards()) { + for (TribeCard card : model.board.upperListTribe) { final int index = i; StackPane img = createCard(card, true, true); img.setOnMouseClicked(e -> controller.drawUpperTribeCard(username, index)); @@ -229,7 +229,7 @@ public class MainFXMLController { i++; } i = 0; - for (BuildingCard card : model.getUpperListBuilding()) { + for (BuildingCard card : model.board.upperListBuilding) { final int index = i; StackPane img = createCard(card, true, true); img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(username, index)); @@ -238,7 +238,7 @@ public class MainFXMLController { } } private void renderOrder() { - StackPane card = createOrder(Integer.toString(model.getNPlayers()), false, false); + StackPane card = createOrder(Integer.toString(model.players.size()), false, false); VBox overlay = new VBox(-20); overlay.setPickOnBounds(false); @@ -246,13 +246,13 @@ public class MainFXMLController { StackPane.setMargin(overlay, new Insets(9, 0, 0, 57)); int i = 0; - for (Player player : model.getPlayers()) { + for (Player player : model.players.values()) { final int index = i; ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png"))); totem.setFitHeight(70); totem.setPreserveRatio(true); - if (!(model.orderLogicCard.getPosition(player.getUserName()) != -1 && !model.getSlotMap().containsValue(player))) { + if (!(model.orderLogicCard.getPosition(player.getUserName()) != -1 && !model.slotPlayerMap.containsValue(player))) { totem.setOpacity(0.0); } overlay.getChildren().add(totem); @@ -267,7 +267,7 @@ public class MainFXMLController { board.getChildren().clear(); String path = ""; - switch (model.getCurrentState().getEra()) { + switch (model.currentState.getEra()) { case 1 -> path = "/GUIImages/Backs/back-001.png"; case 2 -> path = "/GUIImages/Backs/back-030.png"; case 3 -> path = "/GUIImages/Backs/back-058.png"; @@ -289,7 +289,7 @@ public class MainFXMLController { renderOrder(); int i = 0; - for (Map.Entry entry : model.getSlotMap().entrySet()) { + for (Map.Entry entry : model.slotPlayerMap.entrySet()) { Slot slot = entry.getKey(); final int index = i; StackPane img = createSlot(slot, true, true); @@ -304,7 +304,7 @@ public class MainFXMLController { lowerList.getChildren().clear(); int i = 0; - for (TribeCard card : model.getLowerListTribeCards()) { + for (TribeCard card : model.board.lowerListTribe) { final int index = i; StackPane img = createCard(card, true, true); img.setOnMouseClicked(e -> controller.drawLowerTribeCard(username, index)); @@ -312,7 +312,7 @@ public class MainFXMLController { i++; } i = 0; - for (BuildingCard card : model.getLowerListBuilding()) { + for (BuildingCard card : model.board.lowerListBuilding) { final int index = i; StackPane img = createCard(card, true, true); img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(username, index)); @@ -327,13 +327,13 @@ public class MainFXMLController { myHand.setSpacing(14); myHand.setAlignment(Pos.CENTER); - drawMyHandList(myHand, model.getPlayerByUsername(username).artists); - drawMyHandList(myHand, model.getPlayerByUsername(username).gatherers); - drawMyHandList(myHand, model.getPlayerByUsername(username).inventors); - drawMyHandList(myHand, model.getPlayerByUsername(username).builders); - drawMyHandList(myHand, model.getPlayerByUsername(username).shamans); - drawMyHandList(myHand, model.getPlayerByUsername(username).hunters); - drawMyHandList(myHand, model.getPlayerByUsername(username).buildingCards); + drawMyHandList(myHand, model.players.get(username).artists); + drawMyHandList(myHand, model.players.get(username).gatherers); + drawMyHandList(myHand, model.players.get(username).inventors); + drawMyHandList(myHand, model.players.get(username).builders); + drawMyHandList(myHand, model.players.get(username).shamans); + drawMyHandList(myHand, model.players.get(username).hunters); + drawMyHandList(myHand, model.players.get(username).buildingCards); } private void drawMyHandList(HBox myHand, ArrayList cardList) { if (!cardList.isEmpty()) { @@ -361,16 +361,16 @@ public class MainFXMLController { sidePanel.getChildren().clear(); sidePanel.setSpacing(6); - era.setText(Integer.toString(model.getCurrentState().getEra())); - round.setText(Integer.toString(model.getCurrentState().getRound())); - player.setText(model.getCurrentState().getCurrentPlayer().getUserName()); + era.setText(Integer.toString(model.currentState.getEra())); + round.setText(Integer.toString(model.currentState.getRound())); + player.setText(model.currentState.getCurrentPlayer().getUserName()); VBox.setMargin(info, new Insets(5, 5, 5, 5)); sidePanel.getChildren().add(info); renderPlayers(sidePanel); } private void renderPlayers(VBox playersHand) { - for (Player player : model.getPlayers()) { + for (Player player : model.players.values()) { // Card container VBox card = new VBox(3); VBox.setMargin(card, new Insets(5)); @@ -382,7 +382,7 @@ public class MainFXMLController { // Riga 1: icona totem + nome HBox headerRow = new HBox(8); headerRow.setAlignment(Pos.CENTER); - int index = model.getPlayers().indexOf(player); + int index = new ArrayList<>(model.players.values()).indexOf(player); ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png"))); totem.setFitHeight(20); totem.setPreserveRatio(true); @@ -465,7 +465,7 @@ public class MainFXMLController { } } private ArrayList getPlayerCards(String username, String type) { - Player p = model.getPlayerByUsername(username); + Player p = model.players.get(username); return switch (type) { case "artists" -> new ArrayList<>(p.artists); case "gatherers" -> new ArrayList<>(p.gatherers); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainView.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainView.java index 50f8d08..bc5bb86 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainView.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainView.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.View.GUI; import it.polimi.ingsw.gc14.Controller.ClientController; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -15,7 +16,7 @@ public class MainView { private final Scene scene; private final MainFXMLController fxmlController; - private Game model; + private MiniModel model; private ClientController controller; private String username; @@ -32,7 +33,7 @@ public class MainView { } public Scene getScene() { return scene; } - public void setModel(Game model, ClientController controller, String username) { + public void setModel(MiniModel model, ClientController controller, String username) { this.model = model; fxmlController.setModel(model); this.controller = controller; diff --git a/src/main/java/it/polimi/ingsw/gc14/View/IView.java b/src/main/java/it/polimi/ingsw/gc14/View/IView.java index 5025588..dc0aaa4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/IView.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/IView.java @@ -1,10 +1,11 @@ package it.polimi.ingsw.gc14.View; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.NetworkEvent; public interface IView { - public void setModel(Game game); + public void setModel(MiniModel miniModel); public void render(); public void showMessage(String message); public void showError(String message); 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 20bc0cc..d78577b 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 @@ -1,8 +1,14 @@ package it.polimi.ingsw.gc14.View.TUI; import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Model.MiniModel; +import it.polimi.ingsw.gc14.Model.Player; +import it.polimi.ingsw.gc14.Model.Slot; import it.polimi.ingsw.gc14.View.IView; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; /** * Text-based User Interface (TUI) implementation of {@link IView}. @@ -30,9 +36,9 @@ import java.util.List; public class TUI implements IView { /** - * The {@link Game} model whose state is rendered. + * The {@link MiniModel} model whose state is rendered. */ - private Game model; + private MiniModel model; /** * The username of the local player, used to retrieve and display @@ -50,7 +56,7 @@ public class TUI implements IView { * * @param model the {@link Game} model to display; must not be {@code null} */ - public TUI(Game model) { + public TUI(MiniModel model) { this.model = model; this.username = ""; } @@ -76,7 +82,7 @@ public class TUI implements IView { * @param model the new {@link Game} model; must not be {@code null} */ @Override - public void setModel(Game model) { + public void setModel(MiniModel model) { this.model = model; } @@ -96,9 +102,9 @@ public class TUI implements IView { *

    Layout: *

      *
    • Top — player status table produced by - * {@link Game#PlayersStamp()}.
    • + * {@link #PlayersStamp()}. *
    • Bottom-left — board status produced by - * {@link Game#BoardStamp()}.
    • + * {@link #BoardStamp()}. *
    • Bottom-right — menu options legend and the local * player's hand.
    • *
    @@ -107,10 +113,10 @@ public class TUI implements IView { */ public void fullRender() { clearTerminal(); - List lines = List.of(model.BoardStamp().split("\n")); + List lines = List.of(BoardStamp().split("\n")); List lines2 = List.of((printMenuOptions() + "\n" + - model.getPlayerByUsername(username)).split("\n")); - System.out.println(model.PlayersStamp() + "\n" + + model.players.get(username)).split("\n")); + System.out.println(PlayersStamp() + "\n" + AsciiTable.sideBySide(lines, lines2, 3)); } @@ -120,7 +126,7 @@ public class TUI implements IView { *

    Layout: *

      *
    • Left panel — turn order, upper card row, offer track, - * and lower card row, as produced by {@link Game#BoardStamp()}.
    • + * and lower card row, as produced by {@link #BoardStamp()}. *
    • Right panel — menu options legend followed by the local * player's hand.
    • *
    @@ -129,9 +135,9 @@ public class TUI implements IView { */ public void renderBoard() { clearTerminal(); - List lines = List.of(model.BoardStamp().split("\n")); + List lines = List.of(BoardStamp().split("\n")); List lines2 = List.of((printMenuOptions() + "\nYOUR HAND\n" + - model.getPlayerByUsername(username)).split("\n")); + model.players.get(username)).split("\n")); System.out.println(AsciiTable.sideBySide(lines, lines2, 3)); } @@ -141,7 +147,7 @@ public class TUI implements IView { *

    Layout: *

      *
    • Left panel — prestige, food, character deck, and building - * deck for all players, as produced by {@link Game#PlayersStamp()}.
    • + * deck for all players, as produced by {@link #PlayersStamp()}. *
    • Right panel — menu options legend.
    • *
    * @@ -149,7 +155,7 @@ public class TUI implements IView { */ public void renderPlayer() { clearTerminal(); - List lines = List.of(model.PlayersStamp().split("\n")); + List lines = List.of(PlayersStamp().split("\n")); List lines2 = List.of(printMenuOptions().split("\n")); System.out.println(AsciiTable.sideBySide(lines, lines2, 3)); } @@ -212,4 +218,92 @@ public class TUI implements IView { pb.inheritIO().start().waitFor(); } catch (Exception ignored) {} } + + /** + * Returns a string representation of all the players currently in the game, + * arranged side by side in pairs. + * If the number of players is odd, the last player is printed on its own line. + * + * @return {@code String} - a string representation of all the players. + */ + public String PlayersStamp() + { + StringBuilder stringBuilder=new StringBuilder(); + ArrayList playersList=new ArrayList<>(model.players.values()); + for(int i = 0; i< model.players.size()/2; i++) + { + stringBuilder.append(AsciiTable.sideBySide(List.of(playersList.get((i*2)).toString().split("\n")),List.of(playersList.get((i*2+1)).toString().split("\n")),2)); + } + stringBuilder.append("\n"); + if(playersList.size()%2!=0) + { + stringBuilder.append(playersList.get(playersList.size()-1).toString()); + stringBuilder.append("\n"); + } + return stringBuilder.toString(); + } + + /** + * Returns a string representation of the board, including the current state, + * the offer track with slot assignments, the upper and lower tribe card lists, + * and the upper and lower building card lists. + * + * @return {@code String} - a string representation of the board. + */ + public String BoardStamp() + { + var offerTrack = new AsciiTable(BorderStyle.UNICODE, model.slotPlayerMap.size()); + List stringUpOffer=new ArrayList<>(); + List stringDownOffer=new ArrayList<>(); + + int index=0; + for(Map.Entry entry:model.slotPlayerMap.entrySet()) + { + stringDownOffer.add((index++)+"."+entry.getKey().toStringTUI()); + if(entry.getValue()!=null) + stringUpOffer.add(entry.getValue().getUserName()); + else + stringUpOffer.add(" "); + } + + var TribeTableUpper = new AsciiTable(BorderStyle.UNICODE,1); + var TribeTableLower = new AsciiTable(BorderStyle.UNICODE,1); + + List stringUpperListTribe=new ArrayList<>(); + List stringLowerListTribe=new ArrayList<>(); + stringUpperListTribe.add("Char/Events"); + stringLowerListTribe.add("Char/Events"); + for(int i=0;iTribeTableUpper.addRow(x)); + stringLowerListTribe.forEach(x->TribeTableLower.addRow(x)); + offerTrack.addRow(stringUpOffer); + offerTrack.addRow(stringDownOffer); + return "CURRENT STATE\n"+model.currentState+"\n"+model.orderLogicCard.toString()+"\n"+ AsciiTable.sideBySide(Arrays.stream((TribeTableUpper.build().split("\n"))).toList(), Arrays.stream(BuildTableUpper.build().split("\n")).toList(),2)+"\n"+offerTrack.build()+"\n"+AsciiTable.sideBySide(List.of(TribeTableLower.build().split("\n")), Arrays.stream(BuildTableLower.build().split("\n")).toList(),2); + } } \ No newline at end of file diff --git a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java index ed83c8d..8aaa3a8 100644 --- a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java +++ b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java @@ -1480,35 +1480,7 @@ class GameTest { ); } - @Test - void playersStampShouldReturnPlayersInformation() { - Game game = new Game(3); - addPlayers(game, 3, "stamp_"); - - String result = game.PlayersStamp(); - - assertNotNull(result); - assertFalse(result.isBlank()); - assertTrue(result.contains("stamp_1")); - assertTrue(result.contains("stamp_2")); - assertTrue(result.contains("stamp_3")); - } - - @Test - void boardStampShouldReturnBoardInformation() { - Game game = new Game(3); - - addPlayers(game, 3, "board_stamp_"); - - String result = game.BoardStamp(); - - assertNotNull(result); - assertFalse(result.isBlank()); - assertTrue(result.contains("CURRENT STATE")); - assertTrue(result.contains("Char/Events")); - assertTrue(result.contains("Building")); - } @Test @Timeout(value = 20, unit = TimeUnit.SECONDS)