From: <ev...@us...> - 2011-03-05 20:10:48
|
Revision: 1492 http://rails.svn.sourceforge.net/rails/?rev=1492&view=rev Author: evos Date: 2011-03-05 20:10:40 +0000 (Sat, 05 Mar 2011) Log Message: ----------- Implemented game "reload" (loading a file with a later stage of the *same* game) Modified Paths: -------------- trunk/18xx/LocalisedText.properties trunk/18xx/rails/game/Game.java trunk/18xx/rails/game/GameManager.java trunk/18xx/rails/game/StartRound_1830.java trunk/18xx/rails/game/action/BidStartItem.java trunk/18xx/rails/game/action/BuyBonusToken.java trunk/18xx/rails/game/action/BuyCertificate.java trunk/18xx/rails/game/action/BuyPrivate.java trunk/18xx/rails/game/action/BuyStartItem.java trunk/18xx/rails/game/action/BuyTrain.java trunk/18xx/rails/game/action/DiscardTrain.java trunk/18xx/rails/game/action/ExchangeTokens.java trunk/18xx/rails/game/action/GameAction.java trunk/18xx/rails/game/action/LayBaseToken.java trunk/18xx/rails/game/action/LayBonusToken.java trunk/18xx/rails/game/action/LayTile.java trunk/18xx/rails/game/action/LayToken.java trunk/18xx/rails/game/action/MergeCompanies.java trunk/18xx/rails/game/action/NullAction.java trunk/18xx/rails/game/action/PossibleAction.java trunk/18xx/rails/game/action/PossibleActions.java trunk/18xx/rails/game/action/ReachDestinations.java trunk/18xx/rails/game/action/RepayLoans.java trunk/18xx/rails/game/action/RequestTurn.java trunk/18xx/rails/game/action/SellShares.java trunk/18xx/rails/game/action/SetDividend.java trunk/18xx/rails/game/action/TakeLoans.java trunk/18xx/rails/game/action/UseSpecialProperty.java trunk/18xx/rails/game/correct/CashCorrectionAction.java trunk/18xx/rails/game/correct/ClosePrivate.java trunk/18xx/rails/game/correct/CorrectionModeAction.java trunk/18xx/rails/game/correct/MapCorrectionAction.java trunk/18xx/rails/game/correct/OperatingCost.java trunk/18xx/rails/game/specific/_1835/FoldIntoPrussian.java trunk/18xx/rails/game/specific/_18AL/AssignNamedTrains.java trunk/18xx/rails/ui/swing/GameUIManager.java trunk/18xx/rails/ui/swing/StatusWindow.java Removed Paths: ------------- trunk/18xx/rails/game/action/AssignNamedTrains.java trunk/18xx/rails/game/action/BuyOrBidStartItem.java trunk/18xx/rails/game/action/SetSharePrice.java Property Changed: ---------------- trunk/18xx/tiles/ Modified: trunk/18xx/LocalisedText.properties =================================================================== --- trunk/18xx/LocalisedText.properties 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/LocalisedText.properties 2011-03-05 20:10:40 UTC (rev 1492) @@ -498,6 +498,7 @@ REDO=Redo ReleasedFromEscrow={0} receives {1} released from bank escrow ReleasesTrains=Makes {0}-trains available for purchasing +Reload=Reload RemainingTiles=Remaining tiles RepayLoans=Repay loan(s) RepayLoan=Repay {0} loan(s) of {1} for {2} Modified: trunk/18xx/rails/game/Game.java =================================================================== --- trunk/18xx/rails/game/Game.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/Game.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -212,6 +212,7 @@ log.debug("Loading game from file " + filepath); String filename = filepath.replaceAll(".*[/\\\\]", ""); + /*--- Remember to keep GameManager.reload() in sync with this code! ---*/ try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( @@ -320,6 +321,7 @@ } ois.close(); + ois = null; gameManager.setReloading(false); gameManager.finishLoading(); Modified: trunk/18xx/rails/game/GameManager.java =================================================================== --- trunk/18xx/rails/game/GameManager.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/GameManager.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -920,6 +920,9 @@ case GameAction.SAVE: result = save(gameAction); break; + case GameAction.RELOAD: + result = reload(gameAction); + break; case GameAction.UNDO: moveStack.undoMoveSet(false); result = true; @@ -1111,6 +1114,128 @@ return result; } + @SuppressWarnings("unchecked") + protected boolean reload(GameAction reloadAction) { + + String filepath = reloadAction.getFilepath(); + log.info("Reloading game from file " + filepath); + String filename = filepath.replaceAll(".*[/\\\\]", ""); + + try { + ObjectInputStream ois = + new ObjectInputStream(new FileInputStream( + new File(filepath))); + + // See Game.load(). Here we don't do as much checking. */ + Object object = ois.readObject(); + if (object instanceof String) { + log.info("Reading Rails "+(String)object+" saved file "+filename); + object = ois.readObject(); + } else { + log.info("Reading Rails (pre-1.0.7) saved file "+filename); + } + if (object instanceof String) { + log.info("File was saved at "+(String)object); + object = ois.readObject(); + } + String name = (String) ois.readObject(); + log.debug("Saved game="+name); + Map<String, String> selectedGameOptions = + (Map<String, String>) ois.readObject(); + List<String> playerNames = (List<String>) ois.readObject(); + + log.debug("Starting to compare loaded actions"); + + List<PossibleAction> savedActions; + int numberOfActions = 0; + setReloading(true); + + Object actionObject = ois.readObject(); + if (actionObject instanceof List) { + // Old-style: one List of PossibleActions + savedActions = (List<PossibleAction>) actionObject; + numberOfActions = savedActions.size(); + } else { + // New style: separate PossibleActionsObjects, since Rails 1.3.1 + savedActions = new ArrayList<PossibleAction>(); + while (actionObject instanceof PossibleAction) { + savedActions.add((PossibleAction) actionObject); + numberOfActions++; + try { + actionObject = ois.readObject(); + } catch (EOFException e) { + break; + } + } + } + + // Check size + if (numberOfActions < executedActions.size()) { + DisplayBuffer.add(LocalText.getText("LoadFailed", + "loaded file has less actions than current game")); + return true; + } + + // Check action identity + int index = 0; + PossibleAction executedAction; + for (PossibleAction savedAction : savedActions) { + if (index < executedActions.size()) { + executedAction = executedActions.get(index); + if (!savedAction.equalsAsAction(executedAction)) { + DisplayBuffer.add(LocalText.getText("LoadFailed", + "loaded action \""+savedAction.toString() + +"\"<br> is not same as game action \""+executedAction.toString() + +"\"")); + return true; + } + } else { + if (index == executedActions.size()) { + log.info("Finished comparing old actions, starting to process new actions"); + } + // Found a new action: execute it + if (!processOnReload(savedAction)) { + log.error ("Reload interrupted"); + DisplayBuffer.add(LocalText.getText("LoadFailed", + " loaded action \""+savedAction.toString()+"\" is invalid")); + break; + } + } + index++; + } + + if (actionObject instanceof SortedMap) { + ReportBuffer.setCommentItems((SortedMap<Integer, String>) actionObject); + log.debug("Found sorted map"); + } else { + try { + object = ois.readObject(); + if (object instanceof SortedMap) { + ReportBuffer.setCommentItems((SortedMap<Integer, String>) object); + } + } catch (IOException e) { + // continue without comments, if any IOException occurs + // sometimes not only the EOF Exception is raised + // but also the java.io.StreamCorruptedException: invalid type code + } + } + + ois.close(); + ois = null; + + setReloading(false); + finishLoading(); + log.info("Reloading finished"); + + } catch (Exception e) { + log.error("Reload failed", e); + DisplayBuffer.add(LocalText.getText("LoadFailed", e.getMessage())); + return true; + } + + return true; + } + protected boolean export(GameAction exportAction) { String filename = exportAction.getFilepath(); Modified: trunk/18xx/rails/game/StartRound_1830.java =================================================================== --- trunk/18xx/rails/game/StartRound_1830.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/StartRound_1830.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -193,7 +193,7 @@ // Check item boolean validItem = false; for (StartItemAction activeItem : possibleActions.getType(StartItemAction.class)) { - if (bidItem.equals(activeItem)) { + if (bidItem.equalsAsOption(activeItem)) { validItem = true; break; } Deleted: trunk/18xx/rails/game/action/AssignNamedTrains.java =================================================================== --- trunk/18xx/rails/game/action/AssignNamedTrains.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/AssignNamedTrains.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -1,52 +0,0 @@ -package rails.game.action; - -import java.io.IOException; -import java.io.ObjectInputStream; - -import rails.game.special.SpecialProperty; -import rails.game.specific._18AL.NameTrains; -import rails.game.specific._18AL.NamedTrainToken; - -public class AssignNamedTrains extends PossibleAction { - - transient private NameTrains namedTrainsSpecialProperty; - private int namedTrainsSpecialPropertyId; - - private static final long serialVersionUID = 1L; - - public AssignNamedTrains(NameTrains namedTrainsSpecialProperty) { - this.namedTrainsSpecialProperty = namedTrainsSpecialProperty; - this.namedTrainsSpecialPropertyId = - namedTrainsSpecialProperty.getUniqueId(); - } - - @Override - public String toString() { - StringBuffer b = new StringBuffer("AssignNamedTrains "); - for (NamedTrainToken token : namedTrainsSpecialProperty.getTokens()) { - b.append(token.toString()).append(","); - } - b.deleteCharAt(b.length() - 1); - return b.toString(); - } - - /** Deserialize */ - private void readObject(ObjectInputStream in) throws IOException, - ClassNotFoundException { - - in.defaultReadObject(); - - if (namedTrainsSpecialPropertyId > 0) { - namedTrainsSpecialProperty = - (NameTrains) SpecialProperty.getByUniqueId(namedTrainsSpecialPropertyId); - } - } - - @Override - public boolean equals(PossibleAction pa) { - - return pa instanceof AssignNamedTrains - && ((AssignNamedTrains) pa).namedTrainsSpecialPropertyId == namedTrainsSpecialPropertyId; - } - -} Modified: trunk/18xx/rails/game/action/BidStartItem.java =================================================================== --- trunk/18xx/rails/game/action/BidStartItem.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BidStartItem.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -68,14 +68,21 @@ this.actualBid = actualBid; } - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BidStartItem)) return false; BidStartItem a = (BidStartItem) action; return a.startItem == startItem && a.itemIndex == itemIndex && a.minimumBid == minimumBid; } - public String toString() { + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof BidStartItem)) return false; + BidStartItem a = (BidStartItem) action; + return a.equalsAsOption(this) + && a.actualBid == actualBid; + } + + public String toString() { StringBuffer b = new StringBuffer(); b.append("BidStartItem ").append(startItemName).append(" minbid=").append( minimumBid).append(" selected=").append(selected).append( Modified: trunk/18xx/rails/game/action/BuyBonusToken.java =================================================================== --- trunk/18xx/rails/game/action/BuyBonusToken.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyBonusToken.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -90,7 +90,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BuyBonusToken)) return false; BuyBonusToken a = (BuyBonusToken) action; return a.privateCompany == privateCompany @@ -100,6 +100,10 @@ && a.locationString.equals(locationString); } + public boolean equalsAsAction(PossibleAction action) { + return action.equalsAsOption (this); + } + @Override public String toString() { return "BuyBonusToken " + privateCompanyName Modified: trunk/18xx/rails/game/action/BuyCertificate.java =================================================================== --- trunk/18xx/rails/game/action/BuyCertificate.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyCertificate.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -106,7 +106,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BuyCertificate)) return false; BuyCertificate a = (BuyCertificate) action; return a.certificate == certificate && a.from == from @@ -114,6 +114,14 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof BuyCertificate)) return false; + BuyCertificate a = (BuyCertificate) action; + return a.certificate == certificate && a.from == from + && a.price == price && a.numberBought == numberBought; + } + + @Override public String toString() { StringBuffer text = new StringBuffer(); text.append("BuyCertificate: "); Deleted: trunk/18xx/rails/game/action/BuyOrBidStartItem.java =================================================================== --- trunk/18xx/rails/game/action/BuyOrBidStartItem.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyOrBidStartItem.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -1,153 +0,0 @@ -/* $Header: /Users/blentz/rails_rcs/cvs/18xx/rails/game/action/BuyOrBidStartItem.java,v 1.11 2009/01/08 19:59:39 evos Exp $ - * - * Created on 17-Sep-2006 - * Change Log: - */ -package rails.game.action; - -import java.io.IOException; -import java.io.ObjectInputStream; - -import rails.game.PublicCompanyI; -import rails.game.StartItem; - -/** - * @author Erik Vos - */ -public class BuyOrBidStartItem extends PossibleAction { - - /* Server-provided fields */ - transient private StartItem startItem; - private String startItemName; - private boolean sharePriceToSet = false; - private String companyNeedingSharePrice = null; - /** Unused but retained to keep old saved files loadable */ - private int type; - - /* - * Status of the start item (buyable? biddable?) for the <i>current</i> - * player, taking into account the amount of cash of this player that is - * blocked by bids on other items. - */ - private int priceOrMinimumBid; - private int bidIncrement; - private int itemIndex; - - /* Client-provided fields */ - private int actualBid = 0; - private int sharePrice = 0; - - // Constants - public static final int BUY_IMMEDIATE = 1; - public static final int SELECT_AND_BUY = 2; - public static final int BID_IMMEDIATE = 3; - public static final int SELECT_AND_BID = 4; - public static final int SELECT_AND_BID_OR_PASS = 5; - public static final int SET_SHARE_PRICE = 6; - - public static final long serialVersionUID = 2L; - - /** - * - */ - public BuyOrBidStartItem(StartItem startItem, int priceOrMinimumBid, - int type) { - - super(); - this.startItem = startItem; - this.startItemName = startItem.getName(); - this.itemIndex = startItem.getIndex(); - this.priceOrMinimumBid = priceOrMinimumBid; - - PublicCompanyI company; - if ((company = startItem.needsPriceSetting()) != null) { - sharePriceToSet = true; - companyNeedingSharePrice = company.getName(); - } - } - - /** - * @return Returns the startItem. - */ - public StartItem getStartItem() { - return startItem; - } - - public int getItemIndex() { - return itemIndex; - } - - public int getBidIncrement() { - return bidIncrement; - } - - public void setBidIncrement(int bidIncrement) { - this.bidIncrement = bidIncrement; - } - - public int getActualBid() { - return actualBid; - } - - public void setActualBid(int actualBid) { - this.actualBid = actualBid; - } - - public int getSharePrice() { - return sharePrice; - } - - public void setSharePrice(int sharePrice) { - this.sharePrice = sharePrice; - } - - public boolean hasSharePriceToSet() { - return sharePriceToSet; - } - - public String getCompanyToSetPriceFor() { - return companyNeedingSharePrice; - } - - public int getPriceOrMinimumBid() { - return priceOrMinimumBid; - } - - @Override - public boolean equals(PossibleAction action) { - if (!(action instanceof BuyOrBidStartItem)) return false; - BuyOrBidStartItem a = (BuyOrBidStartItem) action; - return a.startItem == startItem && a.itemIndex == itemIndex - && a.type == type; - } - - @Override - public String toString() { - StringBuffer b = new StringBuffer(); - b.append("BuyOrBidStartItem ").append(startItemName).append(" status="); - b.append(startItem.getStatusName()); - - switch (startItem.getStatus()) { - case StartItem.BIDDABLE: - b.append(" minbid=").append(priceOrMinimumBid).append(" bid=").append( - actualBid); - break; - case StartItem.BUYABLE: - b.append(" price=").append(priceOrMinimumBid); - break; - case StartItem.NEEDS_SHARE_PRICE: - b.append(" startprice=").append(sharePrice); - break; - } - return b.toString(); - } - - private void readObject(ObjectInputStream in) throws IOException, - ClassNotFoundException { - - in.defaultReadObject(); - - startItem = StartItem.getByName(startItemName); - - } -} Modified: trunk/18xx/rails/game/action/BuyPrivate.java =================================================================== --- trunk/18xx/rails/game/action/BuyPrivate.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyPrivate.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -68,7 +68,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BuyPrivate)) return false; BuyPrivate a = (BuyPrivate) action; return a.privateCompany == privateCompany @@ -77,6 +77,14 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof BuyPrivate)) return false; + BuyPrivate a = (BuyPrivate) action; + return a.privateCompany == privateCompany + && a.price == price; + } + + @Override public String toString() { return "BuyPrivate " + privateCompany.getName() + " holder=" + privateCompany.getPortfolio().getName(); Modified: trunk/18xx/rails/game/action/BuyStartItem.java =================================================================== --- trunk/18xx/rails/game/action/BuyStartItem.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyStartItem.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -76,14 +76,21 @@ return companyNeedingSharePrice; } - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BuyStartItem)) return false; BuyStartItem a = (BuyStartItem) action; return a.startItem == startItem && a.itemIndex == itemIndex && a.price == price; } - public String toString() { + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof BuyStartItem)) return false; + BuyStartItem a = (BuyStartItem) action; + return a.equalsAsOption(this) + && a.associatedSharePrice == associatedSharePrice; + } + + public String toString() { StringBuffer b = new StringBuffer(); b.append("BuyStartItem ").append(startItemName).append(" price=").append( price).append(" selected=").append(selected); Modified: trunk/18xx/rails/game/action/BuyTrain.java =================================================================== --- trunk/18xx/rails/game/action/BuyTrain.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/BuyTrain.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -242,13 +242,21 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof BuyTrain)) return false; BuyTrain a = (BuyTrain) action; return a.getTrain() == getTrain() && a.from == from && a.fixedCost == fixedCost && a.trainsForExchange == trainsForExchange; } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof BuyTrain)) return false; + BuyTrain a = (BuyTrain) action; + return a.getTrain() == getTrain() && a.from == from && a.pricePaid == pricePaid + && a.addedCash == addedCash && a.exchangedTrainUniqueId.equals(exchangedTrainUniqueId); + } + /** Deserialize */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Modified: trunk/18xx/rails/game/action/DiscardTrain.java =================================================================== --- trunk/18xx/rails/game/action/DiscardTrain.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/DiscardTrain.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -84,12 +84,19 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof DiscardTrain)) return false; DiscardTrain a = (DiscardTrain) action; return a.ownedTrains == ownedTrains && a.company == company; } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof DiscardTrain)) return false; + DiscardTrain a = (DiscardTrain) action; + return a.discardedTrain == discardedTrain && a.company == company; + } + /** Deserialize */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Modified: trunk/18xx/rails/game/action/ExchangeTokens.java =================================================================== --- trunk/18xx/rails/game/action/ExchangeTokens.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/ExchangeTokens.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -71,12 +71,22 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof ExchangeTokens)) return false; ExchangeTokens a = (ExchangeTokens) action; return a.tokensToExchange == tokensToExchange && a.company == company; } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!action.equalsAsOption(this)) return false; + ExchangeTokens a = (ExchangeTokens) action; + for (int i=0; i<tokensToExchange.size(); i++) { + if (a.tokensToExchange.get(i).isSelected() != tokensToExchange.get(i).isSelected()) return false; + } + return true; + } + /** Deserialize */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Modified: trunk/18xx/rails/game/action/GameAction.java =================================================================== --- trunk/18xx/rails/game/action/GameAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/GameAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -10,16 +10,17 @@ public static final int FORCED_UNDO = 3; public static final int REDO = 4; public static final int EXPORT = 5; - public static final int MAX_MODE = 5; + public static final int RELOAD = 6; + public static final int MAX_MODE = 6; private String[] name = - new String[] { "Save", "Load", "Undo", "Undo!", "Redo", "Export" }; + new String[] { "Save", "Load", "Undo", "Undo!", "Redo", "Export", "Reload" }; // Server-side settings protected int mode = -1; // Client-side settings - protected String filepath; // Only applies to SAVE and LOAD + protected String filepath = null; // Only applies to SAVE, LOAD and RELOAD protected int moveStackIndex = -1; // target moveStackIndex, only for FORCED_UNDO and REDO public static final long serialVersionUID = 1L; @@ -50,12 +51,19 @@ return mode; } - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof GameAction)) return false; GameAction a = (GameAction) action; return a.mode == mode; } + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof GameAction)) return false; + GameAction a = (GameAction) action; + return a.mode == mode && ( + (a.filepath == null && filepath == null) || a.filepath.equals(filepath)); + } + public String toString() { return name[mode]; } Modified: trunk/18xx/rails/game/action/LayBaseToken.java =================================================================== --- trunk/18xx/rails/game/action/LayBaseToken.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/LayBaseToken.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -71,7 +71,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof LayBaseToken)) return false; LayBaseToken a = (LayBaseToken) action; return (a.locationNames == null && locationNames == null || a.locationNames.equals(locationNames)) @@ -81,6 +81,17 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof LayBaseToken)) return false; + LayBaseToken a = (LayBaseToken) action; + return a.chosenHex == chosenHex + && a.chosenStation == chosenStation + && a.type == type + && a.company == company + && a.specialProperty == specialProperty; + } + + @Override public String toString() { StringBuffer b = new StringBuffer("LayBaseToken "); if (chosenHex == null) { Modified: trunk/18xx/rails/game/action/LayBonusToken.java =================================================================== --- trunk/18xx/rails/game/action/LayBonusToken.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/LayBonusToken.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -44,7 +44,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof LayBonusToken)) return false; LayBonusToken a = (LayBonusToken) action; return (a.locationNames == null && locationNames == null || a.locationNames.equals(locationNames)) @@ -52,6 +52,14 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof LayBonusToken)) return false; + LayBonusToken a = (LayBonusToken) action; + return a.chosenHex == chosenHex + && a.company == company && a.specialProperty == specialProperty; + } + + @Override public String toString() { StringBuffer b = new StringBuffer("LayBonusToken "); if (chosenHex == null) { Modified: trunk/18xx/rails/game/action/LayTile.java =================================================================== --- trunk/18xx/rails/game/action/LayTile.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/LayTile.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -233,16 +233,27 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof LayTile)) return false; LayTile a = (LayTile) action; return (a.locationNames == null && locationNames == null || a.locationNames.equals(locationNames)) && a.type == type && a.tileColours == tileColours - && a.tiles == tiles && a.specialProperty == specialProperty; + && a.tiles == tiles + && a.specialProperty == specialProperty; } @Override + public boolean equalsAsAction (PossibleAction action) { + if (!(action instanceof LayTile)) return false; + LayTile a = (LayTile) action; + return (a.laidTileId == laidTileId + && a.chosenHexName.equals(chosenHexName) + && a.orientation == orientation + && a.relaidBaseTokensString.equals(relaidBaseTokensString)); + } + + @Override public String toString() { StringBuffer b = new StringBuffer("LayTile"); if (laidTile == null) { Modified: trunk/18xx/rails/game/action/LayToken.java =================================================================== --- trunk/18xx/rails/game/action/LayToken.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/LayToken.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -92,19 +92,6 @@ // TODO this.specialPropertyUniqueId = specialProperty.getUniqueId(); } - /** - * @deprecated - * @return Returns the location. - */ - @Deprecated - public MapHex getLocation() { - if (locations != null) { - return locations.get(0); - } else { - return null; - } - } - public List<MapHex> getLocations() { return locations; } Modified: trunk/18xx/rails/game/action/MergeCompanies.java =================================================================== --- trunk/18xx/rails/game/action/MergeCompanies.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/MergeCompanies.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -100,7 +100,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof MergeCompanies)) return false; MergeCompanies a = (MergeCompanies) action; return a.mergingCompanyName.equals(mergingCompanyName) @@ -108,6 +108,15 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof MergeCompanies)) return false; + MergeCompanies a = (MergeCompanies) action; + return a.mergingCompanyName.equals(mergingCompanyName) + && a.selectedTargetCompanyName.equals(selectedTargetCompanyName) + && a.replaceToken == replaceToken; + } + + @Override public String toString() { StringBuffer text = new StringBuffer(); text.append("MergeCompanies: ").append(mergingCompanyName).append( Modified: trunk/18xx/rails/game/action/NullAction.java =================================================================== --- trunk/18xx/rails/game/action/NullAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/NullAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -37,13 +37,18 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof NullAction)) return false; NullAction a = (NullAction) action; return a.mode == mode; } @Override + public boolean equalsAsAction(PossibleAction action) { + return equalsAsOption(action); + } + + @Override public String toString() { if (optionalLabel != null) return optionalLabel; return name[mode]; Modified: trunk/18xx/rails/game/action/PossibleAction.java =================================================================== --- trunk/18xx/rails/game/action/PossibleAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/PossibleAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -72,8 +72,34 @@ this.acted = true; } - public abstract boolean equals(PossibleAction pa); + /** + * Compare the choice options of two action objects, without regard to whatever choice has been made, if any. + * In other words: only the server-set (prior) attributes must be compared. + * <p>This method is used by the server (engine) to validate + * the incoming action that has actually been chosen in the client (GUI), + * but only for the purpose to check if the chosen option was really on offer, + * not to check if the chosen action is actually valid. + * These perspectives could give different results in cases where + * 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 abstract boolean equalsAsOption (PossibleAction pa); + /** + * Compare the chosen actions of two action objects. + * In other words: the client-set (posterior) attributes must be compared, + * in addition to those server-set (prior) attributes that sufficiently identify the action. + * <p>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 abstract boolean equalsAsAction (PossibleAction pa); + protected GameManagerI getGameManager() { return GameManager.getInstance(); } Modified: trunk/18xx/rails/game/action/PossibleActions.java =================================================================== --- trunk/18xx/rails/game/action/PossibleActions.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/PossibleActions.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -96,16 +96,17 @@ /** Check if a given action exists in the current list of possible actions */ public boolean validate(PossibleAction checkedAction) { - // Save is always allowed + // Some actions are always allowed if (checkedAction instanceof GameAction && (((GameAction)checkedAction).getMode() == GameAction.SAVE - || ((GameAction)checkedAction).getMode() == GameAction.EXPORT)) { + || ((GameAction)checkedAction).getMode() == GameAction.RELOAD + || ((GameAction)checkedAction).getMode() == GameAction.EXPORT)) { return true; } // Check if action accurs in the list of possible actions for (PossibleAction action : possibleActions) { - if (action.equals(checkedAction)) { + if (action.equalsAsOption(checkedAction)) { return true; } } Modified: trunk/18xx/rails/game/action/ReachDestinations.java =================================================================== --- trunk/18xx/rails/game/action/ReachDestinations.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/ReachDestinations.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -61,16 +61,22 @@ return reachedCompanies; } - - @Override - public boolean equals(PossibleAction pa) { + public boolean equalsAsOption(PossibleAction pa) { if (!(pa instanceof ReachDestinations)) return false; ReachDestinations rd = (ReachDestinations) pa; return possibleCompanyNames.equals(rd.getPossibleCompanyNames()); } - @Override + @Override + public boolean equalsAsAction(PossibleAction pa) { + if (!(pa instanceof ReachDestinations)) return false; + ReachDestinations rd = (ReachDestinations) pa; + return possibleCompanyNames.equals(rd.possibleCompanyNames) + && reachedCompanyNames.equals(rd.reachedCompanyNames); + } + + @Override public String toString() { StringBuffer text = new StringBuffer(); text.append("ReachDestinations: ").append(possibleCompanyNames); Modified: trunk/18xx/rails/game/action/RepayLoans.java =================================================================== --- trunk/18xx/rails/game/action/RepayLoans.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/RepayLoans.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -78,7 +78,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof RepayLoans)) return false; RepayLoans a = (RepayLoans) action; return a.company == company @@ -88,6 +88,15 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof RepayLoans)) return false; + RepayLoans a = (RepayLoans) action; + return a.company == company + && a.numberRepaid == numberRepaid + && a.price == price; + } + + @Override public String toString() { StringBuffer b = new StringBuffer(); b.append ("RepayLoans ").append(company.getName()) Modified: trunk/18xx/rails/game/action/RequestTurn.java =================================================================== --- trunk/18xx/rails/game/action/RequestTurn.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/RequestTurn.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -24,12 +24,16 @@ } @Override - public boolean equals(PossibleAction pa) { + public boolean equalsAsOption(PossibleAction pa) { return pa != null && pa instanceof RequestTurn && requestingPlayerName.equals(((RequestTurn)pa).requestingPlayerName); } + public boolean equalsAsAction(PossibleAction pa) { + return equalsAsOption (pa); + } + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Modified: trunk/18xx/rails/game/action/SellShares.java =================================================================== --- trunk/18xx/rails/game/action/SellShares.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/SellShares.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -91,7 +91,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof SellShares)) return false; SellShares a = (SellShares) action; return a.getCompanyName().equals(companyName) @@ -101,6 +101,16 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof SellShares)) return false; + SellShares a = (SellShares) action; + return a.companyName.equals(companyName) + && a.shareUnits == shareUnits + && a.numberSold == numberSold + && a.price == price; + } + + @Override public String toString() { return "SellShares: " + (numberSold > 0 ? numberSold : "max " + maximumNumber) Modified: trunk/18xx/rails/game/action/SetDividend.java =================================================================== --- trunk/18xx/rails/game/action/SetDividend.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/SetDividend.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -148,7 +148,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof SetDividend)) return false; SetDividend a = (SetDividend) action; return a.company == company @@ -160,6 +160,15 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof SetDividend)) return false; + SetDividend a = (SetDividend) action; + return a.company == company + && a.actualRevenue == actualRevenue + && a.revenueAllocation == revenueAllocation; + } + + @Override public String toString() { StringBuffer b = new StringBuffer(); b.append(getClass().getSimpleName()).append(": ").append(company.getName()); Deleted: trunk/18xx/rails/game/action/SetSharePrice.java =================================================================== --- trunk/18xx/rails/game/action/SetSharePrice.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/SetSharePrice.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -1,75 +0,0 @@ -/* $Header: /Users/blentz/rails_rcs/cvs/18xx/rails/game/action/SetSharePrice.java,v 1.2 2008/06/04 19:00:29 evos Exp $ - * - * Created on 17-Sep-2006 - * Change Log: - */ -package rails.game.action; - -import rails.game.PublicCompanyI; -import rails.game.StartItem; - -/** - * @author Erik Vos - */ -public class SetSharePrice extends StartItemAction { - - /* Server-provided fields */ - private boolean sharePriceToSet = false; - private String companyNeedingSharePrice = null; - - // Client-provided fields - private int associatedSharePrice; - - public static final long serialVersionUID = 1L; - - /** - * - */ - public SetSharePrice(StartItem startItem) { - - super(startItem); - - PublicCompanyI company; - if ((company = startItem.needsPriceSetting()) != null) { - sharePriceToSet = true; - companyNeedingSharePrice = company.getName(); - } - } - - public int getAssociatedSharePrice() { - return associatedSharePrice; - } - - public void setAssociatedSharePrice(int sharePrice) { - this.associatedSharePrice = sharePrice; - } - - public boolean hasSharePriceToSet() { - return sharePriceToSet; - } - - public String getCompanyToSetPriceFor() { - return companyNeedingSharePrice; - } - - /** @deprecated */ - public int getStatus() { - // if (startItem == null) return 0;//BAD - return startItem.getStatus(); - } - - public boolean equals(PossibleAction action) { - if (!(action instanceof SetSharePrice)) return false; - SetSharePrice a = (SetSharePrice) action; - return a.startItem == startItem && a.itemIndex == itemIndex; - } - - public String toString() { - StringBuffer b = new StringBuffer(); - b.append("SetSharePrice ").append(startItemName).append(" shareprice=").append( - associatedSharePrice).append( - " for company " + companyNeedingSharePrice); - return b.toString(); - } - -} Modified: trunk/18xx/rails/game/action/TakeLoans.java =================================================================== --- trunk/18xx/rails/game/action/TakeLoans.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/TakeLoans.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -66,7 +66,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof TakeLoans)) return false; TakeLoans a = (TakeLoans) action; return a.company == company @@ -75,6 +75,15 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof TakeLoans)) return false; + TakeLoans a = (TakeLoans) action; + return a.company == company + && a.numberTaken == numberTaken + && a.price == price; + } + + @Override public String toString() { StringBuffer b = new StringBuffer(); b.append ("TakeLoans ").append(company.getName()) Modified: trunk/18xx/rails/game/action/UseSpecialProperty.java =================================================================== --- trunk/18xx/rails/game/action/UseSpecialProperty.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/action/UseSpecialProperty.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -42,12 +42,16 @@ return specialProperty; } - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof UseSpecialProperty)) return false; UseSpecialProperty a = (UseSpecialProperty) action; return a.specialProperty == specialProperty; } + public boolean equalsAsAction(PossibleAction action) { + return action.equalsAsOption(this); + } + public String toString() { StringBuffer b = new StringBuffer("UseSpecialProperty: "); if (specialProperty != null) b.append(specialProperty); Modified: trunk/18xx/rails/game/correct/CashCorrectionAction.java =================================================================== --- trunk/18xx/rails/game/correct/CashCorrectionAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/correct/CashCorrectionAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -81,14 +81,24 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof CashCorrectionAction)) return false; CashCorrectionAction a = (CashCorrectionAction) action; return (a.correctCashHolder == this.correctCashHolder && a.maximumNegative == this.maximumNegative ); } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof CashCorrectionAction)) return false; + CashCorrectionAction a = (CashCorrectionAction) action; + return (a.correctCashHolder == this.correctCashHolder && + a.correctAmount == this.correctAmount + ); + } + + @Override public String toString() { StringBuffer b = new StringBuffer("CashCorrectionAction "); if (acted) { Modified: trunk/18xx/rails/game/correct/ClosePrivate.java =================================================================== --- trunk/18xx/rails/game/correct/ClosePrivate.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/correct/ClosePrivate.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -42,13 +42,18 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof ClosePrivate)) return false; ClosePrivate a = (ClosePrivate) action; return (a.privateCompany == this.privateCompany); } @Override + public boolean equalsAsAction(PossibleAction action) { + return action.equalsAsOption(this); + } + + @Override public String toString() { StringBuffer b = new StringBuffer("ClosePrivate"); if (!acted) { Modified: trunk/18xx/rails/game/correct/CorrectionModeAction.java =================================================================== --- trunk/18xx/rails/game/correct/CorrectionModeAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/correct/CorrectionModeAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -40,7 +40,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof CorrectionModeAction)) return false; CorrectionModeAction a = (CorrectionModeAction) action; return (a.correctionType.equals(this.correctionType) && @@ -48,6 +48,11 @@ } @Override + public boolean equalsAsAction(PossibleAction action) { + return action.equalsAsOption(this); + } + + @Override public String toString() { StringBuffer b = new StringBuffer("CorrectionModeAction"); if (!acted) { Modified: trunk/18xx/rails/game/correct/MapCorrectionAction.java =================================================================== --- trunk/18xx/rails/game/correct/MapCorrectionAction.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/correct/MapCorrectionAction.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -2,8 +2,7 @@ import java.io.IOException; import java.io.ObjectInputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import rails.game.correct.MapCorrectionManager.*; import rails.game.BaseToken; @@ -177,13 +176,23 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof MapCorrectionAction)) return false; MapCorrectionAction a = (MapCorrectionAction) action; return (a.step == this.step); } @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof MapCorrectionAction)) return false; + MapCorrectionAction a = (MapCorrectionAction) action; + return (a.step == this.step + && a.location == location + && a.tiles.get(0) == tiles.get(0)) + && a.orientation == orientation; + } + + @Override public String toString(){ StringBuffer b = new StringBuffer("MapCorrectionAction"); if (acted) { Modified: trunk/18xx/rails/game/correct/OperatingCost.java =================================================================== --- trunk/18xx/rails/game/correct/OperatingCost.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/correct/OperatingCost.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -74,7 +74,7 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof OperatingCost)) return false; OperatingCost a = (OperatingCost) action; return (a.company == this.company && @@ -83,7 +83,18 @@ a.maximumCost == this.maximumCost ); } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof OperatingCost)) return false; + OperatingCost a = (OperatingCost) action; + return (a.company == this.company && + a.operatingCostType == this.operatingCostType && + a.operatingCost == this.operatingCost + ); + } + + @Override public String toString() { StringBuffer b = new StringBuffer("OperatingCost"); if (!acted) { Modified: trunk/18xx/rails/game/specific/_1835/FoldIntoPrussian.java =================================================================== --- trunk/18xx/rails/game/specific/_1835/FoldIntoPrussian.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/specific/_1835/FoldIntoPrussian.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -70,12 +70,18 @@ } @Override - public boolean equals(PossibleAction action) { + public boolean equalsAsOption(PossibleAction action) { if (!(action instanceof FoldIntoPrussian)) return false; FoldIntoPrussian a = (FoldIntoPrussian) action; return a.foldableCompanyNames.equals(foldableCompanyNames); } + @Override + public boolean equalsAsAction(PossibleAction action) { + if (!(action instanceof FoldIntoPrussian)) return false; + FoldIntoPrussian a = (FoldIntoPrussian) action; + return a.equalsAsOption(this) && a.foldedCompanyNames.equals(foldedCompanyNames); + } /** Deserialize */ private void readObject(ObjectInputStream in) throws IOException, Modified: trunk/18xx/rails/game/specific/_18AL/AssignNamedTrains.java =================================================================== --- trunk/18xx/rails/game/specific/_18AL/AssignNamedTrains.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/game/specific/_18AL/AssignNamedTrains.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -2,11 +2,10 @@ import java.io.IOException; import java.io.ObjectInputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import rails.game.*; -import rails.game.action.UseSpecialProperty; +import rails.game.action.*; public class AssignNamedTrains extends UseSpecialProperty { @@ -61,6 +60,12 @@ } } } + + public boolean equalsAsAction (PossibleAction action) { + if (!(action instanceof AssignNamedTrains)) return false; + AssignNamedTrains a = (AssignNamedTrains) action; + return Arrays.equals(a.postTrainIds, postTrainIds); + } @Override public String toMenu() { Modified: trunk/18xx/rails/ui/swing/GameUIManager.java =================================================================== --- trunk/18xx/rails/ui/swing/GameUIManager.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/ui/swing/GameUIManager.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -775,7 +775,23 @@ } - public void setSaveDirectory(String saveDirectory) { + public void reloadGame(GameAction reloadAction) { + + JFileChooser jfc = new JFileChooser(); + jfc.setCurrentDirectory(new File(saveDirectory)); + + if (jfc.showOpenDialog(statusWindow) == JFileChooser.APPROVE_OPTION) { + File selectedFile = jfc.getSelectedFile(); + saveDirectory = selectedFile.getParent(); + reloadAction.setFilepath(selectedFile.getPath()); + processOnServer(reloadAction); + } else { // cancel pressed + return; + } + + } + + public void setSaveDirectory(String saveDirectory) { this.saveDirectory = saveDirectory; } Modified: trunk/18xx/rails/ui/swing/StatusWindow.java =================================================================== --- trunk/18xx/rails/ui/swing/StatusWindow.java 2011-02-28 21:12:48 UTC (rev 1491) +++ trunk/18xx/rails/ui/swing/StatusWindow.java 2011-03-05 20:10:40 UTC (rev 1492) @@ -30,6 +30,8 @@ protected static final String SAVE_CMD = "Save"; + protected static final String RELOAD_CMD = "Reload"; + protected static final String EXPORT_CMD = "Export"; protected static final String UNDO_CMD = "Undo"; @@ -79,7 +81,7 @@ private JMenuItem menuItem; private ActionMenuItem saveItem; -// private ActionMenuItem exportItem; + private ActionMenuItem reloadItem; private ActionMenuItem undoItem, forcedUndoItem, redoItem, redoItem2; @@ -117,6 +119,16 @@ saveItem.setPossibleAction(new GameAction(GameAction.SAVE)); fileMenu.add(saveItem); + reloadItem = new ActionMenuItem(LocalText.getText("Reload")); + reloadItem.setActionCommand(RELOAD_CMD); + reloadItem.setMnemonic(KeyEvent.VK_R); + reloadItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, + ActionEvent.ALT_MASK)); + reloadItem.addActionListener(this); + reloadItem.setEnabled(true); + reloadItem.setPossibleAction(new GameAction(GameAction.RELOAD)); + fileMenu.add(reloadItem); + // export menu item // exportItem = new ActionMenuItem(LocalText.getText("EXPORT")); // exportItem.setActionCommand(EXPORT_CMD); @@ -630,6 +642,9 @@ case GameAction.SAVE: gameUIManager.saveGame((GameAction) executedAction); break; + case GameAction.RELOAD: + gameUIManager.reloadGame((GameAction) executedAction); + break; case GameAction.EXPORT: gameUIManager.exportGame((GameAction) executedAction); break; Property changes on: trunk/18xx/tiles ___________________________________________________________________ Modified: svn:ignore - Copy of TileDictionary.18t handmade TDwithID TDwoID xml tileimages.xml Copy (2) of TileDictionary.18t Copy (3) of TileDictionary.18t Rails18xx.ini UserGridStyle.ini UserTileStyle.ini *.exe o + Copy of TileDictionary.18t handmade TDwithID TDwoID xml tileimages.xml Copy (2) of TileDictionary.18t Copy (3) of TileDictionary.18t Rails18xx.ini UserGridStyle.ini UserTileStyle.ini *.exe o TDindex.pl TDindex.txt This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |