From 1e5037378d1172a783b717c57486c295e46a251d Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Thu, 2 Apr 2026 17:10:52 +0200 Subject: [PATCH] Fix: PickOptionalCard --- .../java/it/polimi/ingsw/gc14/Model/Game.java | 122 ++++++++++-------- 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index 776825f..304c414 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -27,28 +27,21 @@ public class Game { private OrderLogicCard orderLogicCard; private Board board; + + public ListgetUpperListTribeCards() { + List cards = new ArrayList<>(); + board.upperListTribe.forEach(x->cards.add(x.clone())); + return cards; + } + public CurrentState getCurrentState() { + return currentState; + }; public Player getPlayerByIndex(int playerIndex) throws IndexOutOfBoundsException { if(playerIndex >= playersList.size()) throw new IndexOutOfBoundsException("Player index out of bounds"); return playersList.get(playerIndex); } - /* - public TribeCard getUpperTribeCardByIndex(int playerIndex) throws IndexOutOfBoundsException - { - } - public TribeCard getLowerTribeCardByIndex() - { - } - public BuildingCard getUpperBuildingCardByIndex(int playerIndex) throws IndexOutOfBoundsException - { - - } - public BuildingCard getLowerBuildingCardByIndex(int playerIndex) throws IndexOutOfBoundsException - { - - } - */ public int getNPlayers() { return nPlayers; @@ -69,14 +62,14 @@ public class Game { public boolean addPlayer(Player player) { if(currentState.getGameStage()!= GameStages.WAITING) return false; + if(playersList.contains(player)) + return false; playersList.add(player); - if(playersList.size()>=nPlayers) { init(); - return true; } - return false; + return true; } public void init() { @@ -99,7 +92,9 @@ public class Game { } //region Cotroller Methods - public boolean SlotChoice(Player player, Slot slot) { + public boolean SlotChoiceByIndex(Player player, int slotIndex) { + if(slotIndex<0 || slotIndex>=slotMap.size()) + return false; if(currentState.getGameStage()!= GameStages.SLOT_CHOICE) { return false; @@ -108,23 +103,21 @@ public class Game { { return false; } - - if(slotMap.get(slot)!=null) + Map.Entry slotPlayerEntry = new ArrayList<>(slotMap.entrySet()).get(slotIndex); + if(slotPlayerEntry.getValue()!=null) { return false; } - if(!board.getSlotList().contains(slot)) - { - return false; - } - slotMap.put(slot,player); + slotMap.put(slotPlayerEntry.getKey(),player); nextPlayerSetup(); return true; } //region Drawing Methods - public boolean DrawUpperTribeCard(Player player,TribeCard tribeCard) { + public boolean DrawUpperTribeCardByIndex(Player player,int cardIndex) { + if( cardIndex<0 || cardIndex >=board.upperListTribe.size()) + return false; if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) { return false; @@ -133,11 +126,10 @@ public class Game { { return false; } - if(!board.containsUpperTribeCard(tribeCard)) - return false; if(currentState.getNUpper() <1) return false; - if(!tribeCard.IsEventCard()) + TribeCard tribeCard = board.upperListTribe.get(cardIndex); + if(tribeCard.IsEventCard()) return false; Character tempCard = (Character) tribeCard; @@ -149,7 +141,9 @@ public class Game { return true; } - public boolean DrawLowerTribeCard(Player player,TribeCard tribeCard) { + public boolean DrawLowerTribeCardByIndex(Player player, int cardIndex) { + if( cardIndex<0 || cardIndex >=board.lowerListTribe.size()) + return false; if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) { return false; @@ -158,10 +152,11 @@ public class Game { { return false; } - if(!board.containsLowerTribeCard(tribeCard)) - return false; + + if(currentState.getNLower() <1) return false; + TribeCard tribeCard = board.lowerListTribe.get(cardIndex); if(!tribeCard.IsEventCard()) return false; @@ -175,7 +170,9 @@ public class Game { } - public boolean DrawUpperBuildingCard(Player player,BuildingCard buildingCard) { + public boolean DrawUpperBuildingCardByIndex(Player player,int cardIndex) { + if( cardIndex<0 || cardIndex >=board.upperListBuilding.size()) + return false; if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) { return false; @@ -184,10 +181,7 @@ public class Game { { return false; } - if(!board.containsUpperBuildingCard(buildingCard)) - { - return false; - } + BuildingCard buildingCard = board.upperListBuilding.get(cardIndex); if(currentState.getNUpper() <1) return false; if(buildingCard.buy(player)) @@ -202,19 +196,19 @@ public class Game { return true; } - public boolean DrawLowerBuildingCard(Player player,BuildingCard buildingCard) { + public boolean DrawLowerBuildingCardByIndex(Player player,int cardIndex) { + if( cardIndex<0 || cardIndex >=board.lowerListBuilding.size()) + return false; if(currentState.getGameStage()!= GameStages.RESOLVING_ACTIONS) { return false; } + if(!player.equals(currentState.getCurrentPlayer())) { return false; } - if(!board.containsLowerBuildingCard(buildingCard)) - { - return false; - } + BuildingCard buildingCard = board.lowerListBuilding.get(cardIndex); if(currentState.getNLower() <1) return false; if(buildingCard.buy(player)) @@ -234,7 +228,6 @@ public class Game { //endregion //region Optional Card Methods - // TODO fare mappa per contare più volte lo stesso player public boolean PickOptionalTribeCard(Player player,TribeCard tribeCard) { if(currentState.getGameStage() != GameStages.OPTIONAL_CARD_EFFECT){ return false; @@ -242,7 +235,7 @@ public class Game { if(!player.equals(currentState.getCurrentPlayer())){ return false; } - if(!board.containsUpperTribeCard(tribeCard)){ + if(!board.upperListTribe.contains(tribeCard)){ return false; } if(tribeCard.IsEventCard()){ @@ -262,7 +255,7 @@ public class Game { if(!player.equals(currentState.getCurrentPlayer())){ return false; } - if(!board.containsUpperBuildingCard(buildingCard)){ + if(!board.upperListBuilding.contains(buildingCard)){ return false; } if(buildingCard.buy(player)) { @@ -283,6 +276,8 @@ public class Game { if(!player.equals(currentState.getCurrentPlayer())){ return false; } + OptionalCardQueue.removeIf(x->x.equals(player)); + nextPlayerSetup(); return true; } //endregion @@ -291,11 +286,21 @@ public class Game { private void nextPlayerSetup() { if(GameStages.SLOT_CHOICE==currentState.getGameStage()) { - currentState.PlayerUpdate(orderLogicCard.pull(), null); - if(currentState.getCurrentPlayer()==null) - { - currentState.GameStageUpdate(GameStages.RESOLVING_ACTIONS); + Player tempPlayer = orderLogicCard.pull(); + + if(tempPlayer!=null) { + currentState.PlayerUpdate(tempPlayer, null); + return; } + currentState.GameStageUpdate(GameStages.RESOLVING_ACTIONS); + for (Map.Entry s : slotMap.entrySet()) { + if (s.getValue()!=null) { + currentState.PlayerUpdate(s.getValue(), s.getKey()); + return; + } + } + return; + } if(GameStages.RESOLVING_ACTIONS==currentState.getGameStage()) { orderLogicCard.push(currentState.getCurrentPlayer()); @@ -308,7 +313,19 @@ public class Game { if(slotMap.values().stream().allMatch(v -> v == null)) { currentState.GameStageUpdate(GameStages.OPTIONAL_CARD_EFFECT); - OptionalCardQueue=(playersList.stream().filter(x->x.buildingCards.stream().anyMatch(y->y.getEffectId()==12)).collect(Collectors.toCollection(LinkedList::new))); + HashMap optional=new LinkedHashMap<>(); + for (Player p : playersList) { + int tempCount=(int)p.buildingCards.stream().filter(x->x.getEffectId()==12).count(); + if(tempCount>0) + { + optional.put(p,tempCount); + } + } + OptionalCardQueue=new LinkedList<>(); + for(Map.Entry e : optional.entrySet()) + { + OptionalCardQueue.add(e.getKey()); + } currentState.PlayerUpdate(OptionalCardQueue.remove(), null); if(currentState.getCurrentPlayer()==null) { @@ -373,7 +390,6 @@ public class Game { } - // TODO pulire game ? private void endGame() { playersList.forEach( p -> p.buildingCards.stream().filter(x -> x.getEffectType() == EffectType.FINAL).