* Rails 2.0: Added updated equals and toString methods */ @@ -48,7 +48,7 @@ public abstract class PossibleAction implements ChangeAction, Serializable { // TODO: Replace this by a constructor argument for the player public PossibleAction(Activity activity) { - if ( activity == null ) { + if (activity == null) { return; } root = activity.getRoot(); @@ -57,7 +57,7 @@ public PossibleAction(Activity activity) { } public PossibleAction(RailsRoot root) { - if ( root == null ) { + if (root == null) { log.debug("missing root", new Exception()); return; } @@ -65,6 +65,10 @@ public PossibleAction(RailsRoot root) { setPlayer(); } + protected PossibleAction() { + // do nothing + } + public void setPlayer() { player = root.getPlayerManager().getCurrentPlayer(); if (player != null) { @@ -114,8 +118,8 @@ protected boolean equalsAs(PossibleAction pa, boolean asOption) { // check asOption attributes boolean options = Objects.equal(this.player, pa.player) - || pa instanceof NullAction // TODO: Old save files are sometimes wrong to assign Null Actions - ; + || pa instanceof NullAction // TODO: Old save files are sometimes wrong to assign Null Actions + ; // finish if asOptions check if (asOption) return options; @@ -135,10 +139,11 @@ protected boolean equalsAs(PossibleAction pa, boolean asOption) { * the PossibleAction does not fully restrict choices to valid values only * (such as the blanket LayTile that does no restrict the hex to lay a tile on, * or the SetDividend that will accept any revenue value). + * * @param pa Another PossibleAction to compare with. * @return True if the compared PossibleAction object has equal choice options. */ - public final boolean equalsAsOption (PossibleAction pa) { + public final boolean equalsAsOption(PossibleAction pa) { return equalsAs(pa, true); } @@ -149,10 +154,11 @@ public final boolean equalsAsOption (PossibleAction pa) { *
This method is used by the server (engine) to check if two action
* objects represent the same actual action, as is done when reloading a saved file
* (i.e. loading a later stage of the same game).
+ *
* @param pa Another PossibleAction to compare with.
* @return True if the compared PossibleAction object has equal selected action values.
*/
- public final boolean equalsAsAction (PossibleAction pa) {
+ public final boolean equalsAsAction(PossibleAction pa) {
return equalsAs(pa, false);
}
@@ -164,7 +170,7 @@ protected GameManager getGameManager() {
return root.getGameManager();
}
- protected CompanyManager getCompanyManager () {
+ protected CompanyManager getCompanyManager() {
return root.getCompanyManager();
}
@@ -179,7 +185,9 @@ public boolean isCorrection() {
return false;
}
- /** Default version of an Menu item text. To be overridden where useful. */
+ /**
+ * Default version of an Menu item text. To be overridden where useful.
+ */
public String toMenu() {
return toString();
}
@@ -198,8 +206,20 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- // inject RailsRoot for use by all subclasses during their own deserializing
- root = ((RailsObjectInputStream) in).getRoot();
+ if (in instanceof RailsObjectInputStream) {
+ // inject RailsRoot for use by all subclasses during their own deserializing
+ this.root = ((RailsObjectInputStream) in).getRoot();
+
+ if (playerName != null) {
+ player = root.getPlayerManager().getPlayerByName(playerName);
+ } else {
+ player = root.getPlayerManager().getPlayerByIndex(playerIndex);
+ }
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ this.root = root;
if (playerName != null) {
player = root.getPlayerManager().getPlayerByName(playerName);
@@ -207,5 +227,4 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE
player = root.getPlayerManager().getPlayerByIndex(playerIndex);
}
}
-
}
diff --git a/src/main/java/rails/game/action/PossibleActions.java b/src/main/java/rails/game/action/PossibleActions.java
index bd8ba0890..f175ef58a 100644
--- a/src/main/java/rails/game/action/PossibleActions.java
+++ b/src/main/java/rails/game/action/PossibleActions.java
@@ -89,7 +89,7 @@ public boolean validate(PossibleAction checkedAction) {
// Some actions are always allowed
if (checkedAction instanceof GameAction
- && EnumSet.of(GameAction.Mode.SAVE, GameAction.Mode.RELOAD, GameAction.Mode.EXPORT).contains(
+ && EnumSet.of(GameAction.Mode.XML_SAVE, GameAction.Mode.SAVE, GameAction.Mode.RELOAD, GameAction.Mode.EXPORT).contains(
((GameAction)checkedAction).getMode() )) {
return true;
}
diff --git a/src/main/java/rails/game/action/PossibleORAction.java b/src/main/java/rails/game/action/PossibleORAction.java
index 23850790a..52f8a1a75 100644
--- a/src/main/java/rails/game/action/PossibleORAction.java
+++ b/src/main/java/rails/game/action/PossibleORAction.java
@@ -9,6 +9,7 @@
import net.sf.rails.game.PublicCompany;
import net.sf.rails.game.RailsRoot;
import net.sf.rails.game.round.RoundFacade;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
import net.sf.rails.util.Util;
@@ -86,7 +87,17 @@ public String toString () {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- if (Util.hasValue(companyName))
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (Util.hasValue(companyName))
+ company = getCompanyManager().getPublicCompany(companyName);
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
+ if (Util.hasValue(companyName)) {
company = getCompanyManager().getPublicCompany(companyName);
+ }
}
}
diff --git a/src/main/java/rails/game/action/ReachDestinations.java b/src/main/java/rails/game/action/ReachDestinations.java
index cc85252bd..2e648dd85 100644
--- a/src/main/java/rails/game/action/ReachDestinations.java
+++ b/src/main/java/rails/game/action/ReachDestinations.java
@@ -5,6 +5,7 @@
import java.util.ArrayList;
import java.util.List;
+import net.sf.rails.util.GameLoader;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
@@ -96,12 +97,38 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ CompanyManager cmgr = getCompanyManager();
+
+ possibleCompanies = new ArrayList<>();
+ if (Util.hasValue(possibleCompanyNames)) {
+ for (String cname : possibleCompanyNames.split(",")) {
+ if (StringUtils.isNotBlank(cname)) {
+ possibleCompanies.add(cmgr.getPublicCompany(cname));
+ }
+ }
+ }
+
+ if (Util.hasValue(reachedCompanyNames)) {
+ reachedCompanies = new ArrayList<>();
+ for (String cname : reachedCompanyNames.split(",")) {
+ if (StringUtils.isNotBlank(cname)) {
+ reachedCompanies.add(cmgr.getPublicCompany(cname));
+ }
+ }
+ }
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
CompanyManager cmgr = getCompanyManager();
possibleCompanies = new ArrayList<>();
if (Util.hasValue(possibleCompanyNames)) {
for (String cname : possibleCompanyNames.split(",")) {
- if ( StringUtils.isNotBlank(cname) ) {
+ if (StringUtils.isNotBlank(cname)) {
possibleCompanies.add(cmgr.getPublicCompany(cname));
}
}
@@ -110,7 +137,7 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE
if (Util.hasValue(reachedCompanyNames)) {
reachedCompanies = new ArrayList<>();
for (String cname : reachedCompanyNames.split(",")) {
- if ( StringUtils.isNotBlank(cname) ) {
+ if (StringUtils.isNotBlank(cname)) {
reachedCompanies.add(cmgr.getPublicCompany(cname));
}
}
diff --git a/src/main/java/rails/game/action/RepayLoans.java b/src/main/java/rails/game/action/RepayLoans.java
index 19dd2585b..74fe852e8 100644
--- a/src/main/java/rails/game/action/RepayLoans.java
+++ b/src/main/java/rails/game/action/RepayLoans.java
@@ -6,6 +6,8 @@
import com.google.common.base.Objects;
import net.sf.rails.game.PublicCompany;
+import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
/**
@@ -114,6 +116,14 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ company = getCompanyManager().getPublicCompany(companyName);
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
company = getCompanyManager().getPublicCompany(companyName);
}
diff --git a/src/main/java/rails/game/action/SellShares.java b/src/main/java/rails/game/action/SellShares.java
index 7db59caf1..e268477ce 100644
--- a/src/main/java/rails/game/action/SellShares.java
+++ b/src/main/java/rails/game/action/SellShares.java
@@ -7,6 +7,8 @@
import net.sf.rails.game.CompanyManager;
import net.sf.rails.game.PublicCompany;
+import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
import net.sf.rails.util.Util;
@@ -135,17 +137,30 @@ public String toString() {
/** Deserialize */
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- // Custom reading for backwards compatibility
- ObjectInputStream.GetField fields = in.readFields();
-
- companyName = (String) fields.get("companyName", null);
- shareUnit = fields.get("shareUnit", shareUnit);
- shareUnits = fields.get("shareUnits", shareUnits);
- share = fields.get("share", share);
- price = fields.get("price", price);
- numberSold = fields.get("numberSold", 0); // For backwards compatibility
- number = fields.get("number", numberSold);
- presidentExchange = fields.get("presidentExchange", 0);
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ // Custom reading for backwards compatibility
+ ObjectInputStream.GetField fields = in.readFields();
+
+ companyName = (String) fields.get("companyName", null);
+ shareUnit = fields.get("shareUnit", shareUnit);
+ shareUnits = fields.get("shareUnits", shareUnits);
+ share = fields.get("share", share);
+ price = fields.get("price", price);
+ numberSold = fields.get("numberSold", 0); // For backwards compatibility
+ number = fields.get("number", numberSold);
+ presidentExchange = fields.get("presidentExchange", 0);
+
+ CompanyManager companyManager = getCompanyManager();
+ if (Util.hasValue(companyName))
+ companyName = companyManager.checkAlias(companyName);
+ company = companyManager.getPublicCompany(companyName);
+ } else {
+ in.defaultReadObject();
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
CompanyManager companyManager = getCompanyManager();
if (Util.hasValue(companyName))
diff --git a/src/main/java/rails/game/action/SetDividend.java b/src/main/java/rails/game/action/SetDividend.java
index d51766125..3b2413477 100644
--- a/src/main/java/rails/game/action/SetDividend.java
+++ b/src/main/java/rails/game/action/SetDividend.java
@@ -7,6 +7,7 @@
import com.google.common.base.Objects;
import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
import net.sf.rails.util.Util;
@@ -233,16 +234,28 @@ public String toString() {
/** Deserialize */
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- // Custom deserialization for backwards compatibility
- ObjectInputStream.GetField fields = in.readFields();
- presetRevenue = fields.get("presetRevenue", presetRevenue);
- presetCompanyTreasuryRevenue = fields.get("presetCompanyTreasuryRevenue", presetCompanyTreasuryRevenue);
- setMayUserSetRevenue(fields.get("mayUserSetRevenue", getMayUserSetRevenue()));
- setAllowedRevenueAllocations((int[]) fields.get("allowedRevenueAllocations", getAllowedRevenueAllocations()));
- requiredCash = fields.get("requiredCash", 0);
- actualRevenue = fields.get("actualRevenue", actualRevenue);
- actualCompanyTreasuryRevenue = fields.get("actualCompanyTreasuryRevenue", actualCompanyTreasuryRevenue);
- revenueAllocation = fields.get("revenueAllocation", revenueAllocation);
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ // Custom deserialization for backwards compatibility
+ ObjectInputStream.GetField fields = in.readFields();
+ presetRevenue = fields.get("presetRevenue", presetRevenue);
+ presetCompanyTreasuryRevenue = fields.get("presetCompanyTreasuryRevenue", presetCompanyTreasuryRevenue);
+ setMayUserSetRevenue(fields.get("mayUserSetRevenue", getMayUserSetRevenue()));
+ setAllowedRevenueAllocations((int[]) fields.get("allowedRevenueAllocations", getAllowedRevenueAllocations()));
+ requiredCash = fields.get("requiredCash", 0);
+ actualRevenue = fields.get("actualRevenue", actualRevenue);
+ actualCompanyTreasuryRevenue = fields.get("actualCompanyTreasuryRevenue", actualCompanyTreasuryRevenue);
+ revenueAllocation = fields.get("revenueAllocation", revenueAllocation);
+
+ if (Util.hasValue(companyName)) {
+ company = getCompanyManager().getPublicCompany(companyName);
+ }
+ } else {
+ in.defaultReadObject();
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
if (Util.hasValue(companyName)) {
company = getCompanyManager().getPublicCompany(companyName);
diff --git a/src/main/java/rails/game/action/StartItemAction.java b/src/main/java/rails/game/action/StartItemAction.java
index b794d5efa..ad640463a 100644
--- a/src/main/java/rails/game/action/StartItemAction.java
+++ b/src/main/java/rails/game/action/StartItemAction.java
@@ -7,6 +7,7 @@
import net.sf.rails.game.RailsRoot;
import net.sf.rails.game.StartItem;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
@@ -37,6 +38,10 @@ public StartItemAction (RailsRoot root) {
super (root);
}
+ protected StartItemAction() {
+ super();
+ }
+
/**
* @return Returns the startItem.
*/
@@ -78,6 +83,18 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- startItem = root.getCompanyManager().getStartItemById(startItemName);
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (root != null) {
+ startItem = root.getCompanyManager().getStartItemById(startItemName);
+ }
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
+ if (root != null) {
+ startItem = root.getCompanyManager().getStartItemById(startItemName);
+ }
}
}
diff --git a/src/main/java/rails/game/action/TakeLoans.java b/src/main/java/rails/game/action/TakeLoans.java
index 80f4418d2..680170b53 100644
--- a/src/main/java/rails/game/action/TakeLoans.java
+++ b/src/main/java/rails/game/action/TakeLoans.java
@@ -6,6 +6,8 @@
import com.google.common.base.Objects;
import net.sf.rails.game.PublicCompany;
+import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
/**
@@ -101,7 +103,14 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- company = getCompanyManager().getPublicCompany(companyName);
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ company = getCompanyManager().getPublicCompany(companyName);
+ }
}
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
+ company = getCompanyManager().getPublicCompany(companyName);
+ }
}
diff --git a/src/main/java/rails/game/action/UseSpecialProperty.java b/src/main/java/rails/game/action/UseSpecialProperty.java
index 9d321d0ed..15a444e8a 100644
--- a/src/main/java/rails/game/action/UseSpecialProperty.java
+++ b/src/main/java/rails/game/action/UseSpecialProperty.java
@@ -5,7 +5,9 @@
import com.google.common.base.Objects;
+import net.sf.rails.game.RailsRoot;
import net.sf.rails.game.special.SpecialProperty;
+import net.sf.rails.util.GameLoader;
import net.sf.rails.util.RailsObjects;
@@ -70,6 +72,16 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (specialPropertyId > 0) {
+ specialProperty = SpecialProperty.getByUniqueId(getRoot(), specialPropertyId);
+ }
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
if (specialPropertyId > 0) {
specialProperty = SpecialProperty.getByUniqueId(getRoot(), specialPropertyId);
}
diff --git a/src/main/java/rails/game/correct/CashCorrectionAction.java b/src/main/java/rails/game/correct/CashCorrectionAction.java
index 4dbb84eca..c31396122 100644
--- a/src/main/java/rails/game/correct/CashCorrectionAction.java
+++ b/src/main/java/rails/game/correct/CashCorrectionAction.java
@@ -7,6 +7,7 @@
import com.google.common.base.Objects;
import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import rails.game.action.PossibleAction;
import net.sf.rails.game.Player;
import net.sf.rails.game.PublicCompany;
@@ -125,6 +126,22 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (Util.hasValue(correctionName))
+ correctionType = CorrectionType.valueOf(correctionName);
+
+ if (Util.hasValue(cashHolderType) && Util.hasValue(cashHolderName)) {
+ if (cashHolderType.equals("Player"))
+ correctCashHolder = getGameManager().getRoot().getPlayerManager().getPlayerByName(cashHolderName);
+ else if (cashHolderType.equals("PublicCompany"))
+ correctCashHolder = getCompanyManager().getPublicCompany(cashHolderName);
+ }
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
if (Util.hasValue(correctionName))
correctionType = CorrectionType.valueOf(correctionName);
diff --git a/src/main/java/rails/game/correct/ClosePrivate.java b/src/main/java/rails/game/correct/ClosePrivate.java
index 26e6ed177..e9fe9dd10 100644
--- a/src/main/java/rails/game/correct/ClosePrivate.java
+++ b/src/main/java/rails/game/correct/ClosePrivate.java
@@ -5,6 +5,8 @@
import com.google.common.base.Objects;
+import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import rails.game.action.PossibleAction;
import net.sf.rails.game.PrivateCompany;
import net.sf.rails.util.RailsObjects;
@@ -72,7 +74,17 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- if (Util.hasValue(privateCompanyName))
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (Util.hasValue(privateCompanyName))
privateCompany = getCompanyManager().getPrivateCompany(privateCompanyName);
+ }
+ }
+
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
+ if (Util.hasValue(privateCompanyName)) {
+ privateCompany = getCompanyManager().getPrivateCompany(privateCompanyName);
+ }
}
}
diff --git a/src/main/java/rails/game/correct/CorrectionModeAction.java b/src/main/java/rails/game/correct/CorrectionModeAction.java
index fea32421d..ba82a3311 100644
--- a/src/main/java/rails/game/correct/CorrectionModeAction.java
+++ b/src/main/java/rails/game/correct/CorrectionModeAction.java
@@ -78,10 +78,19 @@ public String toString() {
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
- if (Util.hasValue(correctionName))
+ if (in instanceof GameLoader.RailsObjectInputStream) {
+ if (Util.hasValue(correctionName))
correctionType = CorrectionType.valueOf(correctionName);
+ }
}
+ public void applyRailsRoot(RailsRoot root) {
+ super.applyRailsRoot(root);
+
+ if (Util.hasValue(correctionName)) {
+ correctionType = CorrectionType.valueOf(correctionName);
+ }
+ }
// a version with enumsets:
// // pre-conditions
diff --git a/src/main/java/rails/game/correct/MapCorrectionAction.java b/src/main/java/rails/game/correct/MapCorrectionAction.java
index c1e93d517..87933f32c 100644
--- a/src/main/java/rails/game/correct/MapCorrectionAction.java
+++ b/src/main/java/rails/game/correct/MapCorrectionAction.java
@@ -7,6 +7,7 @@
import com.google.common.base.Objects;
import net.sf.rails.game.RailsRoot;
+import net.sf.rails.util.GameLoader;
import rails.game.action.PossibleAction;
import rails.game.correct.MapCorrectionManager.*;
import net.sf.rails.game.BaseToken;
@@ -29,10 +30,14 @@
@Deprecated
public class MapCorrectionAction extends CorrectionAction {
- /** The Constant serialVersionUID. */
+ /**
+ * The Constant serialVersionUID.
+ */
public static final long serialVersionUID = 1L;
- /** Sequence: Indicates the enrichment of the action */
+ /**
+ * Sequence: Indicates the enrichment of the action
+ */
private transient ActionStep step = null;
private String stepName;
@@ -41,20 +46,28 @@ public class MapCorrectionAction extends CorrectionAction {
/* Conditions */
- /** Location: where to lay the tile */
+ /**
+ * Location: where to lay the tile
+ */
private transient MapHex location = null;
private String locationCoordinates;
- /** Tiles: which tile(s) to lay */
+ /**
+ * Tiles: which tile(s) to lay
+ */
private transient List