Fix: full model refactor
This commit is contained in:
@@ -53,7 +53,7 @@ public class DecksCreator {
|
||||
|
||||
InputStream is = DecksCreator.class.getResourceAsStream(resourcePath);
|
||||
if (is == null) {
|
||||
throw new RuntimeException("File non trovato: " + resourcePath);
|
||||
throw new RuntimeException("Resource file not found: " + resourcePath);
|
||||
}
|
||||
|
||||
try (Reader reader = new InputStreamReader(is)) {
|
||||
@@ -64,7 +64,7 @@ public class DecksCreator {
|
||||
}
|
||||
return cards;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Errore caricamento mazzo: " + resourcePath, e);
|
||||
throw new RuntimeException("Error loading deck: " + resourcePath, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ public class DecksCreator {
|
||||
|
||||
InputStream is = DecksCreator.class.getResourceAsStream(resourcePath);
|
||||
if (is == null) {
|
||||
throw new RuntimeException("File non trovato: " + resourcePath);
|
||||
throw new RuntimeException("Resource file not found: " + resourcePath);
|
||||
}
|
||||
|
||||
try (Reader reader = new InputStreamReader(is)) {
|
||||
@@ -105,7 +105,7 @@ public class DecksCreator {
|
||||
}
|
||||
return cards;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Errore caricamento mazzo: " + resourcePath, e);
|
||||
throw new RuntimeException("Error loading deck: " + resourcePath, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ public class DecksCreator {
|
||||
case "Hunt" -> new Hunt(def.id,era,p[0]);
|
||||
case "CavePaintings" -> new CavePaintings(def.id,era,p[0],p[1],p[2]);
|
||||
case "ShamanicRitual" -> new ShamanicRitual(def.id,era,p[0],p[1]);
|
||||
default -> throw new IllegalArgumentException("Tipo sconosciuto: " + def.type);
|
||||
default -> throw new IllegalArgumentException("Unknown event type: " + def.type);
|
||||
};
|
||||
}
|
||||
return switch (def.type) {
|
||||
@@ -153,29 +153,29 @@ public class DecksCreator {
|
||||
case "Builder" -> switch (p.length) {
|
||||
case 2 -> new Builder(def.id,era, p[0], p[1]);
|
||||
case 3 -> new Builder(def.id,era, p[0], p[1], p[2]);
|
||||
default -> throw new IllegalArgumentException("Builder: parametri non validi");
|
||||
default -> throw new IllegalArgumentException("Builder: invalid parameters");
|
||||
};
|
||||
case "Gatherer" -> switch (p.length) {
|
||||
case 0 -> new Gatherer(def.id,era);
|
||||
case 1 -> new Gatherer(def.id,era, p[0]);
|
||||
default -> throw new IllegalArgumentException("Gatherer: parametri non validi");
|
||||
default -> throw new IllegalArgumentException("Gatherer: invalid parameters");
|
||||
};
|
||||
case "Artist" -> switch (p.length) {
|
||||
case 0 -> new Artist(def.id,era);
|
||||
case 1 -> new Artist(def.id,era, p[0]);
|
||||
default -> throw new IllegalArgumentException("Artist: parametri non validi");
|
||||
default -> throw new IllegalArgumentException("Artist: invalid parameters");
|
||||
};
|
||||
case "Inventor" -> switch (p.length) {
|
||||
case 1 -> new Inventor(def.id,era, p[0]);
|
||||
case 2 -> new Inventor(def.id,era, p[0], p[1]);
|
||||
default -> throw new IllegalArgumentException("Inventor: parametri non validi");
|
||||
default -> throw new IllegalArgumentException("Inventor: invalid parameters");
|
||||
};
|
||||
case "Shaman" -> switch (p.length) {
|
||||
case 1 -> new Shaman(def.id,era, p[0]);
|
||||
case 2 -> new Shaman(def.id,era, p[0], p[1]);
|
||||
default -> throw new IllegalArgumentException("Shaman: parametri non validi");
|
||||
default -> throw new IllegalArgumentException("Shaman: invalid parameters");
|
||||
};
|
||||
default -> throw new IllegalArgumentException("Tipo sconosciuto: " + def.type);
|
||||
default -> throw new IllegalArgumentException("Unknown card type: " + def.type);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -212,7 +212,7 @@ public class DecksCreator {
|
||||
int era;
|
||||
boolean armed;
|
||||
boolean isEvent;
|
||||
List<Object> params; // Object per gestire boolean e int misti
|
||||
List<Object> params; // Object to support mixed boolean and numeric parameters from JSON
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,6 +225,6 @@ public class DecksCreator {
|
||||
int era;
|
||||
int price;
|
||||
int prestigeValue;
|
||||
List<Object> params; // Object per gestire boolean e int misti
|
||||
List<Object> params; // Object to support mixed boolean and numeric parameters from JSON
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the choice is applied successfully, {@code false} otherwise.
|
||||
*/
|
||||
public synchronized boolean totemChoice(Player player,Totems totem) {
|
||||
if(!currentState.getGameStage().equals(GameStages.TOTEM_CHOICE))
|
||||
if(currentState.getGameStage() != GameStages.TOTEM_CHOICE)
|
||||
return false;
|
||||
if(!getCurrentState().getCurrentPlayer().equals(player))
|
||||
return false;
|
||||
@@ -120,8 +120,18 @@ public class Game implements Serializable {
|
||||
|
||||
/**
|
||||
* Map tracking the players who are currently disconnected.
|
||||
* Key: player; value: {@code true} if currently disconnected, {@code false} if reconnected.
|
||||
*/
|
||||
public Map<Player,Boolean> disconnectedPlayers = new HashMap<>();
|
||||
private Map<Player,Boolean> disconnectedPlayers = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Returns an unmodifiable view of the disconnected-players map.
|
||||
*
|
||||
* @return map from player to disconnection status.
|
||||
*/
|
||||
public Map<Player,Boolean> getDisconnectedPlayers() {
|
||||
return Collections.unmodifiableMap(disconnectedPlayers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the specified player as disconnected and updates the game flow accordingly.
|
||||
@@ -142,13 +152,13 @@ public class Game implements Serializable {
|
||||
return false;
|
||||
}
|
||||
disconnectedPlayers.put(player,true);
|
||||
if (currentState.getGameStage().equals(GameStages.WAITING)) {
|
||||
if (currentState.getGameStage() == GameStages.WAITING) {
|
||||
playersList.remove(player);
|
||||
totemChoiceQueue.remove(player);
|
||||
return true;
|
||||
}
|
||||
if(currentState.getCurrentPlayer().equals(player)) {
|
||||
if (!currentState.getGameStage().equals(GameStages.TOTEM_CHOICE)) {
|
||||
if (currentState.getGameStage() != GameStages.TOTEM_CHOICE) {
|
||||
nextPlayerSetup();
|
||||
return true;
|
||||
}
|
||||
@@ -184,15 +194,15 @@ public class Game implements Serializable {
|
||||
return false;
|
||||
}
|
||||
disconnectedPlayers.put(player,false);
|
||||
if(currentState.getGameStage().equals(GameStages.SLOT_CHOICE) )
|
||||
if(currentState.getGameStage() == GameStages.SLOT_CHOICE)
|
||||
{
|
||||
disconnectedPlayers.remove(player);
|
||||
if(!orderLogicCard.players.contains(player))
|
||||
if(!orderLogicCard.containsInQueue(player))
|
||||
{
|
||||
orderLogicCard.pushNoEffect(player);
|
||||
}
|
||||
}
|
||||
else if(currentState.getGameStage().equals(GameStages.RES_ACTIONS)) {
|
||||
else if(currentState.getGameStage() == GameStages.RES_ACTIONS) {
|
||||
if(slotMap.containsValue(player))
|
||||
{
|
||||
disconnectedPlayers.remove(player);
|
||||
@@ -247,7 +257,7 @@ public class Game implements Serializable {
|
||||
/**
|
||||
* The queue of players involved in optional card resolution.
|
||||
*/
|
||||
private Queue<Player> OptionalCardQueue;
|
||||
private Queue<Player> optionalCardQueue;
|
||||
|
||||
/**
|
||||
* The order logic card associated with this game.
|
||||
@@ -274,39 +284,39 @@ public class Game implements Serializable {
|
||||
public Board getBoard() {return board;}
|
||||
|
||||
/**
|
||||
* Returns clones of the upper tribe cards currently available on the board.
|
||||
* Returns a copy of the upper tribe cards currently available on the board.
|
||||
*
|
||||
* @return a list containing clones of the upper tribe cards currently available on the board.
|
||||
* @return a new list containing the upper tribe cards currently on the board.
|
||||
*/
|
||||
public ArrayList<TribeCard>getUpperListTribeCards() {
|
||||
return (ArrayList<TribeCard>)board.upperListTribe;
|
||||
public ArrayList<TribeCard> getUpperListTribeCards() {
|
||||
return new ArrayList<>(board.getUpperListTribe());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns clones of the lower tribe cards currently available on the board.
|
||||
* Returns a copy of the lower tribe cards currently available on the board.
|
||||
*
|
||||
* @return a list containing clones of the lower tribe cards currently available on the board.
|
||||
* @return a new list containing the lower tribe cards currently on the board.
|
||||
*/
|
||||
public ArrayList<TribeCard>getLowerListTribeCards() {
|
||||
return (ArrayList<TribeCard> )board.lowerListTribe;
|
||||
public ArrayList<TribeCard> getLowerListTribeCards() {
|
||||
return new ArrayList<>(board.getLowerListTribe());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns clones of the upper building cards currently available on the board.
|
||||
* Returns a copy of the upper building cards currently available on the board.
|
||||
*
|
||||
* @return a list containing clones of the upper building cards currently available on the board.
|
||||
* @return a new list containing the upper building cards currently on the board.
|
||||
*/
|
||||
public ArrayList<BuildingCard>getUpperListBuilding() {
|
||||
return (ArrayList<BuildingCard>)board.upperListBuilding;
|
||||
public ArrayList<BuildingCard> getUpperListBuilding() {
|
||||
return new ArrayList<>(board.getUpperListBuilding());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns clones of the lower building cards currently available on the board.
|
||||
* Returns a copy of the lower building cards currently available on the board.
|
||||
*
|
||||
* @return a list containing clones of the lower building cards currently available on the board.
|
||||
* @return a new list containing the lower building cards currently on the board.
|
||||
*/
|
||||
public ArrayList<BuildingCard>getLowerListBuilding() {
|
||||
return (ArrayList<BuildingCard>) board.lowerListBuilding;
|
||||
public ArrayList<BuildingCard> getLowerListBuilding() {
|
||||
return new ArrayList<>(board.getLowerListBuilding());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -316,7 +326,7 @@ public class Game implements Serializable {
|
||||
*/
|
||||
public CurrentState getCurrentState() {
|
||||
return currentState;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the player with the specified username, if present.
|
||||
@@ -357,7 +367,7 @@ public class Game implements Serializable {
|
||||
}
|
||||
currentState= new CurrentState();
|
||||
playersList = new ArrayList<>();
|
||||
OptionalCardQueue = new LinkedList<>();
|
||||
optionalCardQueue = new LinkedList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -482,7 +492,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the draw succeeds, {@code false} otherwise.
|
||||
*/
|
||||
public boolean drawUpperTribeCardByIndex(Player player,int cardIndex) {
|
||||
if( cardIndex<0 || cardIndex >=board.upperListTribe.size())
|
||||
if( cardIndex<0 || cardIndex >=board.getUpperListTribe().size())
|
||||
return false;
|
||||
if(currentState.getGameStage()!= GameStages.RES_ACTIONS && currentState.getGameStage()!=GameStages.OPT_CARD_E)
|
||||
{
|
||||
@@ -494,7 +504,7 @@ public class Game implements Serializable {
|
||||
}
|
||||
if(currentState.getNUpper() <1 && currentState.getGameStage()==GameStages.RES_ACTIONS)
|
||||
return false;
|
||||
TribeCard tribeCard = board.upperListTribe.get(cardIndex);
|
||||
TribeCard tribeCard = board.getUpperListTribe().get(cardIndex);
|
||||
if(tribeCard.isEventCard())
|
||||
return false;
|
||||
|
||||
@@ -525,7 +535,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the skip succeeds, {@code false} otherwise.
|
||||
*/
|
||||
public boolean skipTurn(Player player) {
|
||||
if(currentState.getGameStage()!= GameStages.RES_ACTIONS && !currentState.getGameStage().equals(GameStages.OPT_CARD_E))
|
||||
if(currentState.getGameStage() != GameStages.RES_ACTIONS && currentState.getGameStage() != GameStages.OPT_CARD_E)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -565,7 +575,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the draw succeeds, {@code false} otherwise.
|
||||
*/
|
||||
public boolean drawLowerTribeCardByIndex(Player player, int cardIndex) {
|
||||
if( cardIndex<0 || cardIndex >=board.lowerListTribe.size())
|
||||
if( cardIndex<0 || cardIndex >=board.getLowerListTribe().size())
|
||||
return false;
|
||||
if(currentState.getGameStage()!= GameStages.RES_ACTIONS)
|
||||
{
|
||||
@@ -579,7 +589,7 @@ public class Game implements Serializable {
|
||||
|
||||
if(currentState.getNLower() <1)
|
||||
return false;
|
||||
TribeCard tribeCard = board.lowerListTribe.get(cardIndex);
|
||||
TribeCard tribeCard = board.getLowerListTribe().get(cardIndex);
|
||||
if(tribeCard.isEventCard())
|
||||
return false;
|
||||
|
||||
@@ -606,7 +616,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the draw succeeds, {@code false} otherwise.
|
||||
*/
|
||||
public boolean drawUpperBuildingCardByIndex(Player player,int cardIndex) {
|
||||
if( cardIndex<0 || cardIndex >=board.upperListBuilding.size())
|
||||
if( cardIndex<0 || cardIndex >=board.getUpperListBuilding().size())
|
||||
return false;
|
||||
if(currentState.getGameStage()!= GameStages.RES_ACTIONS && currentState.getGameStage()!=GameStages.OPT_CARD_E)
|
||||
{
|
||||
@@ -616,7 +626,7 @@ public class Game implements Serializable {
|
||||
{
|
||||
return false;
|
||||
}
|
||||
BuildingCard buildingCard = board.upperListBuilding.get(cardIndex);
|
||||
BuildingCard buildingCard = board.getUpperListBuilding().get(cardIndex);
|
||||
if(currentState.getNUpper() <1 && currentState.getGameStage()==GameStages.RES_ACTIONS)
|
||||
return false;
|
||||
if(!buildingCard.buy(player))
|
||||
@@ -624,7 +634,7 @@ public class Game implements Serializable {
|
||||
return false;
|
||||
}
|
||||
board.removeUpperBuildingCard(buildingCard);
|
||||
if(currentState.getGameStage().equals(GameStages.RES_ACTIONS))
|
||||
if(currentState.getGameStage() == GameStages.RES_ACTIONS)
|
||||
{
|
||||
currentState.upperDrawn();
|
||||
if((currentState.getNLower() ==0 ||( !hasDrawableDown() && getLowerListBuilding().isEmpty())) && ((currentState.getNUpper() ==0)||(!hasDrawableUp() && getUpperListBuilding().isEmpty())))
|
||||
@@ -650,7 +660,7 @@ public class Game implements Serializable {
|
||||
* @return {@code true} if the draw succeeds, {@code false} otherwise.
|
||||
*/
|
||||
public boolean drawLowerBuildingCardByIndex(Player player,int cardIndex) {
|
||||
if( cardIndex<0 || cardIndex >=board.lowerListBuilding.size())
|
||||
if( cardIndex<0 || cardIndex >=board.getLowerListBuilding().size())
|
||||
return false;
|
||||
if(currentState.getGameStage()!= GameStages.RES_ACTIONS)
|
||||
{
|
||||
@@ -661,7 +671,7 @@ public class Game implements Serializable {
|
||||
{
|
||||
return false;
|
||||
}
|
||||
BuildingCard buildingCard = board.lowerListBuilding.get(cardIndex);
|
||||
BuildingCard buildingCard = board.getLowerListBuilding().get(cardIndex);
|
||||
if(currentState.getNLower() <1)
|
||||
return false;
|
||||
if(buildingCard.buy(player))
|
||||
@@ -788,7 +798,7 @@ public class Game implements Serializable {
|
||||
}
|
||||
|
||||
if (GameStages.OPT_CARD_E == currentState.getGameStage()) {
|
||||
Player optionalPlayer = OptionalCardQueue.poll();
|
||||
Player optionalPlayer = optionalCardQueue.poll();
|
||||
|
||||
if (optionalPlayer != null) {
|
||||
currentState.playerUpdate(optionalPlayer, null);
|
||||
@@ -821,7 +831,7 @@ public class Game implements Serializable {
|
||||
private synchronized void transitionToOptionalOrNextRound() {
|
||||
currentState.gameStageUpdate(GameStages.OPT_CARD_E);
|
||||
|
||||
OptionalCardQueue = new LinkedList<>();
|
||||
optionalCardQueue = new LinkedList<>();
|
||||
for (Player p :playersList) {
|
||||
long count = p.getBuildingCards().stream().filter(x -> x.getEffectId() == 12).count();
|
||||
if (count > 0) {
|
||||
@@ -829,11 +839,11 @@ public class Game implements Serializable {
|
||||
{
|
||||
continue;
|
||||
}
|
||||
OptionalCardQueue.add(p);
|
||||
optionalCardQueue.add(p);
|
||||
}
|
||||
}
|
||||
|
||||
Player optionalPlayer = OptionalCardQueue.poll();
|
||||
Player optionalPlayer = optionalCardQueue.poll();
|
||||
|
||||
if (optionalPlayer != null) {
|
||||
currentState.playerUpdate(optionalPlayer, null);
|
||||
@@ -847,8 +857,7 @@ public class Game implements Serializable {
|
||||
orderLogicCard.pushNoEffect(entry.getKey());
|
||||
disconnectedPlayers.remove(entry.getKey());
|
||||
} else {
|
||||
orderLogicCard.players.removeIf(x -> x.equals(entry.getKey()));
|
||||
orderLogicCard.playerList.removeIf(x -> x.player.equals(entry.getKey()));
|
||||
orderLogicCard.removeFromQueue(entry.getKey());
|
||||
}
|
||||
}
|
||||
currentState.playerUpdate(orderLogicCard.pull(), null);
|
||||
@@ -927,7 +936,7 @@ public class Game implements Serializable {
|
||||
*/
|
||||
private void endGame() {
|
||||
Queue<EventCard> events;
|
||||
events=Stream.concat(board.lowerListTribe.stream().filter(TribeCard::isEventCard),board.upperListTribe.stream().filter(TribeCard::isEventCard)).map(x->((EventCard)x)).collect(Collectors.toCollection(LinkedList::new));
|
||||
events=Stream.concat(board.getLowerListTribe().stream().filter(TribeCard::isEventCard),board.getUpperListTribe().stream().filter(TribeCard::isEventCard)).map(x->((EventCard)x)).collect(Collectors.toCollection(LinkedList::new));
|
||||
ArrayList<EventCard>sustenance=events.stream().filter(x->x.getType().equals(EventType.SUSTENANCE)).collect(Collectors.toCollection(ArrayList::new));
|
||||
events.removeAll(sustenance);
|
||||
events.forEach(event->event.activateEvent(playersList));
|
||||
@@ -985,7 +994,7 @@ public class Game implements Serializable {
|
||||
|
||||
currentState = new CurrentState();
|
||||
playersList = new ArrayList<>();
|
||||
OptionalCardQueue = new LinkedList<>();
|
||||
optionalCardQueue = new LinkedList<>();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -29,20 +29,48 @@ public class Board implements Serializable {
|
||||
* The upper row of tribe cards. It contains a total of
|
||||
* {@code nTotem + 4} tribe cards, which may include both character and event cards.
|
||||
*/
|
||||
public List<TribeCard> upperListTribe;
|
||||
private List<TribeCard> upperListTribe;
|
||||
|
||||
/**
|
||||
* The lower row of the tribe card. During the first round, there will be (num. of players + 1) character cards.
|
||||
* During the following rounds, lower row will be emptied and populated with upper row's cards.
|
||||
* When an Event card gets in the lower row, the event effect will be activated at the end of the round.
|
||||
*/
|
||||
public List<TribeCard> lowerListTribe;
|
||||
private List<TribeCard> lowerListTribe;
|
||||
|
||||
/** Contains all the building cards of the upper list. When a new era starts, all its building cards are placed here */
|
||||
public List<BuildingCard> upperListBuilding;
|
||||
/** Contains all the building cards of the upper list. When a new era starts, all its building cards are placed here. */
|
||||
private List<BuildingCard> upperListBuilding;
|
||||
|
||||
/** Contains all the building cards of the lower list. When a new era starts, the old era's buildings are moved from the upper to the lower list */
|
||||
public List<BuildingCard> lowerListBuilding;
|
||||
/** Contains all the building cards of the lower list. When a new era starts, the old era's buildings are moved from the upper to the lower list. */
|
||||
private List<BuildingCard> lowerListBuilding;
|
||||
|
||||
/**
|
||||
* Returns the upper row of tribe cards.
|
||||
*
|
||||
* @return the live upper tribe card list.
|
||||
*/
|
||||
public List<TribeCard> getUpperListTribe() { return upperListTribe; }
|
||||
|
||||
/**
|
||||
* Returns the lower row of tribe cards.
|
||||
*
|
||||
* @return the live lower tribe card list.
|
||||
*/
|
||||
public List<TribeCard> getLowerListTribe() { return lowerListTribe; }
|
||||
|
||||
/**
|
||||
* Returns the upper row of building cards.
|
||||
*
|
||||
* @return the live upper building card list.
|
||||
*/
|
||||
public List<BuildingCard> getUpperListBuilding() { return upperListBuilding; }
|
||||
|
||||
/**
|
||||
* Returns the lower row of building cards.
|
||||
*
|
||||
* @return the live lower building card list.
|
||||
*/
|
||||
public List<BuildingCard> getLowerListBuilding() { return lowerListBuilding; }
|
||||
|
||||
|
||||
private final ArrayList<List<BuildingCard>> buildingCardsAllEras;
|
||||
@@ -244,6 +272,7 @@ public class Board implements Serializable {
|
||||
|
||||
for(int i=0;i<nTotem+4;i++)
|
||||
{
|
||||
if (tribeDeck.isEmpty()) break;
|
||||
TribeCard tempCard = tribeDeck.remove();
|
||||
if(tempCard.getEra()!=era)
|
||||
{
|
||||
|
||||
@@ -151,10 +151,10 @@ public class CurrentState implements Serializable {
|
||||
/**
|
||||
* Updates the current game stage.
|
||||
*
|
||||
* @param GameStage the new game stage.
|
||||
* @param stage the new game stage.
|
||||
*/
|
||||
public void gameStageUpdate(GameStages gameStage){
|
||||
this.gameStage = gameStage;
|
||||
public void gameStageUpdate(GameStages stage){
|
||||
this.gameStage = stage;
|
||||
}
|
||||
// endregion setters
|
||||
|
||||
@@ -179,12 +179,12 @@ public class CurrentState implements Serializable {
|
||||
// region Functions
|
||||
|
||||
/**
|
||||
* Updates the current player and slot.
|
||||
* If the specified slot is {@code null}, the numbers of upper and lower cards are both set to 0.
|
||||
* Otherwise, the numbers of upper and lower cards are updated using the values of the specified slot.
|
||||
* Updates the current player, slot, and available draws.
|
||||
* If {@code slot} is {@code null}, both {@link #nUpper} and {@link #nLower} are reset to 0.
|
||||
* Otherwise they are set from the slot's values.
|
||||
*
|
||||
* @param player the new current player.
|
||||
* @param slot the new current slot.
|
||||
* @param slot the new current slot, or {@code null} when no slot is active.
|
||||
*/
|
||||
public void playerUpdate(Player player, Slot slot){
|
||||
this.player = player;
|
||||
|
||||
@@ -36,7 +36,7 @@ public enum GameStages {
|
||||
RES_EVENT("Event"),
|
||||
|
||||
/**
|
||||
* Stage in which end-of-round or end-of-game operations are processed.
|
||||
* Stage in which end-of-game scoring and ranking are computed.
|
||||
*/
|
||||
ENDING("Ending"),
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
package it.polimi.ingsw.gc14.Model;
|
||||
|
||||
|
||||
/** Standalone entry point used for local model testing. */
|
||||
public class Main {
|
||||
/** @param args unused. */
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,7 @@ public class MiniModel implements Serializable {
|
||||
this.slotPlayerMap = slotPlayerMap;
|
||||
this.orderLogicCard = orderLogicCard;
|
||||
this.currentState = currentState;
|
||||
this.players = new HashMap<>();
|
||||
this.players = new LinkedHashMap<>();
|
||||
this.availableTotems = availableTotems;
|
||||
this.standingPlayers = new ArrayList<>();
|
||||
this.upperListTribeCards = upperListTribeCards;
|
||||
|
||||
@@ -20,12 +20,22 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
/**
|
||||
* The queue of {@link Player Players} associated with this order logic card.
|
||||
*/
|
||||
public Queue<Player> players;
|
||||
private Queue<Player> players;
|
||||
|
||||
/**
|
||||
* The list of {@link Player Players} associated with this order logic card.
|
||||
* The list of {@link OrderPlayer} entries tracking turn order and played status.
|
||||
* Protected so subclasses can read it for display purposes (e.g., {@link #toString()}).
|
||||
*/
|
||||
public List<OrderPlayer> playerList;
|
||||
protected List<OrderPlayer> playerList;
|
||||
|
||||
/**
|
||||
* Returns an unmodifiable view of the player order list.
|
||||
*
|
||||
* @return the list of {@link OrderPlayer} entries in turn order.
|
||||
*/
|
||||
public List<OrderPlayer> getPlayerList() {
|
||||
return Collections.unmodifiableList(playerList);
|
||||
}
|
||||
|
||||
/** Total number of players in this game. */
|
||||
protected final int nPlayers;
|
||||
@@ -33,15 +43,19 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
|
||||
/**
|
||||
* Creates an order logic card with the specified list of players.
|
||||
* The input list is shuffled before being inserted into the queue.
|
||||
*
|
||||
* <p>The input list is shuffled in place to establish a random initial turn order.
|
||||
* This is intentional: the caller's list (typically {@code Game.playersList}) is
|
||||
* reordered so that the game's canonical player sequence reflects the randomised order.
|
||||
*
|
||||
* @param players the list of players associated with this order logic card.
|
||||
* <strong>The list is mutated (shuffled) by this constructor.</strong>
|
||||
*/
|
||||
public OrderLogicCard(ArrayList<Player> players) {
|
||||
Collections.shuffle(players);
|
||||
this.players = new LinkedList<>(players);
|
||||
nPlayers = players.size();
|
||||
this.playerList=new ArrayList<>(players.stream().map(x->new OrderPlayer(x,false)).toList());
|
||||
this.playerList = new ArrayList<>(players.stream().map(x -> new OrderPlayer(x, false)).toList());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -50,16 +64,13 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
*
|
||||
* @param player the player to be pushed into the queue.
|
||||
*/
|
||||
public void push(Player player){
|
||||
effect(player,players.size());
|
||||
if(players.size()==0)
|
||||
{
|
||||
public void push(Player player) {
|
||||
effect(player, players.size());
|
||||
if (players.size() == 0) {
|
||||
playerList.clear();
|
||||
}
|
||||
playerList.add(new OrderPlayer(player,false));
|
||||
playerList.add(new OrderPlayer(player, false));
|
||||
players.add(player);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,10 +81,10 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
*
|
||||
* @param player the player to be pushed into the queue.
|
||||
*/
|
||||
public void pushNoEffect(Player player){
|
||||
players.removeIf(x->player.getUserName().equals(x.getUserName()));
|
||||
playerList.removeIf(x->player.getUserName().equals(x.player.getUserName()));
|
||||
playerList.add(new OrderPlayer(player,false));
|
||||
public void pushNoEffect(Player player) {
|
||||
players.removeIf(x -> player.getUserName().equals(x.getUserName()));
|
||||
playerList.removeIf(x -> player.getUserName().equals(x.getPlayer().getUserName()));
|
||||
playerList.add(new OrderPlayer(player, false));
|
||||
players.add(player);
|
||||
}
|
||||
|
||||
@@ -85,11 +96,10 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
*
|
||||
* @return the first player in the queue, or {@code null} if the queue is empty.
|
||||
*/
|
||||
public Player pull(){
|
||||
for(OrderPlayer p:playerList){
|
||||
if(p.played==false)
|
||||
{
|
||||
p.played=true;
|
||||
public Player pull() {
|
||||
for (OrderPlayer p : playerList) {
|
||||
if (!p.isPlayed()) {
|
||||
p.markAsPlayed();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -122,10 +132,30 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
*
|
||||
* @param player the player to whom the building effect is applied.
|
||||
*/
|
||||
protected void buildingEffect(Player player)
|
||||
{
|
||||
for(BuildingCard b : player.getBuildingCards().stream().filter(x->x.getEffectId()==3).toList())
|
||||
player.addFood(1);
|
||||
protected void buildingEffect(Player player) {
|
||||
long count = player.getBuildingCards().stream().filter(x -> x.getEffectId() == 3).count();
|
||||
player.addFood((int) count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the given player is currently present in the turn queue.
|
||||
*
|
||||
* @param player the player to look up.
|
||||
* @return {@code true} if the player is in the queue; {@code false} otherwise.
|
||||
*/
|
||||
public boolean containsInQueue(Player player) {
|
||||
return players.contains(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given player from both the turn queue and the order list.
|
||||
* No-op if the player is not present.
|
||||
*
|
||||
* @param player the player to remove.
|
||||
*/
|
||||
public void removeFromQueue(Player player) {
|
||||
players.removeIf(x -> x.equals(player));
|
||||
playerList.removeIf(x -> x.getPlayer().equals(player));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -137,11 +167,10 @@ public abstract class OrderLogicCard implements Serializable {
|
||||
* username is present in the order list.
|
||||
* @see Player
|
||||
*/
|
||||
public int getPosition(String username)
|
||||
{
|
||||
public int getPosition(String username) {
|
||||
int pos = 0;
|
||||
for (OrderPlayer p : playerList) {
|
||||
if (p.player.getUserName().equals(username))
|
||||
if (p.getPlayer().getUserName().equals(username))
|
||||
return pos;
|
||||
pos++;
|
||||
}
|
||||
|
||||
@@ -70,10 +70,10 @@ public class Order2 extends OrderLogicCard {
|
||||
for(int i=0;i<2;i++)
|
||||
{
|
||||
try {
|
||||
if(playerList.get(i).played)
|
||||
if(playerList.get(i).isPlayed())
|
||||
stringUp.add("");
|
||||
else
|
||||
stringUp.add(playerList.get(i).player.getTotem() != null ? playerList.get(i).player.getTotem().toString() : playerList.get(i).player.getUserName());
|
||||
stringUp.add(playerList.get(i).getPlayer().getTotem() != null ? playerList.get(i).getPlayer().getTotem().toString() : playerList.get(i).getPlayer().getUserName());
|
||||
}
|
||||
catch (IndexOutOfBoundsException e) {
|
||||
stringUp.add("");
|
||||
|
||||
@@ -74,10 +74,10 @@ public class Order3 extends OrderLogicCard {
|
||||
for(int i=0;i<3;i++)
|
||||
{
|
||||
try {
|
||||
if(playerList.get(i).played)
|
||||
if(playerList.get(i).isPlayed())
|
||||
stringUp.add("");
|
||||
else
|
||||
stringUp.add(i + ". " + (playerList.get(i).player.getTotem() != null ? playerList.get(i).player.getTotem().toString() : playerList.get(i).player.getUserName()));
|
||||
stringUp.add(i + ". " + (playerList.get(i).getPlayer().getTotem() != null ? playerList.get(i).getPlayer().getTotem().toString() : playerList.get(i).getPlayer().getUserName()));
|
||||
}
|
||||
catch (IndexOutOfBoundsException e) {
|
||||
stringUp.add("");
|
||||
|
||||
@@ -80,10 +80,10 @@ public class Order4 extends OrderLogicCard {
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
try {
|
||||
if(playerList.get(i).played)
|
||||
if(playerList.get(i).isPlayed())
|
||||
stringUp.add("");
|
||||
else
|
||||
stringUp.add(i + ". " + (playerList.get(i).player.getTotem() != null ? playerList.get(i).player.getTotem().toString() : playerList.get(i).player.getUserName()));
|
||||
stringUp.add(i + ". " + (playerList.get(i).getPlayer().getTotem() != null ? playerList.get(i).getPlayer().getTotem().toString() : playerList.get(i).getPlayer().getUserName()));
|
||||
}
|
||||
catch (IndexOutOfBoundsException e) {
|
||||
stringUp.add("");
|
||||
|
||||
@@ -81,10 +81,10 @@ public class Order5 extends OrderLogicCard {
|
||||
for(int i=0;i<5;i++)
|
||||
{
|
||||
try {
|
||||
if(playerList.get(i).played)
|
||||
if(playerList.get(i).isPlayed())
|
||||
stringUp.add("");
|
||||
else
|
||||
stringUp.add(i + ". " + (playerList.get(i).player.getTotem() != null ? playerList.get(i).player.getTotem().toString() : playerList.get(i).player.getUserName()));
|
||||
stringUp.add(i + ". " + (playerList.get(i).getPlayer().getTotem() != null ? playerList.get(i).getPlayer().getTotem().toString() : playerList.get(i).getPlayer().getUserName()));
|
||||
}
|
||||
catch (IndexOutOfBoundsException e) {
|
||||
stringUp.add("");
|
||||
|
||||
@@ -15,12 +15,37 @@ public class OrderPlayer implements Serializable {
|
||||
/**
|
||||
* The player associated with this order entry.
|
||||
*/
|
||||
public Player player;
|
||||
private final Player player;
|
||||
|
||||
/**
|
||||
* Indicates whether the player has already played.
|
||||
*/
|
||||
public boolean played;
|
||||
private boolean played;
|
||||
|
||||
/**
|
||||
* Returns the player associated with this order entry.
|
||||
*
|
||||
* @return the player.
|
||||
*/
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the player has already played in this order sequence.
|
||||
*
|
||||
* @return {@code true} if the player has played; {@code false} otherwise.
|
||||
*/
|
||||
public boolean isPlayed() {
|
||||
return played;
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks this player as having played in the current order sequence.
|
||||
*/
|
||||
public void markAsPlayed() {
|
||||
this.played = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an order entry for the specified player.
|
||||
|
||||
@@ -39,13 +39,13 @@ public abstract class PlayableCard implements Serializable {
|
||||
/**
|
||||
* Creates a playable card with the specified era.
|
||||
*
|
||||
* @param Era the era of the playable card.
|
||||
* @throws IllegalArgumentException if {@code Era <= 0} or {@code Era >= 4}.
|
||||
* @param era the era of the playable card.
|
||||
* @throws IllegalArgumentException if {@code era <= 0} or {@code era >= 4}.
|
||||
*/
|
||||
public PlayableCard (int Era) throws IllegalArgumentException{
|
||||
idIMG="-1";
|
||||
if (Era>0 && Era<4) {
|
||||
this.era = Era;
|
||||
public PlayableCard(int era) throws IllegalArgumentException {
|
||||
idIMG = "-1";
|
||||
if (era > 0 && era < 4) {
|
||||
this.era = era;
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
@@ -55,22 +55,22 @@ public abstract class PlayableCard implements Serializable {
|
||||
* Creates a playable card with the specified image id and era.
|
||||
*
|
||||
* @param idIMG the image identifier of the playable card.
|
||||
* @param Era the era of the playable card.
|
||||
* @throws IllegalArgumentException if {@code Era <= 0} or {@code Era >= 4}.
|
||||
* @param era the era of the playable card.
|
||||
* @throws IllegalArgumentException if {@code era <= 0} or {@code era >= 4}.
|
||||
*/
|
||||
public PlayableCard (String idIMG,int Era) throws IllegalArgumentException{
|
||||
public PlayableCard(String idIMG, int era) throws IllegalArgumentException {
|
||||
this.idIMG = idIMG;
|
||||
if (Era>0 && Era<4) {
|
||||
this.era = Era;
|
||||
if (era > 0 && era < 4) {
|
||||
this.era = era;
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string representation of this playable card.
|
||||
* Returns a string representation of this playable card.
|
||||
*
|
||||
* @return the string representation of this playable card.
|
||||
* @return a string representation of this playable card.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
@@ -78,14 +78,11 @@ public abstract class PlayableCard implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a string representation of this {@code PlayableCard}. This specific variation is used in the {@code Game}'s
|
||||
* toString to print a more detailed version (in this specific case the two methods are equal).
|
||||
* @return {@code String} - a string representation of this {@code PlayableCard}.
|
||||
* @see it.polimi.ingsw.gc14.Model.Game Game
|
||||
* @see it.polimi.ingsw.gc14.Model.GamePackage.Board Board
|
||||
* Returns a compact string representation used when rendering the board in the TUI.
|
||||
*
|
||||
* @return a compact board representation of this card.
|
||||
*/
|
||||
public String toStringBoard()
|
||||
{
|
||||
public String toStringBoard() {
|
||||
return ":";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class Player implements Serializable {
|
||||
/**
|
||||
* The maximum length allowed for the username string.
|
||||
*/
|
||||
private static final int MAX_VALUE = 32;
|
||||
private static final int MAX_USERNAME_LENGTH = 32;
|
||||
|
||||
/**
|
||||
* Identifier for the {@code Player} when displaying the game through the GUI.
|
||||
@@ -135,11 +135,8 @@ public class Player implements Serializable {
|
||||
// region Setters
|
||||
|
||||
/**
|
||||
* Adds {@code Value} amount of {@code Food} to the Player.
|
||||
* @param value The amount of {@code Food} to be added.
|
||||
* Should be positive for expected results
|
||||
* (otherwise the method will subtract the absolute
|
||||
* value of {@code Value}).
|
||||
* Adds {@code value} amount of Food to the Player.
|
||||
* @param value The amount of Food to be added. Should be non-negative.
|
||||
* @see #foodValue
|
||||
*/
|
||||
public void addFood(int value){
|
||||
@@ -156,20 +153,15 @@ public class Player implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes {@code Value} amount of {@code Food} from the Player.
|
||||
* Note: {@link #foodValue} cannot be negative, so the method returns
|
||||
* {@code false} if {@code Value} is greater than the amount of {@code Food}
|
||||
* the Player possesses, and {@code true} otherwise.
|
||||
* Removes {@code value} amount of Food from the Player.
|
||||
* {@link #foodValue} cannot go negative: returns {@code false} if
|
||||
* {@code value} exceeds the current food and leaves the value unchanged.
|
||||
*
|
||||
* @param value The amount of {@code Food} to be removed.
|
||||
* Should be positive for expected results
|
||||
* (otherwise the method will add the absolute
|
||||
* value of {@code Value}).
|
||||
* @return {@code Boolean} - {@code true} if the Food is successfully removed,
|
||||
* {@code false} otherwise.
|
||||
* @param value The amount of Food to be removed. Should be non-negative.
|
||||
* @return {@code true} if the Food is successfully removed, {@code false} otherwise.
|
||||
* @see #foodValue
|
||||
*/
|
||||
public Boolean removeFood(int value){
|
||||
public boolean removeFood(int value){
|
||||
if(value > this.foodValue){
|
||||
return false;
|
||||
}
|
||||
@@ -178,28 +170,20 @@ public class Player implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Value} amount of {@code Prestige} to the Player.
|
||||
* @param value The amount of {@code Prestige} to be added.
|
||||
* Should be positive for expected results
|
||||
* (otherwise the method will subtract the absolute
|
||||
* value of {@code Value}).
|
||||
* Adds {@code value} amount of Prestige to the Player.
|
||||
* @param value The amount of Prestige to be added. Should be non-negative.
|
||||
* @see #prestigeValue
|
||||
*/
|
||||
public void addPrestige(int value){
|
||||
|
||||
this.prestigeValue += value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes {@code Value} amount of {@code Prestige} to the Player.
|
||||
* @param value The amount of {@code Prestige} to be removed.
|
||||
* Should be positive for expected results
|
||||
* (otherwise the method will add the absolute
|
||||
* value of {@code Value}).
|
||||
* Removes {@code value} amount of Prestige from the Player.
|
||||
* @param value The amount of Prestige to be removed. Should be non-negative.
|
||||
* @see #prestigeValue
|
||||
*/
|
||||
public void removePrestige(int value){
|
||||
|
||||
this.prestigeValue -= value;
|
||||
}
|
||||
|
||||
@@ -211,15 +195,15 @@ public class Player implements Serializable {
|
||||
* Constructor for the class {@code Player}. Each Player is uniquely identified by the {@link #userName}.
|
||||
*
|
||||
* @param userName Unique String identifier for a Player.
|
||||
* @throws IllegalArgumentException when {@code UserName} is empty or exceeds {@link #MAX_VALUE},
|
||||
* @throws IllegalArgumentException when {@code userName} is empty or exceeds {@link #MAX_USERNAME_LENGTH},
|
||||
* with message:
|
||||
* <pre>{@code UserName is empty or exceeds maximum permitted length.}</pre>
|
||||
*
|
||||
* @see #userName
|
||||
* @see #MAX_VALUE
|
||||
* @see #MAX_USERNAME_LENGTH
|
||||
*/
|
||||
public Player(String userName) throws IllegalArgumentException {
|
||||
if(userName.isEmpty() || userName.length() > MAX_VALUE) {
|
||||
if(userName.isEmpty() || userName.length() > MAX_USERNAME_LENGTH) {
|
||||
throw new IllegalArgumentException("UserName is empty or exceeds maximum permitted length.");
|
||||
}
|
||||
this.userName = userName;
|
||||
|
||||
@@ -80,9 +80,6 @@ public class Slot implements Serializable {
|
||||
}
|
||||
// End getters
|
||||
|
||||
// Setters
|
||||
// End setters
|
||||
|
||||
// Constructors
|
||||
|
||||
/**
|
||||
@@ -157,15 +154,15 @@ public class Slot implements Serializable {
|
||||
|
||||
|
||||
/**
|
||||
* Prints a string representation of this {@code Slot}. This specific variation is used in the {@code Game}'s
|
||||
* toString to print a more detailed version for the TUI implementation.
|
||||
* <p>includes:
|
||||
* <li>{@link #slotId SlotId}
|
||||
* <li>{@link #NUpper NUpper}
|
||||
* <li>{@link #NLower NLower}
|
||||
* <li>{@link #Food Food}
|
||||
* </p>
|
||||
* @return {@code String} - a string representation of this {@code Slot}.
|
||||
* Returns a compact string representation of this {@code Slot} for the TUI.
|
||||
* <p>Includes:
|
||||
* <ul>
|
||||
* <li>{@link #slotId}</li>
|
||||
* <li>{@link #nUpper} (shown as ▲ symbols)</li>
|
||||
* <li>{@link #nLower} (shown as ▼ symbols)</li>
|
||||
* <li>{@link #food} (if non-zero)</li>
|
||||
* </ul>
|
||||
* @return a compact TUI string representation of this {@code Slot}.
|
||||
* @see it.polimi.ingsw.gc14.Model.Game Game
|
||||
* @see it.polimi.ingsw.gc14.Model.GamePackage.Board Board
|
||||
*/
|
||||
@@ -179,8 +176,6 @@ public class Slot implements Serializable {
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
// End Constructors
|
||||
|
||||
// Functions
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user