From bb4e89d48c10038f9d3b1026a44389017200d06b Mon Sep 17 00:00:00 2001 From: Marek Kurej Date: Tue, 7 Nov 2023 10:50:59 +0100 Subject: [PATCH 1/3] Save games should save pending purchase selections #11819 --- .../main/java/games/strategy/engine/data/GameData.java | 10 ++++++++++ .../java/games/strategy/triplea/ui/PurchasePanel.java | 9 ++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java b/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java index 980b6c362d..7daf1c087b 100644 --- a/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java +++ b/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java @@ -41,6 +41,7 @@ import org.triplea.io.IoUtils; import org.triplea.java.ObjectUtils; import org.triplea.java.RemoveOnNextMajorRelease; +import org.triplea.java.collections.IntegerMap; import org.triplea.map.description.file.MapDescriptionYaml; import org.triplea.map.game.notes.GameNotes; import org.triplea.util.Tuple; @@ -88,6 +89,7 @@ public class GameData implements Serializable, GameState { private final GameMap map = new GameMap(this); private final PlayerList playerList = new PlayerList(this); private final ProductionFrontierList productionFrontierList = new ProductionFrontierList(this); + private IntegerMap pendingProductionRules; private final ProductionRuleList productionRuleList = new ProductionRuleList(this); private final RepairFrontierList repairFrontierList = new RepairFrontierList(this); private final RepairRules repairRules = new RepairRules(this); @@ -241,6 +243,14 @@ public IDelegate getDelegate(final String name) { return delegates.get(name); } + public IntegerMap getPendingProductionRules() { + return pendingProductionRules; + } + + public void setPendingProductionRules(IntegerMap pendingProductionRules) { + this.pendingProductionRules = pendingProductionRules; + } + @Override public UnitHolder getUnitHolder(final String name, final String type) { switch (type) { diff --git a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java index aae3bd1f8e..067f6dadc2 100644 --- a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java +++ b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java @@ -61,6 +61,7 @@ public void actionPerformed(final ActionEvent e) { bid, purchase, getMap().getUiContext()); + data.setPendingProductionRules(purchase); purchasedUnits.setUnitsFromProductionRuleMap(purchase, player); if (purchase.totalValues() == 0) { purchasedLabel.setText(""); @@ -92,7 +93,12 @@ public void display(final GamePlayer gamePlayer) { if (keepCurrentPurchase) { keepCurrentPurchase = false; } else { - purchase = new IntegerMap<>(); + GameData gameData = getData(); + if (gameData.getPendingProductionRules() != null) { + purchase = gameData.getPendingProductionRules(); + } else { + purchase = new IntegerMap<>(); + } } SwingUtilities.invokeLater( () -> { @@ -191,6 +197,7 @@ public void performDone() { } } } + getData().setPendingProductionRules(null); release(); } From ce8268ae0e757d8d2a76525df47026b360597e80 Mon Sep 17 00:00:00 2001 From: Marek Kurej Date: Thu, 23 Nov 2023 22:46:49 +0100 Subject: [PATCH 2/3] implementation using PurchaseDelegate Signed-off-by: Marek Kurej --- .../games/strategy/engine/data/GameData.java | 16 ++++++--------- .../games/strategy/engine/data/GameState.java | 3 +++ .../triplea/delegate/PurchaseDelegate.java | 14 ++++++++++++- .../PurchaseExtendedDelegateState.java | 3 +++ .../strategy/triplea/ui/PurchasePanel.java | 20 +++++++++++-------- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java b/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java index 7daf1c087b..19ab59e60e 100644 --- a/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java +++ b/game-app/game-core/src/main/java/games/strategy/engine/data/GameData.java @@ -13,6 +13,7 @@ import games.strategy.triplea.TripleA; import games.strategy.triplea.delegate.AbstractMoveDelegate; import games.strategy.triplea.delegate.PoliticsDelegate; +import games.strategy.triplea.delegate.PurchaseDelegate; import games.strategy.triplea.delegate.TechTracker; import games.strategy.triplea.delegate.TechnologyDelegate; import games.strategy.triplea.delegate.battle.BattleDelegate; @@ -41,7 +42,6 @@ import org.triplea.io.IoUtils; import org.triplea.java.ObjectUtils; import org.triplea.java.RemoveOnNextMajorRelease; -import org.triplea.java.collections.IntegerMap; import org.triplea.map.description.file.MapDescriptionYaml; import org.triplea.map.game.notes.GameNotes; import org.triplea.util.Tuple; @@ -89,7 +89,6 @@ public class GameData implements Serializable, GameState { private final GameMap map = new GameMap(this); private final PlayerList playerList = new PlayerList(this); private final ProductionFrontierList productionFrontierList = new ProductionFrontierList(this); - private IntegerMap pendingProductionRules; private final ProductionRuleList productionRuleList = new ProductionRuleList(this); private final RepairFrontierList repairFrontierList = new RepairFrontierList(this); private final RepairRules repairRules = new RepairRules(this); @@ -243,14 +242,6 @@ public IDelegate getDelegate(final String name) { return delegates.get(name); } - public IntegerMap getPendingProductionRules() { - return pendingProductionRules; - } - - public void setPendingProductionRules(IntegerMap pendingProductionRules) { - this.pendingProductionRules = pendingProductionRules; - } - @Override public UnitHolder getUnitHolder(final String name, final String type) { switch (type) { @@ -500,6 +491,11 @@ public PoliticsDelegate getPoliticsDelegate() { return (PoliticsDelegate) findDelegate("politics"); } + @Override + public PurchaseDelegate getPurchaseDelegate() { + return (PurchaseDelegate) findDelegate("purchase"); + } + private IDelegate findDelegate(final String delegateName) { final IDelegate delegate = this.getDelegate(delegateName); if (delegate == null) { diff --git a/game-app/game-core/src/main/java/games/strategy/engine/data/GameState.java b/game-app/game-core/src/main/java/games/strategy/engine/data/GameState.java index 81125b73ea..511f2159a9 100644 --- a/game-app/game-core/src/main/java/games/strategy/engine/data/GameState.java +++ b/game-app/game-core/src/main/java/games/strategy/engine/data/GameState.java @@ -3,6 +3,7 @@ import games.strategy.engine.data.properties.GameProperties; import games.strategy.triplea.delegate.AbstractMoveDelegate; import games.strategy.triplea.delegate.PoliticsDelegate; +import games.strategy.triplea.delegate.PurchaseDelegate; import games.strategy.triplea.delegate.TechTracker; import games.strategy.triplea.delegate.TechnologyDelegate; import games.strategy.triplea.delegate.battle.BattleDelegate; @@ -70,6 +71,8 @@ public interface GameState { PoliticsDelegate getPoliticsDelegate(); + PurchaseDelegate getPurchaseDelegate(); + AbstractMoveDelegate getMoveDelegate(); TechnologyDelegate getTechDelegate(); diff --git a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java index 37c00bf65a..3983da93fe 100644 --- a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java +++ b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java @@ -52,6 +52,7 @@ public class PurchaseDelegate extends BaseTripleADelegate Comparator.comparing(o -> (UnitType) o.getAnyResultKey(), new UnitTypeComparator()); private boolean needToInitialize = true; + private IntegerMap pendingProductionRules; @Override public void start() { @@ -102,6 +103,7 @@ public void start() { @Override public void end() { super.end(); + pendingProductionRules = null; needToInitialize = true; } @@ -110,6 +112,7 @@ public Serializable saveState() { final PurchaseExtendedDelegateState state = new PurchaseExtendedDelegateState(); state.superState = super.saveState(); state.needToInitialize = needToInitialize; + state.pendingProductionRules = pendingProductionRules; return state; } @@ -118,6 +121,7 @@ public void loadState(final Serializable state) { final PurchaseExtendedDelegateState s = (PurchaseExtendedDelegateState) state; super.loadState(s.superState); needToInitialize = s.needToInitialize; + pendingProductionRules = s.pendingProductionRules; } @Override @@ -157,7 +161,7 @@ protected boolean canAfford(final IntegerMap costs, final GamePlayer p } @Override - public String purchase(final IntegerMap productionRules) { + public String purchase(final IntegerMap productionRules) { final IntegerMap costs = getCosts(productionRules); final IntegerMap results = getResults(productionRules); if (!canAfford(costs, player)) { @@ -382,6 +386,14 @@ protected String removeFromPlayer( return returnString.toString(); } + public IntegerMap getPendingProductionRules() { + return pendingProductionRules; + } + + public void setPendingProductionRules(IntegerMap pendingProductionRules) { + this.pendingProductionRules = pendingProductionRules; + } + @Override public void setHasPostedTurnSummary(final boolean hasPostedTurnSummary) { // nothing for now diff --git a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseExtendedDelegateState.java b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseExtendedDelegateState.java index a3bceed832..b81b73065a 100644 --- a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseExtendedDelegateState.java +++ b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseExtendedDelegateState.java @@ -1,6 +1,8 @@ package games.strategy.triplea.delegate; +import games.strategy.engine.data.ProductionRule; import java.io.Serializable; +import org.triplea.java.collections.IntegerMap; class PurchaseExtendedDelegateState implements Serializable { private static final long serialVersionUID = 2326864364534284490L; @@ -8,4 +10,5 @@ class PurchaseExtendedDelegateState implements Serializable { Serializable superState; // add other variables here: boolean needToInitialize; + IntegerMap pendingProductionRules; } diff --git a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java index 067f6dadc2..ae0edb40f7 100644 --- a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java +++ b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java @@ -11,6 +11,7 @@ import games.strategy.triplea.UnitUtils; import games.strategy.triplea.attachments.RulesAttachment; import games.strategy.triplea.delegate.Matches; +import games.strategy.triplea.delegate.PurchaseDelegate; import games.strategy.triplea.formatter.MyFormatter; import games.strategy.triplea.ui.panels.map.MapPanel; import games.strategy.triplea.util.UnitSeparator; @@ -53,6 +54,12 @@ public class PurchasePanel extends ActionPanel { public void actionPerformed(final ActionEvent e) { final GamePlayer player = getCurrentPlayer(); final GameData data = getData(); + final PurchaseDelegate purchaseDelegate = data.getPurchaseDelegate(); + + // load pending production from file it there is any + if (purchaseDelegate.getPendingProductionRules() != null) { + purchase = purchaseDelegate.getPendingProductionRules(); + } purchase = TabbedProductionPanel.getProduction( player, @@ -61,7 +68,10 @@ public void actionPerformed(final ActionEvent e) { bid, purchase, getMap().getUiContext()); - data.setPendingProductionRules(purchase); + + // keeping actualized pending production in purchase delegate for later saving game + purchaseDelegate.setPendingProductionRules(purchase); + purchasedUnits.setUnitsFromProductionRuleMap(purchase, player); if (purchase.totalValues() == 0) { purchasedLabel.setText(""); @@ -93,12 +103,7 @@ public void display(final GamePlayer gamePlayer) { if (keepCurrentPurchase) { keepCurrentPurchase = false; } else { - GameData gameData = getData(); - if (gameData.getPendingProductionRules() != null) { - purchase = gameData.getPendingProductionRules(); - } else { - purchase = new IntegerMap<>(); - } + purchase = new IntegerMap<>(); } SwingUtilities.invokeLater( () -> { @@ -197,7 +202,6 @@ public void performDone() { } } } - getData().setPendingProductionRules(null); release(); } From b7e31f0d48a73763cd5d2ed626a0f65fdf7481d1 Mon Sep 17 00:00:00 2001 From: Marek Kurej Date: Fri, 24 Nov 2023 09:01:58 +0100 Subject: [PATCH 3/3] fixing indent & comments Signed-off-by: Marek Kurej --- .../games/strategy/triplea/delegate/PurchaseDelegate.java | 2 +- .../java/games/strategy/triplea/ui/PurchasePanel.java | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java index 3983da93fe..407e3ddce9 100644 --- a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java +++ b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/PurchaseDelegate.java @@ -161,7 +161,7 @@ protected boolean canAfford(final IntegerMap costs, final GamePlayer p } @Override - public String purchase(final IntegerMap productionRules) { + public String purchase(final IntegerMap productionRules) { final IntegerMap costs = getCosts(productionRules); final IntegerMap results = getResults(productionRules); if (!canAfford(costs, player)) { diff --git a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java index ae0edb40f7..cdc6ab451b 100644 --- a/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java +++ b/game-app/game-headed/src/main/java/games/strategy/triplea/ui/PurchasePanel.java @@ -56,10 +56,8 @@ public void actionPerformed(final ActionEvent e) { final GameData data = getData(); final PurchaseDelegate purchaseDelegate = data.getPurchaseDelegate(); - // load pending production from file it there is any - if (purchaseDelegate.getPendingProductionRules() != null) { - purchase = purchaseDelegate.getPendingProductionRules(); - } + // Restore pending production that was loaded from the save game. + purchase = purchaseDelegate.getPendingProductionRules(); purchase = TabbedProductionPanel.getProduction( player, @@ -69,7 +67,7 @@ public void actionPerformed(final ActionEvent e) { purchase, getMap().getUiContext()); - // keeping actualized pending production in purchase delegate for later saving game + // Keeping actualized pending production in PurchaseDelegate for later saving game. purchaseDelegate.setPendingProductionRules(purchase); purchasedUnits.setUnitsFromProductionRuleMap(purchase, player);