From: Stefan F. <ste...@us...> - 2010-05-26 19:49:06
|
Update of /cvsroot/rails/18xx/rails/game/specific/_18AL In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv2064/rails/game/specific/_18AL Modified Files: OperatingRound_18AL.java NamedTrainRevenueModifier.java Log Message: Added optimizing option for named trains in 18AL Index: OperatingRound_18AL.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/game/specific/_18AL/OperatingRound_18AL.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** OperatingRound_18AL.java 7 Oct 2009 19:00:38 -0000 1.7 --- OperatingRound_18AL.java 26 May 2010 19:48:57 -0000 1.8 *************** *** 18,22 **** @Override protected void setGameSpecificPossibleActions() { ! for (NameTrains stl : getSpecialProperties(NameTrains.class)) { List<TrainI> trains = --- 18,24 ---- @Override protected void setGameSpecificPossibleActions() { ! // if optimized no need to assign ! if (getGameOption("18ALOptimizeNamedTrains").equalsIgnoreCase("yes")) return; ! for (NameTrains stl : getSpecialProperties(NameTrains.class)) { List<TrainI> trains = Index: NamedTrainRevenueModifier.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/game/specific/_18AL/NamedTrainRevenueModifier.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** NamedTrainRevenueModifier.java 20 May 2010 19:57:01 -0000 1.1 --- NamedTrainRevenueModifier.java 26 May 2010 19:48:57 -0000 1.2 *************** *** 1,14 **** package rails.game.specific._18AL; import rails.algorithms.NetworkTrain; import rails.algorithms.NetworkVertex; import rails.algorithms.RevenueAdapter; import rails.algorithms.RevenueBonus; import rails.algorithms.RevenueStaticModifier; import rails.game.TrainI; ! public class NamedTrainRevenueModifier implements RevenueStaticModifier { public void modifyCalculator(RevenueAdapter revenueAdapter) { // 1. check all Trains for name Tokens --- 1,38 ---- package rails.game.specific._18AL; + import java.util.ArrayList; + import java.util.List; + import rails.algorithms.NetworkTrain; import rails.algorithms.NetworkVertex; import rails.algorithms.RevenueAdapter; import rails.algorithms.RevenueBonus; + import rails.algorithms.RevenueDynamicModifier; import rails.algorithms.RevenueStaticModifier; + import rails.algorithms.RevenueTrainRun; + import rails.game.ConfigurableComponentI; + import rails.game.ConfigurationException; + import rails.game.GameManagerI; import rails.game.TrainI; + import rails.util.Tag; ! public class NamedTrainRevenueModifier implements RevenueStaticModifier, RevenueDynamicModifier, ConfigurableComponentI { + private boolean dynamic; + private List<RevenueBonus> bonuses; + private int bonusMaximum; + + public void configureFromXML(Tag tag) throws ConfigurationException { + // do nothing + } + + public void finishConfiguration(GameManagerI parent) + throws ConfigurationException { + dynamic = parent.getGameOption("18ALOptimizeNamedTrains").equalsIgnoreCase("yes"); + } + public void modifyCalculator(RevenueAdapter revenueAdapter) { + // static modifier + if (dynamic) return; // 1. check all Trains for name Tokens *************** *** 29,31 **** --- 53,114 ---- } + public boolean prepareModifier(RevenueAdapter revenueAdapter) { + // dynamic modifier + if (!dynamic) return false; + + // 1. check if name trains special properties is available + List<NameTrains> sp = revenueAdapter.getCompany().getPortfolio().getSpecialProperties(NameTrains.class, false); + if (sp.isEmpty()) return false; + + // 2. prepare by defining the vertices + bonuses = new ArrayList<RevenueBonus>(); + bonusMaximum = 0; + // 3. there is only one special property in 18AL, thus get tokens from it + for (NamedTrainToken token:sp.get(0).getTokens()) { + RevenueBonus bonus = new RevenueBonus(token.getValue(), token.getLongName()); + // 4. define vertices + for (NetworkVertex vertex:NetworkVertex.getVerticesByHexes(revenueAdapter.getVertices(), token.getHexesToPass())) { + if (!vertex.isStation()) continue; + bonus.addVertex(vertex); + } + bonuses.add(bonus); + bonusMaximum += token.getValue(); + } + return true; + } + + public int predictionValue(RevenueAdapter revenueAdapter) { + return bonusMaximum; + } + + public int evaluationValue(RevenueAdapter revenueAdapter) { + List<RevenueTrainRun> runs = revenueAdapter.getCurrentRun(); + int bonusValue = 0; + // due to the geography each train can only score one bonus + for (RevenueBonus bonus:bonuses) { + for (RevenueTrainRun run:runs) { + if (run.getUniqueVertices().containsAll(bonus.getVertices())) { + bonusValue += bonus.getValue(); + continue; // each bonus can only be scored once + } + } + } + return bonusValue; + } + + public String prettyPrint(RevenueAdapter revenueAdapter) { + List<RevenueTrainRun> runs = revenueAdapter.getOptimalRun(); + StringBuffer prettyPrint = new StringBuffer(); + for (RevenueBonus bonus:bonuses) { + for (RevenueTrainRun run:runs) { + if (run.getUniqueVertices().containsAll(bonus.getVertices())) { + prettyPrint.append(bonus.getName() + ": " + bonus.getValue() + "\n"); + continue; // each bonus can only be scored once + } + } + } + return prettyPrint.toString(); + } + + } |