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..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; @@ -490,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..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 @@ -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 @@ -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 aae3bd1f8e..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 @@ -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,10 @@ public class PurchasePanel extends ActionPanel { public void actionPerformed(final ActionEvent e) { final GamePlayer player = getCurrentPlayer(); final GameData data = getData(); + final PurchaseDelegate purchaseDelegate = data.getPurchaseDelegate(); + + // Restore pending production that was loaded from the save game. + purchase = purchaseDelegate.getPendingProductionRules(); purchase = TabbedProductionPanel.getProduction( player, @@ -61,6 +66,10 @@ public void actionPerformed(final ActionEvent e) { bid, purchase, getMap().getUiContext()); + + // Keeping actualized pending production in PurchaseDelegate for later saving game. + purchaseDelegate.setPendingProductionRules(purchase); + purchasedUnits.setUnitsFromProductionRuleMap(purchase, player); if (purchase.totalValues() == 0) { purchasedLabel.setText("");