@@ -4,16 +4,32 @@ import it.polimi.ingsw.gc14.Network.NetworkEvent;
|
|||||||
import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient;
|
import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient;
|
||||||
import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient;
|
import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient;
|
||||||
import it.polimi.ingsw.gc14.View.TUI.TUI;
|
import it.polimi.ingsw.gc14.View.TUI.TUI;
|
||||||
|
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entry point for the TUI-based game client.
|
||||||
|
* Handles the initial setup by asking the user for a username, the desired number of players,
|
||||||
|
* and the preferred network protocol (RMI or TCP).
|
||||||
|
* Once connected to the server, it continuously reads and dispatches user input to the controller.
|
||||||
|
*/
|
||||||
public class ClientLauncherTUI {
|
public class ClientLauncherTUI {
|
||||||
//TODO Javadoc
|
|
||||||
TUI view;
|
|
||||||
public void main() throws InterruptedException {
|
|
||||||
view=new TUI(null);
|
|
||||||
ClientController controller = new ClientController(view);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The TUI view associated with this client.
|
||||||
|
*/
|
||||||
|
TUI view;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the TUI client.
|
||||||
|
* Prompts the user for a username, the desired number of players, and the network protocol.
|
||||||
|
* Attempts to connect to the server using either RMI or TCP depending on the selection.
|
||||||
|
* If the connection is successful, enters a loop to continuously read and process user input.
|
||||||
|
*
|
||||||
|
* @throws InterruptedException if the thread is interrupted while waiting.
|
||||||
|
*/
|
||||||
|
public void main() throws InterruptedException {
|
||||||
|
view = new TUI(null);
|
||||||
|
ClientController controller = new ClientController(view);
|
||||||
Scanner scanner = new Scanner(System.in);
|
Scanner scanner = new Scanner(System.in);
|
||||||
System.out.println("Selezionare nome utente: ");
|
System.out.println("Selezionare nome utente: ");
|
||||||
String username = scanner.next();
|
String username = scanner.next();
|
||||||
@@ -22,9 +38,6 @@ public class ClientLauncherTUI {
|
|||||||
int proposedNumPlayers = scanner.nextInt();
|
int proposedNumPlayers = scanner.nextInt();
|
||||||
System.out.println("Selezionare RMI[0] o TCP[1]: ");
|
System.out.println("Selezionare RMI[0] o TCP[1]: ");
|
||||||
int networkType = scanner.nextInt();
|
int networkType = scanner.nextInt();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// RMI
|
// RMI
|
||||||
if (networkType == 0) {
|
if (networkType == 0) {
|
||||||
// Connect
|
// Connect
|
||||||
@@ -36,17 +49,10 @@ public class ClientLauncherTUI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
controller.setClient(client);
|
controller.setClient(client);
|
||||||
|
while (true) {
|
||||||
// Play
|
|
||||||
//while(controller.localController.getModel()==null){
|
|
||||||
// scanner.nextInt();
|
|
||||||
//}
|
|
||||||
while(true) {
|
|
||||||
getInput(scanner, controller, username);
|
getInput(scanner, controller, username);
|
||||||
}
|
}
|
||||||
|
// TCP
|
||||||
|
|
||||||
// TCP
|
|
||||||
} else if (networkType == 1) {
|
} else if (networkType == 1) {
|
||||||
// Connect
|
// Connect
|
||||||
TCPClient client = new TCPClient(controller, "localhost", 8080);
|
TCPClient client = new TCPClient(controller, "localhost", 8080);
|
||||||
@@ -57,46 +63,67 @@ public class ClientLauncherTUI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
controller.setClient(client);
|
controller.setClient(client);
|
||||||
|
|
||||||
// Play
|
// Play
|
||||||
while(true) {
|
while (true) {
|
||||||
getInput(scanner, controller, username);
|
getInput(scanner, controller, username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner.close();
|
scanner.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a single action from the user and dispatches it to the controller.
|
||||||
|
* The action is identified by a string code. Most actions also require a position index
|
||||||
|
* (e.g. the index of the card to draw from a list), which is read as a second input.
|
||||||
|
* Actions that do not require a position (7, 8, 9, A, B, C) skip the position prompt.
|
||||||
|
* <p>
|
||||||
|
* Available actions:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@code 0} - Choose a slot by index.</li>
|
||||||
|
* <li>{@code 1} - Draw an upper building card by index.</li>
|
||||||
|
* <li>{@code 2} - Draw an upper tribe card by index.</li>
|
||||||
|
* <li>{@code 3} - Draw a lower building card by index.</li>
|
||||||
|
* <li>{@code 4} - Draw a lower tribe card by index.</li>
|
||||||
|
* <li>{@code 5} - Pick an optional tribe card by index.</li>
|
||||||
|
* <li>{@code 6} - Pick an optional building card by index.</li>
|
||||||
|
* <li>{@code 7} - Skip the optional card choice.</li>
|
||||||
|
* <li>{@code 8} - Skip the upper draw.</li>
|
||||||
|
* <li>{@code 9} - Skip the lower draw.</li>
|
||||||
|
* <li>{@code A} - Render the full game view.</li>
|
||||||
|
* <li>{@code B} - Render the board view.</li>
|
||||||
|
* <li>{@code C} - Render the player view.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param scanner the scanner used to read user input.
|
||||||
|
* @param controller the client controller to which actions are dispatched.
|
||||||
|
* @param username the username of the current player.
|
||||||
|
*/
|
||||||
private void getInput(Scanner scanner, ClientController controller, String username) {
|
private void getInput(Scanner scanner, ClientController controller, String username) {
|
||||||
String action = scanner.next();
|
String action = scanner.next();
|
||||||
int pos=-1;
|
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
|
try {
|
||||||
{
|
|
||||||
System.out.println("Insert the required position:");
|
System.out.println("Insert the required position:");
|
||||||
pos = scanner.nextInt();
|
pos = scanner.nextInt();
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
System.out.println("ERROR: Invalid input(expected number)");
|
System.out.println("ERROR: Invalid input(expected number)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch(action) {
|
switch (action) {
|
||||||
case "1" -> controller.slotChoice(username, pos);
|
case "0" -> controller.slotChoice(username, pos);
|
||||||
case "2" -> controller.drawUpperBuildingCard(username, pos);
|
case "1" -> controller.drawUpperBuildingCard(username, pos);
|
||||||
case "3" -> controller.drawUpperTribeCard(username, pos);
|
case "2" -> controller.drawUpperTribeCard(username, pos);
|
||||||
case "4" -> controller.drawLowerBuildingCard(username, pos);
|
case "3" -> controller.drawLowerBuildingCard(username, pos);
|
||||||
case "5" -> controller.drawLowerTribeCard(username, pos);
|
case "4" -> controller.drawLowerTribeCard(username, pos);
|
||||||
case "6" -> controller.pickOptionalTribeCard(username, pos);
|
case "5" -> controller.pickOptionalTribeCard(username, pos);
|
||||||
case "7" -> controller.pickOptionalBuildingCard(username, pos);
|
case "6" -> controller.pickOptionalBuildingCard(username, pos);
|
||||||
case "8" -> controller.noOptionalCard(username);
|
case "7" -> controller.noOptionalCard(username);
|
||||||
|
case "8" -> controller.skipUpper(username);
|
||||||
|
case "9" -> controller.skipLower(username);
|
||||||
case "A" -> view.fullRender();
|
case "A" -> view.fullRender();
|
||||||
case "B" -> view.renderBoard();
|
case "B" -> view.renderBoard();
|
||||||
case "C" -> view.renderPlayer();
|
case "C" -> view.renderPlayer();
|
||||||
|
default -> {}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,120 +7,160 @@ import it.polimi.ingsw.gc14.Network.NetworkEvents.*;
|
|||||||
import it.polimi.ingsw.gc14.Network.Observer;
|
import it.polimi.ingsw.gc14.Network.Observer;
|
||||||
import it.polimi.ingsw.gc14.View.IView;
|
import it.polimi.ingsw.gc14.View.IView;
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* Controller class that holds all the components of the client, such as view, network client and Game Controller.
|
||||||
|
* It provides methods to set the client components and to execute requested actions.
|
||||||
|
*/
|
||||||
public class ClientController {
|
public class ClientController {
|
||||||
|
|
||||||
|
/** Game Controller of the client */
|
||||||
public GameController localController;
|
public GameController localController;
|
||||||
|
|
||||||
//TODO Javadoc
|
/** View of the client */
|
||||||
public IView view=null;
|
public IView view;
|
||||||
|
|
||||||
|
/** Network client (either TCP or RMI) */
|
||||||
private IClient client;
|
private IClient client;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the ClientController.
|
||||||
|
* Initializes all attributes.
|
||||||
|
* @param view the client view (either TUI or GUI)
|
||||||
|
*/
|
||||||
public ClientController(IView view) {
|
public ClientController(IView view) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
this.localController = new GameController();
|
this.localController = new GameController();
|
||||||
|
this.client = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the network client.
|
||||||
|
* @param client the client to set (either TCP or RMI)
|
||||||
|
*/
|
||||||
public void setClient(IClient client) {
|
public void setClient(IClient client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the model in the GameController and updates the view.
|
||||||
|
* @param model the model to set
|
||||||
|
*/
|
||||||
public void setModel(Game model) {
|
public void setModel(Game model) {
|
||||||
localController.setModel(model);
|
localController.setModel(model);
|
||||||
view.update(localController.getModel());
|
view.update(localController.getModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays an error message in the view.
|
||||||
|
* @param message the error message to display
|
||||||
|
*/
|
||||||
public void onError(String message) {
|
public void onError(String message) {
|
||||||
view.showError(message);
|
view.showError(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to draw an upper tribe card for the specified player from the specified position.
|
* Requests to draw a tribe card from the upper list.
|
||||||
*
|
* Creates a NetworkEvent and sends it through the network client.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the upper tribe card to draw.
|
* @param pos the index of the card to draw
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the draw operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void drawUpperTribeCard(String playerUsername,int pos) {
|
public void drawUpperTribeCard(String playerUsername, int pos) {
|
||||||
client.doEvent(new DrawUpperTribeCard(playerUsername,pos));
|
client.doEvent(new DrawUpperTribeCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to draw a lower tribe card for the specified player from the specified position.
|
* Requests to draw a tribe card from the lower list.
|
||||||
*
|
* Creates a NetworkEvent and sends it through the network client.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the lower tribe card to draw.
|
* @param pos the index of the card to draw
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the draw operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void drawLowerTribeCard(String playerUsername,int pos) {
|
public void drawLowerTribeCard(String playerUsername,int pos) {
|
||||||
client.doEvent(new DrawLowerTribeCard(playerUsername,pos));
|
client.doEvent(new DrawLowerTribeCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to draw an upper building card for the specified player from the specified position.
|
* Requests to draw a building card from the upper list.
|
||||||
*
|
* Creates a NetworkEvent and sends it through the network client.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the upper building card to draw.
|
* @param pos the index of the card to draw
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the draw operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void drawUpperBuildingCard(String playerUsername,int pos) {
|
public void drawUpperBuildingCard(String playerUsername,int pos) {
|
||||||
client.doEvent(new DrawUpperBuildingCard(playerUsername,pos));
|
client.doEvent(new DrawUpperBuildingCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to draw a lower building card for the specified player from the specified position.
|
* Requests to draw a building card from the lower list.
|
||||||
*
|
* Creates a NetworkEvent and sends it through the network client.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the lower building card to draw.
|
* @param pos the index of the card to draw
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the draw operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void drawLowerBuildingCard(String playerUsername,int pos) {
|
public void drawLowerBuildingCard(String playerUsername,int pos) {
|
||||||
client.doEvent(new DrawLowerBuildingCard(playerUsername,pos));
|
client.doEvent(new DrawLowerBuildingCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to pick an optional tribe card for the specified player from the specified position.
|
* Requests to skip drawing from the upper list.
|
||||||
*
|
* This action is available only when the upper list is empty or the player cannot draw any card.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the optional tribe card to pick.
|
*/
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
public void skipUpper(String playerUsername) {
|
||||||
* or if the pick operation fails.
|
client.doEvent(new SkipUpper(playerUsername));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests to skip drawing from the lower list.
|
||||||
|
* This action is available only when the lower list is empty or the player cannot draw any card.
|
||||||
|
* @param playerUsername the name of the player performing the action
|
||||||
|
*/
|
||||||
|
public void skipLower(String playerUsername) { client.doEvent(new SkipLower(playerUsername));}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to draw a tribe card from the upper list.
|
||||||
|
* Available only if the player owns the building 12.
|
||||||
|
* @param playerUsername the name of the player performing the action
|
||||||
|
* @param pos the index of the card to draw
|
||||||
*/
|
*/
|
||||||
public void pickOptionalTribeCard(String playerUsername,int pos) {
|
public void pickOptionalTribeCard(String playerUsername,int pos) {
|
||||||
client.doEvent(new PickOptionalTribeCard(playerUsername,pos));
|
client.doEvent(new PickOptionalTribeCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to pick an optional building card for the specified player from the specified position.
|
* Used to draw a building card from the upper list.
|
||||||
*
|
* Available only if the player owns the building 12.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param pos the position of the optional building card to pick.
|
* @param pos the index of the card to draw
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the pick operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void pickOptionalBuildingCard(String playerUsername,int pos) {
|
public void pickOptionalBuildingCard(String playerUsername,int pos) {
|
||||||
client.doEvent(new PickOptionalBuildingCard(playerUsername,pos));
|
client.doEvent(new PickOptionalBuildingCard(playerUsername,pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refuse to pick an optional building card for the specified player.
|
* Used to skip the action of drawing a card from the upper list.
|
||||||
* @param playerUsername the username of the player performing the action.
|
* Available only if the player owns the building 12.
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
* @param playerUsername the name of the player performing the action
|
||||||
* or if the pick operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void noOptionalCard(String playerUsername) {
|
public void noOptionalCard(String playerUsername) {
|
||||||
client.doEvent(new NoOptionalCard(playerUsername));
|
client.doEvent(new NoOptionalCard(playerUsername));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to perform the slot choice action for the specified player at the specified position.
|
* Used to perform the slot choice action for the specified player at the specified position.
|
||||||
*
|
* @param playerUsername the name of the player performing the action
|
||||||
* @param playerUsername the username of the player performing the action.
|
* @param pos the index of the selected slot
|
||||||
* @param pos the position of the chosen slot.
|
|
||||||
* @return {@code true} if the action succeeds, {@code false} if the player does not exist
|
|
||||||
* or if the slot choice operation fails.
|
|
||||||
*/
|
*/
|
||||||
public void slotChoice(String playerUsername,int pos) {
|
public void slotChoice(String playerUsername,int pos) {
|
||||||
client.doEvent(new SlotChoice(playerUsername,pos));
|
client.doEvent(new SlotChoice(playerUsername,pos));
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package it.polimi.ingsw.gc14.Controller;
|
package it.polimi.ingsw.gc14.Controller;
|
||||||
|
|
||||||
import it.polimi.ingsw.gc14.Model.Game;
|
import it.polimi.ingsw.gc14.Model.Game;
|
||||||
|
import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
|
||||||
import it.polimi.ingsw.gc14.Model.Player;
|
import it.polimi.ingsw.gc14.Model.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,6 +119,20 @@ public class GameController {
|
|||||||
return model.DrawLowerBuildingCardByIndex(model.getPlayerByUsername(playerUsername), pos);
|
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.
|
* Attempts to pick an optional tribe card for the specified player from the specified position.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,22 +1,42 @@
|
|||||||
package it.polimi.ingsw.gc14;
|
package it.polimi.ingsw.gc14;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* An {@link ArrayList} with a configurable size limit and an associated action.
|
||||||
|
* When the number of elements reaches or exceeds the limit, the specified action is automatically triggered.
|
||||||
|
*
|
||||||
|
* @param <T> the type of elements held in this list.
|
||||||
|
*/
|
||||||
public class LimitedList<T> extends ArrayList<T> {
|
public class LimitedList<T> extends ArrayList<T> {
|
||||||
//TODO Javadoc
|
|
||||||
|
/**
|
||||||
|
* The maximum number of elements allowed in the list before the action is triggered.
|
||||||
|
*/
|
||||||
private int limit;
|
private int limit;
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* The action to execute when the list size reaches or exceeds the limit.
|
||||||
|
*/
|
||||||
private Runnable action;
|
private Runnable action;
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* Creates a new {@code LimitedList} with the specified limit and action.
|
||||||
|
*
|
||||||
|
* @param limit the maximum number of elements before the action is triggered.
|
||||||
|
* @param action the action to execute when the limit is reached.
|
||||||
|
*/
|
||||||
public LimitedList(int limit, Runnable action) {
|
public LimitedList(int limit, Runnable action) {
|
||||||
this.limit = limit;
|
this.limit = limit;
|
||||||
this.action = action;
|
this.action = action;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* Adds the specified element to the list.
|
||||||
|
* If the list size reaches or exceeds the limit after the insertion, the configured action is triggered.
|
||||||
|
*
|
||||||
|
* @param element the element to add.
|
||||||
|
* @return {@code true} if the element was successfully added.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean add(T element) {
|
public boolean add(T element) {
|
||||||
boolean result = super.add(element);
|
boolean result = super.add(element);
|
||||||
@@ -26,16 +46,30 @@ public class LimitedList<T> extends ArrayList<T> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* Sets a new size limit for this list.
|
||||||
|
*
|
||||||
|
* @param num the new limit.
|
||||||
|
*/
|
||||||
public void setLimit(int num) {
|
public void setLimit(int num) {
|
||||||
this.limit=num;
|
this.limit = num;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
public int getLimit(){return limit;}
|
* Returns the current size limit of this list.
|
||||||
|
*
|
||||||
|
* @return the current limit.
|
||||||
|
*/
|
||||||
|
public int getLimit() {
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO Javadoc
|
/**
|
||||||
|
* Sets a new action to execute when the list size reaches or exceeds the limit.
|
||||||
|
*
|
||||||
|
* @param action the new action to set.
|
||||||
|
*/
|
||||||
public void setAction(Runnable action) {
|
public void setAction(Runnable action) {
|
||||||
this.action=action;
|
this.action = action;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package it.polimi.ingsw.gc14.Model.Cards.Building;
|
package it.polimi.ingsw.gc14.Model.Cards.Building;
|
||||||
|
|
||||||
public enum EffectType {
|
public enum EffectType {
|
||||||
FINAL, CARD_SET,INVENTOR_PAIR, ON_EVENT , ON_END_TURN, ON_ROUND_END
|
FINAL, CARD_SET, INVENTOR_PAIR, ON_EVENT, ON_END_TURN, ON_ROUND_END
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package it.polimi.ingsw.gc14.Model.Cards.TribeCards;
|
package it.polimi.ingsw.gc14.Model.Cards.TribeCards;
|
||||||
|
|
||||||
public enum CharacterType {
|
public enum CharacterType {
|
||||||
INVENTOR,BUILDER, GATHERER,ARTIST,SHAMAN,HUNTER
|
INVENTOR, BUILDER, GATHERER, ARTIST, SHAMAN, HUNTER
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,9 @@ public class Hunter extends Character {
|
|||||||
@Override
|
@Override
|
||||||
public void insert(Player player) {
|
public void insert(Player player) {
|
||||||
player.hunters.add(this);
|
player.hunters.add(this);
|
||||||
|
if(this.getIcon()){
|
||||||
|
player.addFood(player.hunters.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,19 @@ import java.io.*;
|
|||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Utility class responsible for loading and creating decks of cards and slots for the game.
|
||||||
|
* Cards are loaded from JSON resource files and instantiated according to their type and parameters.
|
||||||
|
*/
|
||||||
public class DecksCreator {
|
public class DecksCreator {
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Loads the tribe card deck for the specified era from the corresponding JSON resource file.
|
||||||
|
*
|
||||||
|
* @param era the era number (1, 2, or 3).
|
||||||
|
* @return a list of {@link TribeCard} objects for the specified era.
|
||||||
|
* @throws IllegalArgumentException if {@code era} is not 1, 2, or 3.
|
||||||
|
*/
|
||||||
public static List<TribeCard> loadTribeDeckByEra(int era) throws IllegalArgumentException
|
public static List<TribeCard> loadTribeDeckByEra(int era) throws IllegalArgumentException
|
||||||
{
|
{
|
||||||
return switch (era) {
|
return switch (era) {
|
||||||
@@ -29,7 +38,13 @@ public class DecksCreator {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Loads a tribe card deck from the specified JSON resource file path.
|
||||||
|
*
|
||||||
|
* @param resourcePath the path to the JSON resource file.
|
||||||
|
* @return a list of {@link TribeCard} objects defined in the resource file.
|
||||||
|
* @throws RuntimeException if the resource file is not found or an error occurs while reading it.
|
||||||
|
*/
|
||||||
public static List<TribeCard> loadTribeDeck(String resourcePath) {
|
public static List<TribeCard> loadTribeDeck(String resourcePath) {
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
Type listType = new com.google.gson.reflect.TypeToken<List<TribeCardDefinition>>(){}.getType();
|
Type listType = new com.google.gson.reflect.TypeToken<List<TribeCardDefinition>>(){}.getType();
|
||||||
@@ -51,14 +66,26 @@ public class DecksCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
public static List<BuildingCard> loadBuildingDeckByEra(int era) throws IllegalArgumentException
|
* Loads the building card deck for the specified era, filtering cards from the global building deck.
|
||||||
|
*
|
||||||
|
* @param era the era number (1, 2, or 3).
|
||||||
|
* @return a list of {@link BuildingCard} objects belonging to the specified era.
|
||||||
|
* @throws IllegalArgumentException if {@code era} is not 1, 2, or 3.
|
||||||
|
*/
|
||||||
|
public static List<BuildingCard> loadBuildingDeckByEra(int era) throws IllegalArgumentException
|
||||||
{
|
{
|
||||||
if(era<=0 || era>3) throw new IllegalArgumentException();
|
if(era<=0 || era>3) throw new IllegalArgumentException();
|
||||||
return loadBuildingDeck("/Cards/buildingCards.json").stream().filter(x->x.getEra()==era).toList();
|
return loadBuildingDeck("/Cards/buildingCards.json").stream().filter(x->x.getEra()==era).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Loads the full building card deck from the specified JSON resource file path.
|
||||||
|
*
|
||||||
|
* @param resourcePath the path to the JSON resource file.
|
||||||
|
* @return a list of {@link BuildingCard} objects defined in the resource file.
|
||||||
|
* @throws RuntimeException if the resource file is not found or an error occurs while reading it.
|
||||||
|
*/
|
||||||
public static List<BuildingCard> loadBuildingDeck(String resourcePath) {
|
public static List<BuildingCard> loadBuildingDeck(String resourcePath) {
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
Type listType = new com.google.gson.reflect.TypeToken<List<BuildingCardDefinition>>(){}.getType();
|
Type listType = new com.google.gson.reflect.TypeToken<List<BuildingCardDefinition>>(){}.getType();
|
||||||
@@ -80,7 +107,12 @@ public class DecksCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Creates and returns the list of slots used as the game board.
|
||||||
|
* Slots are labeled with the letters A through G.
|
||||||
|
*
|
||||||
|
* @return a list of {@link Slot} objects representing the game board.
|
||||||
|
*/
|
||||||
public static List<Slot> loadSlotDeck()
|
public static List<Slot> loadSlotDeck()
|
||||||
{
|
{
|
||||||
List<Slot> slots = new ArrayList<>();
|
List<Slot> slots = new ArrayList<>();
|
||||||
@@ -90,7 +122,15 @@ public class DecksCreator {
|
|||||||
return slots;
|
return slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Instantiates a {@link TribeCard} from the given definition.
|
||||||
|
* Depending on whether the card is an event or a character, the appropriate subclass is created
|
||||||
|
* using the type and parameters specified in the definition.
|
||||||
|
*
|
||||||
|
* @param def the {@link TribeCardDefinition} containing the card's type, era, and parameters.
|
||||||
|
* @return the instantiated {@link TribeCard}.
|
||||||
|
* @throws IllegalArgumentException if the card type is unknown or the parameters are invalid.
|
||||||
|
*/
|
||||||
private static TribeCard createCard(TribeCardDefinition def) {
|
private static TribeCard createCard(TribeCardDefinition def) {
|
||||||
int era = def.era;
|
int era = def.era;
|
||||||
|
|
||||||
@@ -138,7 +178,14 @@ public class DecksCreator {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Instantiates a {@link BuildingCard} from the given definition.
|
||||||
|
* The appropriate subclass is selected based on the effect ID specified in the definition.
|
||||||
|
* If no specific subclass matches the effect ID, a base {@link BuildingCard} is created.
|
||||||
|
*
|
||||||
|
* @param def the {@link BuildingCardDefinition} containing the card's effect ID, era, price, prestige value, and parameters.
|
||||||
|
* @return the instantiated {@link BuildingCard}.
|
||||||
|
*/
|
||||||
private static BuildingCard createCard(BuildingCardDefinition def) {
|
private static BuildingCard createCard(BuildingCardDefinition def) {
|
||||||
return switch (def.effectId) {
|
return switch (def.effectId) {
|
||||||
case 0 -> new Building0(def.era, def.price, def.prestigeValue);
|
case 0 -> new Building0(def.era, def.price, def.prestigeValue);
|
||||||
@@ -153,7 +200,11 @@ public class DecksCreator {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Internal data class representing the raw definition of a tribe card as loaded from a JSON file.
|
||||||
|
* Contains the card type, era, whether it is armed, whether it is an event card,
|
||||||
|
* and a list of additional parameters.
|
||||||
|
*/
|
||||||
private static class TribeCardDefinition {
|
private static class TribeCardDefinition {
|
||||||
String type;
|
String type;
|
||||||
int era;
|
int era;
|
||||||
@@ -162,7 +213,10 @@ public class DecksCreator {
|
|||||||
List<Object> params; // Object per gestire boolean e int misti
|
List<Object> params; // Object per gestire boolean e int misti
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Internal data class representing the raw definition of a building card as loaded from a JSON file.
|
||||||
|
* Contains the effect ID, era, price, prestige value, and a list of additional parameters.
|
||||||
|
*/
|
||||||
private static class BuildingCardDefinition {
|
private static class BuildingCardDefinition {
|
||||||
int effectId;
|
int effectId;
|
||||||
int era;
|
int era;
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ public class Game implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The current number of players.
|
* Returns the current number of players participating in the game.
|
||||||
|
* @return the current number of players.
|
||||||
*/
|
*/
|
||||||
public int getCurrentPlayerNumber() {
|
public int getCurrentPlayerNumber() {
|
||||||
return playersList.size();
|
return playersList.size();
|
||||||
@@ -318,6 +319,68 @@ public class Game implements Serializable {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips the upper card draw for the specified player when no drawable cards are available.
|
||||||
|
* The operation succeeds only if the current game stage is {@code RESOLVING_ACTIONS},
|
||||||
|
* the specified player is the current player, at least one upper draw is still available,
|
||||||
|
* and there are no drawable upper tribe cards (i.e. all remaining upper tribe cards are event cards)
|
||||||
|
* and no upper building cards that the player can afford.
|
||||||
|
* If successful, the upper draw counter is decremented.
|
||||||
|
* If both upper and lower draws become zero (or no cards remain drawable), the next player setup is triggered.
|
||||||
|
*
|
||||||
|
* @param player the player skipping the upper draw.
|
||||||
|
* @return {@code true} if the skip succeeds, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips the lower card draw for the specified player when no drawable cards are available.
|
||||||
|
* The operation succeeds only if the current game stage is {@code RESOLVING_ACTIONS},
|
||||||
|
* the specified player is the current player, at least one lower draw is still available,
|
||||||
|
* and there are no drawable lower tribe cards (i.e. all remaining lower tribe cards are event cards)
|
||||||
|
* and no lower building cards that the player can afford.
|
||||||
|
* If successful, the lower draw counter is decremented.
|
||||||
|
* If both upper and lower draws become zero (or no cards remain drawable), the next player setup is triggered.
|
||||||
|
*
|
||||||
|
* @param player the player skipping the lower draw.
|
||||||
|
* @return {@code true} if the skip succeeds, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean SkipLowerDrawing(Player player) {
|
||||||
|
if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!player.equals(currentState.getCurrentPlayer()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(currentState.getNLower() <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.
|
* 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},
|
* The operation succeeds only if the index is valid, the game stage is {@code RESOLVING_ACTIONS},
|
||||||
@@ -569,7 +632,7 @@ public class Game implements Serializable {
|
|||||||
for (Slot s : slotMap.keySet()) {
|
for (Slot s : slotMap.keySet()) {
|
||||||
if (slotMap.get(s) != null) {
|
if (slotMap.get(s) != null) {
|
||||||
currentState.PlayerUpdate(slotMap.get(s), s);
|
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;
|
break;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -587,7 +650,7 @@ public class Game implements Serializable {
|
|||||||
for (Slot s : slotMap.keySet()) {
|
for (Slot s : slotMap.keySet()) {
|
||||||
if (slotMap.get(s) != null) {
|
if (slotMap.get(s) != null) {
|
||||||
currentState.PlayerUpdate(slotMap.get(s), s);
|
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());
|
orderLogicCard.push(currentState.getCurrentPlayer());
|
||||||
|
|
||||||
slotMap.put(currentState.getSlot(), null);
|
slotMap.put(currentState.getSlot(), null);
|
||||||
@@ -658,10 +721,36 @@ public class Game implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
/**
|
||||||
|
* Checks whether there are any drawable lower tribe cards on the board,
|
||||||
|
* i.e. lower tribe cards that are not event cards.
|
||||||
|
*
|
||||||
|
* @return {@code true} if at least one non-event lower tribe card is available, {@code false} otherwise.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether there are any drawable upper tribe cards on the board,
|
||||||
|
* i.e. upper tribe cards that are not event cards.
|
||||||
|
*
|
||||||
|
* @return {@code true} if at least one non-event upper tribe card is available, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
private boolean hasDrawableUp()
|
||||||
|
{
|
||||||
|
return getUpperListTribeCards().stream().filter(x-> !x.IsEventCard()).count()!=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether there are any drawable lower tribe cards on the board,
|
||||||
|
* i.e. lower tribe cards that are not event cards.
|
||||||
|
*
|
||||||
|
* @return {@code true} if at least one non-event lower tribe card is available, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
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}.
|
* Resolves all pending event cards if the current game stage is {@code RESOLVING_EVENT}.
|
||||||
* All pending events are activated on the player list.
|
* All pending events are activated on the player list.
|
||||||
@@ -772,6 +861,14 @@ public class Game implements Serializable {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return PlayersStamp()+"\n"+BoardStamp()+"\n";
|
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()
|
public String PlayersStamp()
|
||||||
{
|
{
|
||||||
StringBuilder stringBuilder=new StringBuilder();
|
StringBuilder stringBuilder=new StringBuilder();
|
||||||
@@ -787,6 +884,14 @@ public class Game implements Serializable {
|
|||||||
}
|
}
|
||||||
return stringBuilder.toString();
|
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()
|
public String BoardStamp()
|
||||||
{
|
{
|
||||||
var offerTrack = new AsciiTable(BorderStyle.UNICODE, slotMap.size());
|
var offerTrack = new AsciiTable(BorderStyle.UNICODE, slotMap.size());
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package it.polimi.ingsw.gc14.Model.GamePackage;
|
package it.polimi.ingsw.gc14.Model.GamePackage;
|
||||||
|
|
||||||
public enum GameStages {
|
public enum GameStages {
|
||||||
WAITING,SLOT_CHOICE, RESOLVING_ACTIONS, OPTIONAL_CARD_EFFECT, RESOLVING_EVENT,ENDING,ENDED
|
WAITING, SLOT_CHOICE, RESOLVING_ACTIONS, OPTIONAL_CARD_EFFECT, RESOLVING_EVENT, ENDING, ENDED
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,10 +52,14 @@ public class Order2 extends OrderLogicCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the TURN ORDER box of the TUI.
|
||||||
|
* @return the string containing the box
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|
||||||
var table = new AsciiTable(BorderStyle.UNICODE, 2);
|
var table = new AsciiTable(BorderStyle.UNICODE, 2);
|
||||||
List<String> stringUp=new ArrayList<>();
|
List<String> stringUp=new ArrayList<>();
|
||||||
for(int i=0;i<2;i++)
|
for(int i=0;i<2;i++)
|
||||||
|
|||||||
@@ -53,6 +53,11 @@ public class Order3 extends OrderLogicCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the TURN ORDER box of the TUI.
|
||||||
|
* @return the string containing the box
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -60,6 +60,11 @@ public class Order4 extends OrderLogicCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the TURN ORDER box of the TUI.
|
||||||
|
* @return the string containing the box
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ public class Order5 extends OrderLogicCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the TURN ORDER box of the TUI.
|
||||||
|
* @return the string containing the box
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ public class OrderPlayer implements Serializable {
|
|||||||
this.player=player;
|
this.player=player;
|
||||||
this.played=played;
|
this.played=played;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the string containing the username and whether it played or not.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return player.getUserName()+" "+played;
|
return player.getUserName()+" "+played;
|
||||||
|
|||||||
@@ -9,5 +9,7 @@ public enum EventType {
|
|||||||
DRAW_LOWER_BUILD,
|
DRAW_LOWER_BUILD,
|
||||||
PICK_OPTIONAL_TRIBE,
|
PICK_OPTIONAL_TRIBE,
|
||||||
PICK_OPTIONAL_BUILD,
|
PICK_OPTIONAL_BUILD,
|
||||||
|
SKIP_UPPER,
|
||||||
|
SKIP_LOWER,
|
||||||
NO_OPTIONAL_CARD
|
NO_OPTIONAL_CARD
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,39 +4,60 @@ import it.polimi.ingsw.gc14.Controller.GameController;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Represents an event sent over the network
|
||||||
|
*/
|
||||||
public abstract class NetworkEvent implements Serializable {
|
public abstract class NetworkEvent implements Serializable {
|
||||||
//TODO javadoc
|
/** Username of the player requesting the event */
|
||||||
protected String username;
|
protected String username;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @return the username of the player requesting the event
|
||||||
|
*/
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/** EventType of the event */
|
||||||
protected EventType eventType;
|
protected EventType eventType;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @return the type of the event
|
||||||
|
*/
|
||||||
public EventType getEventType() {return eventType;}
|
public EventType getEventType() {return eventType;}
|
||||||
|
|
||||||
//TODO javadoc
|
/** Flag signaling whether the event could not be applied to the server model */
|
||||||
protected boolean isError;
|
protected boolean isError;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @return the flag signaling whether the event could be applied to the server model
|
||||||
|
*/
|
||||||
public boolean getIsError() {return isError;}
|
public boolean getIsError() {return isError;}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Set the isError flag.
|
||||||
|
* @param isError the value to set
|
||||||
|
*/
|
||||||
public void setIsError(boolean isError) {this.isError = isError;}
|
public void setIsError(boolean isError) {this.isError = isError;}
|
||||||
|
|
||||||
//TODO javadoc
|
|
||||||
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initializes all attributes.
|
||||||
|
* @param username the username of the player requesting the event
|
||||||
|
* @param eventType the type of the event
|
||||||
|
* @param isError the flag signaling if the event could be applied to the server model
|
||||||
|
*/
|
||||||
protected NetworkEvent(String username, EventType eventType, boolean isError) {
|
protected NetworkEvent(String username, EventType eventType, boolean isError) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.eventType = eventType;
|
this.eventType = eventType;
|
||||||
this.isError = isError;
|
this.isError = isError;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
|
||||||
|
/**
|
||||||
|
* @return a string describing the name of the event and whether it is an error or not
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if(isError) {
|
if(isError) {
|
||||||
@@ -46,6 +67,10 @@ public abstract class NetworkEvent implements Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* The method to apply the current event to the specified Game Controller.
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the event could be applied; false otherwise
|
||||||
|
*/
|
||||||
public abstract boolean apply(GameController gameController);
|
public abstract boolean apply(GameController gameController);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,23 +7,35 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to add a player.
|
||||||
|
*/
|
||||||
public class AddPlayer extends NetworkEvent implements Serializable {
|
public class AddPlayer extends NetworkEvent implements Serializable {
|
||||||
//TODO javadoc
|
/** Number of proposed players to add to the match */
|
||||||
private int proposedNPlayer;
|
private int proposedNPlayer;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @return the number of proposed players to add to the match
|
||||||
|
*/
|
||||||
public int getProposedNPlayer() {
|
public int getProposedNPlayer() {
|
||||||
return proposedNPlayer;
|
return proposedNPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initializes all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param proposedNPlayer the number of proposed players to add to the match
|
||||||
|
*/
|
||||||
public AddPlayer(String username, int proposedNPlayer) {
|
public AddPlayer(String username, int proposedNPlayer) {
|
||||||
super(username, EventType.ADD_PLAYER, false);
|
super(username, EventType.ADD_PLAYER, false);
|
||||||
this.proposedNPlayer = proposedNPlayer;
|
this.proposedNPlayer = proposedNPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could be added to the match, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController)
|
public boolean apply(GameController gameController)
|
||||||
{
|
{
|
||||||
|
|||||||
+14
-4
@@ -7,18 +7,28 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to draw a building card from the lower card list.
|
||||||
|
*/
|
||||||
public class DrawLowerBuildingCard extends NetworkEvent implements Serializable{
|
public class DrawLowerBuildingCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public DrawLowerBuildingCard(String username, int pos){
|
public DrawLowerBuildingCard(String username, int pos){
|
||||||
super(username, EventType.DRAW_LOWER_BUILD, false);
|
super(username, EventType.DRAW_LOWER_BUILD, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.drawLowerBuildingCard(username, pos);
|
return gameController.drawLowerBuildingCard(username, pos);
|
||||||
|
|||||||
@@ -7,17 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NetworkEvent to draw a tribe card from the lower card list.
|
||||||
|
*/
|
||||||
public class DrawLowerTribeCard extends NetworkEvent implements Serializable{
|
public class DrawLowerTribeCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public DrawLowerTribeCard(String username, int pos){
|
public DrawLowerTribeCard(String username, int pos){
|
||||||
super(username, EventType.DRAW_LOWER_TRIBE, false);
|
super(username, EventType.DRAW_LOWER_TRIBE, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.drawLowerTribeCard(username, pos);
|
return gameController.drawLowerTribeCard(username, pos);
|
||||||
|
|||||||
+15
-4
@@ -7,18 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to draw a building card from the upper card list.
|
||||||
|
*/
|
||||||
public class DrawUpperBuildingCard extends NetworkEvent implements Serializable{
|
public class DrawUpperBuildingCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public DrawUpperBuildingCard(String username, int pos){
|
public DrawUpperBuildingCard(String username, int pos){
|
||||||
super(username, EventType.DRAW_UPPER_BUILD, false);
|
super(username, EventType.DRAW_UPPER_BUILD, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.drawUpperBuildingCard(username, pos);
|
return gameController.drawUpperBuildingCard(username, pos);
|
||||||
|
|||||||
@@ -7,18 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to draw a tribe card from the upper card list.
|
||||||
|
*/
|
||||||
public class DrawUpperTribeCard extends NetworkEvent implements Serializable{
|
public class DrawUpperTribeCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public DrawUpperTribeCard(String username, int pos){
|
public DrawUpperTribeCard(String username, int pos){
|
||||||
super(username, EventType.DRAW_UPPER_TRIBE, false);
|
super(username, EventType.DRAW_UPPER_TRIBE, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.drawUpperTribeCard(username, pos);
|
return gameController.drawUpperTribeCard(username, pos);
|
||||||
|
|||||||
@@ -7,14 +7,24 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to avoid drawing a card from the upper list (see the effect of Building 12)
|
||||||
|
*/
|
||||||
public class NoOptionalCard extends NetworkEvent implements Serializable{
|
public class NoOptionalCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
*/
|
||||||
public NoOptionalCard(String username){
|
public NoOptionalCard(String username){
|
||||||
super(username, EventType.NO_OPTIONAL_CARD, false);
|
super(username, EventType.NO_OPTIONAL_CARD, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.noOptionalCard(username);
|
return gameController.noOptionalCard(username);
|
||||||
|
|||||||
+15
-4
@@ -7,18 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to draw a building card from the upper list (see the effect of Building 12)
|
||||||
|
*/
|
||||||
public class PickOptionalBuildingCard extends NetworkEvent implements Serializable{
|
public class PickOptionalBuildingCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public PickOptionalBuildingCard(String username, int pos){
|
public PickOptionalBuildingCard(String username, int pos){
|
||||||
super(username, EventType.PICK_OPTIONAL_BUILD, false);
|
super(username, EventType.PICK_OPTIONAL_BUILD, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.pickOptionalBuildingCard(username, pos);
|
return gameController.pickOptionalBuildingCard(username, pos);
|
||||||
|
|||||||
+15
-5
@@ -7,19 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to draw a tribe card from the upper list (see the effect of Building 12)
|
||||||
|
*/
|
||||||
public class PickOptionalTribeCard extends NetworkEvent implements Serializable{
|
public class PickOptionalTribeCard extends NetworkEvent implements Serializable{
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initialized all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
* @param pos the index of the card to draw
|
||||||
|
*/
|
||||||
public PickOptionalTribeCard(String username, int pos){
|
public PickOptionalTribeCard(String username, int pos){
|
||||||
super(username, EventType.PICK_OPTIONAL_TRIBE, false);
|
super(username, EventType.PICK_OPTIONAL_TRIBE, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController){
|
public boolean apply(GameController gameController){
|
||||||
return gameController.pickOptionalTribeCard(username, pos);
|
return gameController.pickOptionalTribeCard(username, pos);
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NetworkEvent to avoid drawing a card from the lower card list
|
||||||
|
*/
|
||||||
|
public class SkipLower extends NetworkEvent implements Serializable{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initializes all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
*/
|
||||||
|
public SkipLower(String username){
|
||||||
|
super(username, EventType.SKIP_LOWER, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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.SkipLowerDrawing(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NetworkEvent to avoid drawing a card from the upper card list
|
||||||
|
*/
|
||||||
|
public class SkipUpper extends NetworkEvent implements Serializable{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor.
|
||||||
|
* Initializes all the attributes.
|
||||||
|
* @param username the name of the player requesting the event
|
||||||
|
*/
|
||||||
|
public SkipUpper(String username){
|
||||||
|
super(username, EventType.SKIP_UPPER, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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.SkipUpperDrawing(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -7,18 +7,29 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* NetworkEvent to select a slot where to place the player totem.
|
||||||
|
*/
|
||||||
public class SlotChoice extends NetworkEvent implements Serializable {
|
public class SlotChoice extends NetworkEvent implements Serializable {
|
||||||
//TODO javadoc
|
|
||||||
|
/** Index of the card to draw */
|
||||||
private int pos;
|
private int pos;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* 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 SlotChoice(String username, int pos) {
|
public SlotChoice(String username, int pos) {
|
||||||
super(username, EventType.SLOT_CHOICE, false);
|
super(username, EventType.SLOT_CHOICE, false);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* @param gameController the Game Controller on which to apply the event
|
||||||
|
* @return true if the player could draw the card, false otherwise
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(GameController gameController) {
|
public boolean apply(GameController gameController) {
|
||||||
return gameController.slotChoice(username, pos);
|
return gameController.slotChoice(username, pos);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import it.polimi.ingsw.gc14.Network.IClient;
|
|||||||
import it.polimi.ingsw.gc14.Network.NetworkEvent;
|
import it.polimi.ingsw.gc14.Network.NetworkEvent;
|
||||||
import it.polimi.ingsw.gc14.Network.RMI.Common.IClientCallback;
|
import it.polimi.ingsw.gc14.Network.RMI.Common.IClientCallback;
|
||||||
import it.polimi.ingsw.gc14.Network.RMI.Common.IGameServer;
|
import it.polimi.ingsw.gc14.Network.RMI.Common.IGameServer;
|
||||||
|
import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client RMI. Uses the methods exposed by the server RMI.
|
* Client RMI. Uses the methods exposed by the server RMI.
|
||||||
@@ -39,7 +40,7 @@ public class RMIClient implements IClient {
|
|||||||
this.port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Javadoc fix
|
|
||||||
/**
|
/**
|
||||||
* Connects to the RMI server and attempts to join the game.
|
* Connects to the RMI server and attempts to join the game.
|
||||||
* Looks up the RMI registry to retrieve the {@link IGameServer} stub.
|
* Looks up the RMI registry to retrieve the {@link IGameServer} stub.
|
||||||
|
|||||||
@@ -1,43 +1,112 @@
|
|||||||
package it.polimi.ingsw.gc14.View.TUI;
|
package it.polimi.ingsw.gc14.View.TUI;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
// Helper generale per costruire tabelle ASCII
|
* General-purpose helper for building fixed-width ASCII/Unicode tables in a TUI.
|
||||||
|
*
|
||||||
|
* <p>A table is built by adding rows one at a time, then calling {@link #build()}
|
||||||
|
* to obtain the fully rendered string. Column width is computed automatically
|
||||||
|
* from the widest cell across all rows.
|
||||||
|
*
|
||||||
|
* <p>Example usage:
|
||||||
|
* <pre>{@code
|
||||||
|
* AsciiTable table = new AsciiTable(BorderStyle.UNICODE, 3);
|
||||||
|
* table.addHeader("Name", "Food", "PP");
|
||||||
|
* table.addRow("Alice", "4", "12");
|
||||||
|
* table.addRow("Bob", "2", "8");
|
||||||
|
* System.out.println(table.build());
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
public class AsciiTable {
|
public class AsciiTable {
|
||||||
//TODO javadoc
|
|
||||||
|
/**
|
||||||
|
* The border style used to draw the table (e.g. Unicode box-drawing,
|
||||||
|
* plain ASCII, rounded corners).
|
||||||
|
*/
|
||||||
private final BorderStyle s;
|
private final BorderStyle s;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* The number of columns in the table.
|
||||||
|
* Every row added via {@link #addRow} must contain exactly this many cells.
|
||||||
|
*/
|
||||||
private final int cols;
|
private final int cols;
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* The rows of the table, each represented as a list of cell strings.
|
||||||
|
* Rows are stored in display order; {@link #addHeader} inserts at index 0.
|
||||||
|
*/
|
||||||
private final List<List<String>> rows = new ArrayList<>();
|
private final List<List<String>> rows = new ArrayList<>();
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Row indices after which a horizontal separator line is drawn.
|
||||||
|
* Populated by {@link #addHeader} and {@link #addSeparator}.
|
||||||
|
*/
|
||||||
private final List<Integer> separators = new ArrayList<>();
|
private final List<Integer> separators = new ArrayList<>();
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Constructs an empty {@code AsciiTable} with the given border style
|
||||||
|
* and column count.
|
||||||
|
*
|
||||||
|
* @param s the {@link BorderStyle} to use for box-drawing characters
|
||||||
|
* @param cols the number of columns; every row must supply exactly this
|
||||||
|
* many cells
|
||||||
|
*/
|
||||||
public AsciiTable(BorderStyle s, int cols) {
|
public AsciiTable(BorderStyle s, int cols) {
|
||||||
this.s = s; this.cols = cols;
|
this.s = s; this.cols = cols;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Appends a row at the bottom of the table.
|
||||||
|
*
|
||||||
|
* @param cells one string per column, in left-to-right order
|
||||||
|
*/
|
||||||
public void addRow(String... cells) { rows.add(Arrays.asList(cells)); }
|
public void addRow(String... cells) { rows.add(Arrays.asList(cells)); }
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Appends a row at the bottom of the table.
|
||||||
|
*
|
||||||
|
* @param cells a list of strings, one per column, in left-to-right order
|
||||||
|
*/
|
||||||
public void addRow(List<String> cells) { rows.add(cells); }
|
public void addRow(List<String> cells) { rows.add(cells); }
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
public void addHeader(String... cells) { rows.add(0, Arrays.asList(cells)); separators.add(0); }
|
* Inserts a header row at the top of the table and marks it with a
|
||||||
|
* horizontal separator so that a dividing line is drawn below it.
|
||||||
|
*
|
||||||
|
* <p>Calling this method after rows have already been added will push
|
||||||
|
* all existing rows down by one position.
|
||||||
|
*
|
||||||
|
* @param cells one string per column, in left-to-right order
|
||||||
|
*/
|
||||||
|
public void addHeader(String... cells) {
|
||||||
|
rows.add(0, Arrays.asList(cells));
|
||||||
|
separators.add(0);
|
||||||
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
public void addSeparator() { separators.add(rows.size()-1); }
|
* Marks the current last row so that a horizontal separator line is
|
||||||
|
* drawn below it when the table is built.
|
||||||
|
*
|
||||||
|
* <p>Call this method immediately after the row that should be followed
|
||||||
|
* by the separator.
|
||||||
|
*/
|
||||||
|
public void addSeparator() { separators.add(rows.size() - 1); }
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Renders the table to a multi-line string.
|
||||||
|
*
|
||||||
|
* <p>Column width is determined dynamically as the length of the longest
|
||||||
|
* cell across all rows, plus one padding space. All cells are left-aligned
|
||||||
|
* and padded or truncated to the same width.
|
||||||
|
*
|
||||||
|
* @return the fully rendered table as a single string with embedded newlines
|
||||||
|
*/
|
||||||
public String build() {
|
public String build() {
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
int maxWidth = rows.stream().mapToInt(x->x.stream().mapToInt(y->y.length()).max().getAsInt()).max().getAsInt()+1;
|
int maxWidth = rows.stream()
|
||||||
sb.append(hline(s.tl(), s.mt(), s.tr(),maxWidth)).append('\n');
|
.mapToInt(x -> x.stream().mapToInt(y -> y.length()).max().getAsInt())
|
||||||
|
.max().getAsInt() + 1;
|
||||||
|
sb.append(hline(s.tl(), s.mt(), s.tr(), maxWidth)).append('\n');
|
||||||
|
|
||||||
for (int i = 0; i < rows.size(); i++) {
|
for (int i = 0; i < rows.size(); i++) {
|
||||||
sb.append(s.v());
|
sb.append(s.v());
|
||||||
@@ -45,14 +114,23 @@ public class AsciiTable {
|
|||||||
sb.append(rpad(" " + cell, maxWidth)).append(s.v());
|
sb.append(rpad(" " + cell, maxWidth)).append(s.v());
|
||||||
sb.append('\n');
|
sb.append('\n');
|
||||||
if (separators.contains(i) && i < rows.size() - 1)
|
if (separators.contains(i) && i < rows.size() - 1)
|
||||||
sb.append(hline(s.sl(), s.sx(), s.sr(),maxWidth)).append('\n');
|
sb.append(hline(s.sl(), s.sx(), s.sr(), maxWidth)).append('\n');
|
||||||
}
|
}
|
||||||
sb.append(hline(s.bl(), s.mb(), s.br(), maxWidth));
|
sb.append(hline(s.bl(), s.mb(), s.br(), maxWidth));
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
private String hline(String l, String m, String r,int maxWidth) {
|
* Builds a single horizontal border line spanning all columns.
|
||||||
|
*
|
||||||
|
* @param l the left-end character (e.g. {@code ╔}, {@code ╠}, {@code ╚})
|
||||||
|
* @param m the column-junction character (e.g. {@code ╦}, {@code ╬}, {@code ╩})
|
||||||
|
* @param r the right-end character (e.g. {@code ╗}, {@code ╣}, {@code ╝})
|
||||||
|
* @param maxWidth the width in characters of each column segment,
|
||||||
|
* filled with the horizontal line character of the current style
|
||||||
|
* @return the rendered horizontal line as a string
|
||||||
|
*/
|
||||||
|
private String hline(String l, String m, String r, int maxWidth) {
|
||||||
var sb = new StringBuilder(l);
|
var sb = new StringBuilder(l);
|
||||||
for (int i = 0; i < cols; i++) {
|
for (int i = 0; i < cols; i++) {
|
||||||
sb.append(s.h().repeat(maxWidth));
|
sb.append(s.h().repeat(maxWidth));
|
||||||
@@ -61,13 +139,40 @@ public class AsciiTable {
|
|||||||
return sb.append(r).toString();
|
return sb.append(r).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Right-pads a string with spaces to the given width, or truncates it
|
||||||
|
* if it exceeds that width.
|
||||||
|
*
|
||||||
|
* @param s the input string
|
||||||
|
* @param w the desired output width in characters
|
||||||
|
* @return a string of exactly {@code w} characters
|
||||||
|
*/
|
||||||
private static String rpad(String s, int w) {
|
private static String rpad(String s, int w) {
|
||||||
if (s.length() >= w) return s.substring(0, w);
|
if (s.length() >= w) return s.substring(0, w);
|
||||||
return s + " ".repeat(w - s.length());
|
return s + " ".repeat(w - s.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO javadoc
|
/**
|
||||||
|
* Places two pre-rendered text blocks side by side, separated by a gap.
|
||||||
|
*
|
||||||
|
* <p>Each block is a list of lines as returned by {@link #build()}.
|
||||||
|
* Lines in the left block are padded to a uniform width so that the
|
||||||
|
* right block always starts at the same horizontal position. If one
|
||||||
|
* block is taller than the other, the shorter one is padded with blank
|
||||||
|
* lines.
|
||||||
|
*
|
||||||
|
* <p>Example:
|
||||||
|
* <pre>{@code
|
||||||
|
* List<String> left = Arrays.asList(table1.build().split("\n"));
|
||||||
|
* List<String> right = Arrays.asList(table2.build().split("\n"));
|
||||||
|
* System.out.print(AsciiTable.sideBySide(left, right, 2));
|
||||||
|
* }</pre>
|
||||||
|
*
|
||||||
|
* @param left lines of the left block
|
||||||
|
* @param right lines of the right block
|
||||||
|
* @param gap number of blank spaces between the two blocks
|
||||||
|
* @return the merged string with embedded newlines
|
||||||
|
*/
|
||||||
public static String sideBySide(List<String> left, List<String> right, int gap) {
|
public static String sideBySide(List<String> left, List<String> right, int gap) {
|
||||||
int leftWidth = left.stream().mapToInt(String::length).max().orElse(0);
|
int leftWidth = left.stream().mapToInt(String::length).max().orElse(0);
|
||||||
int maxHeight = Math.max(left.size(), right.size());
|
int maxHeight = Math.max(left.size(), right.size());
|
||||||
@@ -75,17 +180,11 @@ public class AsciiTable {
|
|||||||
|
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
for (int i = 0; i < maxHeight; i++) {
|
for (int i = 0; i < maxHeight; i++) {
|
||||||
String l = i < left.size()
|
String l = i < left.size() ? left.get(i) : " ".repeat(leftWidth);
|
||||||
? left.get(i)
|
|
||||||
: " ".repeat(leftWidth);
|
|
||||||
|
|
||||||
// padda la riga sinistra se è più corta delle altre
|
|
||||||
l = rpad(l, leftWidth);
|
l = rpad(l, leftWidth);
|
||||||
|
|
||||||
String r = i < right.size() ? right.get(i) : "";
|
String r = i < right.size() ? right.get(i) : "";
|
||||||
sb.append(l).append(padding).append(r).append('\n');
|
sb.append(l).append(padding).append(r).append('\n');
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -4,111 +4,214 @@ import it.polimi.ingsw.gc14.View.IView;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text-based User Interface (TUI) implementation of {@link IView}.
|
||||||
|
*
|
||||||
|
* <p>Renders the current state of a {@link Game} model directly to the
|
||||||
|
* standard output using Unicode box-drawing characters and fixed-width
|
||||||
|
* ASCII tables (see {@link AsciiTable}).
|
||||||
|
*
|
||||||
|
* <p>The display is split into two side-by-side panels:
|
||||||
|
* <ul>
|
||||||
|
* <li><b>Left panel</b> — board or player status, depending on the render method called.</li>
|
||||||
|
* <li><b>Right panel</b> — menu options legend and the current player's hand.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>The terminal is cleared before each render via a platform-aware
|
||||||
|
* {@code cls} / {@code clear} system call.
|
||||||
|
*
|
||||||
|
* <p>Typical usage:
|
||||||
|
* <pre>{@code
|
||||||
|
* TUI tui = new TUI(game);
|
||||||
|
* tui.setUsername("Alice");
|
||||||
|
* tui.fullRender();
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
public class TUI implements IView {
|
public class TUI implements IView {
|
||||||
|
|
||||||
// ── dati di stato ───────────────────────────────────────────
|
/**
|
||||||
private BorderStyle style = BorderStyle.UNICODE;
|
* The {@link Game} model whose state is rendered.
|
||||||
|
* Updated via {@link #update(Game)} whenever the game state changes.
|
||||||
|
*/
|
||||||
private Game model;
|
private Game model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The username of the local player, used to retrieve and display
|
||||||
|
* that player's hand in the right panel.
|
||||||
|
*
|
||||||
|
* @see #setUsername(String)
|
||||||
|
*/
|
||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a {@code TUI} bound to the given game model.
|
||||||
|
* The username is initialised to an empty string and must be set
|
||||||
|
* separately via {@link #setUsername(String)} before calling any
|
||||||
|
* render method that displays the player's hand.
|
||||||
|
*
|
||||||
|
* @param model the {@link Game} model to display; must not be {@code null}
|
||||||
|
*/
|
||||||
public TUI(Game model) {
|
public TUI(Game model) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
this.username="";
|
this.username = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the username of the local player.
|
||||||
|
* This value is used by {@link #renderBoard()} and {@link #fullRender()}
|
||||||
|
* to look up the correct player hand via
|
||||||
|
* {@link Game#getPlayerByUsername(String)}.
|
||||||
|
*
|
||||||
|
* @param username the player's username; must match an existing player
|
||||||
|
* in the current {@link Game} model
|
||||||
|
*/
|
||||||
public void setUsername(String username) {
|
public void setUsername(String username) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the game model stored in this view.
|
||||||
|
* Should be called whenever the game state changes so that the next
|
||||||
|
* render reflects the latest state.
|
||||||
|
*
|
||||||
|
* @param model the new {@link Game} model; must not be {@code null}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void update(Game model) {
|
public void update(Game model) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── punto di ingresso ───────────────────────────────────────
|
/**
|
||||||
public void render()
|
* Default render entry point, as required by {@link IView}.
|
||||||
{
|
* Delegates to {@link #renderBoard()}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void render() {
|
||||||
renderBoard();
|
renderBoard();
|
||||||
}
|
}
|
||||||
public void fullRender()
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
String os = System.getProperty("os.name").toLowerCase();
|
|
||||||
ProcessBuilder pb;
|
|
||||||
if (os.contains("win")) {
|
|
||||||
pb = new ProcessBuilder("cmd", "/c", "cls");
|
|
||||||
} else {
|
|
||||||
pb = new ProcessBuilder("clear");
|
|
||||||
}
|
|
||||||
pb.inheritIO().start().waitFor();
|
|
||||||
}
|
|
||||||
catch(Exception e){
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String>lines=List.of(model.BoardStamp().split("\n"));
|
/**
|
||||||
List<String> lines2=List.of((PrintMenuOptions()+"\n"+model.getPlayerByUsername(username)).split("\n"));
|
* Renders a full view of the game, combining both player status
|
||||||
System.out.println(model.PlayersStamp()+"\n"+ AsciiTable.sideBySide(lines,lines2,3));
|
* and board status.
|
||||||
|
*
|
||||||
|
* <p>Layout:
|
||||||
|
* <ul>
|
||||||
|
* <li><b>Top</b> — player status table produced by
|
||||||
|
* {@link Game#PlayersStamp()}.</li>
|
||||||
|
* <li><b>Bottom-left</b> — board status produced by
|
||||||
|
* {@link Game#BoardStamp()}.</li>
|
||||||
|
* <li><b>Bottom-right</b> — menu options legend and the local
|
||||||
|
* player's hand.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>The terminal is cleared before rendering.
|
||||||
|
*/
|
||||||
|
public void fullRender() {
|
||||||
|
clearTerminal();
|
||||||
|
List<String> lines = List.of(model.BoardStamp().split("\n"));
|
||||||
|
List<String> lines2 = List.of((printMenuOptions() + "\n" +
|
||||||
|
model.getPlayerByUsername(username)).split("\n"));
|
||||||
|
System.out.println(model.PlayersStamp() + "\n" +
|
||||||
|
AsciiTable.sideBySide(lines, lines2, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderBoard()
|
/**
|
||||||
{
|
* Renders the board status only.
|
||||||
try{
|
*
|
||||||
String os = System.getProperty("os.name").toLowerCase();
|
* <p>Layout:
|
||||||
ProcessBuilder pb;
|
* <ul>
|
||||||
if (os.contains("win")) {
|
* <li><b>Left panel</b> — turn order, upper card row, offer track,
|
||||||
pb = new ProcessBuilder("cmd", "/c", "cls");
|
* and lower card row, as produced by {@link Game#BoardStamp()}.</li>
|
||||||
} else {
|
* <li><b>Right panel</b> — menu options legend followed by the local
|
||||||
pb = new ProcessBuilder("clear");
|
* player's hand.</li>
|
||||||
}
|
* </ul>
|
||||||
pb.inheritIO().start().waitFor();
|
*
|
||||||
}
|
* <p>The terminal is cleared before rendering.
|
||||||
catch(Exception e){
|
*/
|
||||||
}
|
public void renderBoard() {
|
||||||
List<String>lines=List.of(model.BoardStamp().split("\n"));
|
clearTerminal();
|
||||||
List<String> lines2=List.of((PrintMenuOptions()+"\nYOUR HAND\n"+model.getPlayerByUsername(username)).split("\n"));
|
List<String> lines = List.of(model.BoardStamp().split("\n"));
|
||||||
System.out.println(AsciiTable.sideBySide(lines,lines2,3));
|
List<String> lines2 = List.of((printMenuOptions() + "\nYOUR HAND\n" +
|
||||||
}
|
model.getPlayerByUsername(username)).split("\n"));
|
||||||
public void renderPlayer()
|
System.out.println(AsciiTable.sideBySide(lines, lines2, 3));
|
||||||
{
|
|
||||||
try{
|
|
||||||
String os = System.getProperty("os.name").toLowerCase();
|
|
||||||
ProcessBuilder pb;
|
|
||||||
if (os.contains("win")) {
|
|
||||||
pb = new ProcessBuilder("cmd", "/c", "cls");
|
|
||||||
} else {
|
|
||||||
pb = new ProcessBuilder("clear");
|
|
||||||
}
|
|
||||||
pb.inheritIO().start().waitFor();
|
|
||||||
}
|
|
||||||
catch(Exception e){
|
|
||||||
}
|
|
||||||
List<String>lines=List.of(model.PlayersStamp().split("\n"));
|
|
||||||
List<String> lines2=List.of(PrintMenuOptions().split("\n"));
|
|
||||||
System.out.println(AsciiTable.sideBySide(lines,lines2,3));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showMessage(String message)
|
/**
|
||||||
{
|
* Renders the player status table only.
|
||||||
|
*
|
||||||
|
* <p>Layout:
|
||||||
|
* <ul>
|
||||||
|
* <li><b>Left panel</b> — prestige, food, character deck, and building
|
||||||
|
* deck for all players, as produced by {@link Game#PlayersStamp()}.</li>
|
||||||
|
* <li><b>Right panel</b> — menu options legend.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>The terminal is cleared before rendering.
|
||||||
|
*/
|
||||||
|
public void renderPlayer() {
|
||||||
|
clearTerminal();
|
||||||
|
List<String> lines = List.of(model.PlayersStamp().split("\n"));
|
||||||
|
List<String> lines2 = List.of(printMenuOptions().split("\n"));
|
||||||
|
System.out.println(AsciiTable.sideBySide(lines, lines2, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a plain message to standard output.
|
||||||
|
*
|
||||||
|
* @param message the message to display
|
||||||
|
*/
|
||||||
|
public void showMessage(String message) {
|
||||||
System.out.println(message);
|
System.out.println(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
public void showError(String message)
|
* Prints an error message to standard output.
|
||||||
{
|
*
|
||||||
|
* @param message the error message to display
|
||||||
|
*/
|
||||||
|
public void showError(String message) {
|
||||||
|
clearTerminal();
|
||||||
|
render();
|
||||||
System.out.println(message);
|
System.out.println(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String PrintMenuOptions()
|
/**
|
||||||
{
|
* Builds and returns the menu options panel as a two-column
|
||||||
var table=new AsciiTable(BorderStyle.ROUNDED,2);
|
* {@link AsciiTable} with rounded borders.
|
||||||
table.addHeader( "Menu Options","Render Options");
|
*
|
||||||
table.addRow( List.of("1-SlotChoice(pos)","A-Full Render"));
|
* <p>The left column lists game action commands (slot choice, draw, pick…),
|
||||||
table.addRow(List.of("2-DrawUpperTribe(pos)","B-Board Render"));
|
* the right column lists render shortcuts (full, board, players).
|
||||||
table.addRow(List.of("3-DrawUpperBuilding(pos)","C-Players Render"));
|
*
|
||||||
table.addRow(List.of("4-DrawLowerTribe(pos)",""));
|
* @return the rendered menu table as a multi-line string
|
||||||
table.addRow(List.of("5-DrawLowerBuilding(pos)",""));
|
*/
|
||||||
table.addRow(List.of("6-PickOptionalTribe(pos)",""));
|
private String printMenuOptions() {
|
||||||
table.addRow(List.of("7-PickOptionalBuilding(pos)",""));
|
var table = new AsciiTable(BorderStyle.ROUNDED, 2);
|
||||||
table.addRow(List.of("8-NoOptional",""));
|
table.addHeader("Menu Options", "Render Options");
|
||||||
|
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();
|
return table.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the terminal using a platform-aware system call.
|
||||||
|
* Uses {@code cls} on Windows and {@code clear} on Unix-like systems.
|
||||||
|
* Failures are silently ignored to avoid interrupting the render flow.
|
||||||
|
*/
|
||||||
|
private void clearTerminal() {
|
||||||
|
try {
|
||||||
|
String os = System.getProperty("os.name").toLowerCase();
|
||||||
|
ProcessBuilder pb = os.contains("win")
|
||||||
|
? new ProcessBuilder("cmd", "/c", "cls")
|
||||||
|
: new ProcessBuilder("clear");
|
||||||
|
pb.inheritIO().start().waitFor();
|
||||||
|
} catch (Exception ignored) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+24
-13
@@ -96,7 +96,7 @@ class Building11Test {
|
|||||||
p3.addFood(b3.getPrice());
|
p3.addFood(b3.getPrice());
|
||||||
assertTrue(b3.buy(p3));
|
assertTrue(b3.buy(p3));
|
||||||
p4.addFood(b3.getPrice());
|
p4.addFood(b3.getPrice());
|
||||||
assertEquals(false, b3.buy(p4));
|
assertFalse(b3.buy(p4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -112,22 +112,33 @@ class Building11Test {
|
|||||||
@Test
|
@Test
|
||||||
@DisplayName("toString")
|
@DisplayName("toString")
|
||||||
void testToString(){
|
void testToString(){
|
||||||
Building11 b11 = new Building11(1,2,3, CharacterType.INVENTOR, 1);
|
int era = 1;
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: INVENTOR", b11.toString());
|
int price = 1;
|
||||||
|
int prestigeValue = 3;
|
||||||
|
CharacterType ct = CharacterType.ARTIST;
|
||||||
|
int pm = 5;
|
||||||
|
|
||||||
b11 = new Building11(1,2,3, CharacterType.BUILDER, 1);
|
Building11 b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: BUILDER", b11.toString());
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
|
|
||||||
b11 = new Building11(1,2,3, CharacterType.GATHERER, 1);
|
ct = CharacterType.BUILDER;
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: GATHERER", b11.toString());
|
b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
|
|
||||||
b11 = new Building11(1,2,3, CharacterType.ARTIST, 1);
|
ct = CharacterType.GATHERER;
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: ARTIST", b11.toString());
|
b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
|
|
||||||
b11 = new Building11(1,2,3, CharacterType.SHAMAN, 1);
|
ct = CharacterType.HUNTER;
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: SHAMAN", b11.toString());
|
b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
|
|
||||||
b11 = new Building11(1,2,3, CharacterType.HUNTER, 1);
|
ct = CharacterType.INVENTOR;
|
||||||
assertEquals("Era:1 Price:2 Prestige:3 Icon: HUNTER", b11.toString());
|
b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
|
|
||||||
|
ct = CharacterType.SHAMAN;
|
||||||
|
b11 = new Building11(era, price, prestigeValue, ct, pm);
|
||||||
|
assertEquals("⎕: " + "ID:11" + " $:" + price + " PV:" + prestigeValue + " Icon: " + ct.toString().charAt(0) + " MP: " + pm, b11.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+18
-2
@@ -21,8 +21,10 @@ class HunterTest {
|
|||||||
String s = h.toString();
|
String s = h.toString();
|
||||||
|
|
||||||
assertNotNull(s);
|
assertNotNull(s);
|
||||||
assertTrue(s.contains(CharacterType.HUNTER.toString()));
|
assertTrue(s.contains(" I"));
|
||||||
assertTrue(s.contains("Icon: true"));
|
|
||||||
|
Hunter h2 = new Hunter(3, false);
|
||||||
|
assertTrue(!h2.toString().contains("I"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -55,6 +57,20 @@ class HunterTest {
|
|||||||
|
|
||||||
assertEquals(2, p.hunters.size());
|
assertEquals(2, p.hunters.size());
|
||||||
assertTrue(p.hunters.contains(h2));
|
assertTrue(p.hunters.contains(h2));
|
||||||
|
|
||||||
|
Player p2 = new Player("test2");
|
||||||
|
Hunter h3 = new Hunter(1, true);
|
||||||
|
|
||||||
|
assertEquals(0, p2.getFoodValue());
|
||||||
|
h.insert(p2);
|
||||||
|
|
||||||
|
assertEquals(1, p2.getFoodValue());
|
||||||
|
h2.insert(p2);
|
||||||
|
|
||||||
|
assertEquals(1, p2.getFoodValue());
|
||||||
|
h3.insert(p2);
|
||||||
|
|
||||||
|
assertEquals(4, p2.getFoodValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user