From: Stefan F. <ste...@us...> - 2012-07-27 05:08:23
|
junit/rails/game/state/OwnableItemImpl.java | 2 junit/rails/game/state/PortfolioHolderImpl.java | 17 + junit/rails/game/state/PortfolioHolderTest.java | 51 +++ junit/rails/game/state/PortfolioListTest.java | 114 -------- junit/rails/game/state/PortfolioManagerTest.java | 6 junit/rails/game/state/PortfolioMapTest.java | 148 +++++++++++ junit/rails/game/state/PortfolioSetTest.java | 122 +++++++++ junit/rails/game/state/TypeOwnableItemImpl.java | 19 + src/rails/game/Company.java | 12 src/rails/game/GameManager.java | 2 src/rails/game/MapHex.java | 12 src/rails/game/OperatingRound.java | 8 src/rails/game/PublicCertificate.java | 8 src/rails/game/PublicCompany.java | 10 src/rails/game/Stop.java | 8 src/rails/game/Train.java | 5 src/rails/game/TrainManager.java | 6 src/rails/game/action/BuyTrain.java | 23 - src/rails/game/action/DiscardTrain.java | 26 - src/rails/game/model/BaseTokensModel.java | 14 - src/rails/game/model/CertificatesModel.java | 10 src/rails/game/model/PortfolioModel.java | 27 +- src/rails/game/model/PrivatesModel.java | 4 src/rails/game/model/TrainsModel.java | 9 src/rails/game/specific/_1835/OperatingRound_1835.java | 8 src/rails/game/specific/_1835/PrussianFormationRound.java | 16 - src/rails/game/specific/_1856/CGRFormationRound.java | 8 src/rails/game/specific/_1856/OperatingRound_1856.java | 4 src/rails/game/specific/_1856/PublicCompany_1856.java | 4 src/rails/game/specific/_1889/OperatingRound_1889.java | 8 src/rails/game/specific/_18AL/AssignNamedTrains.java | 2 src/rails/game/specific/_18AL/OperatingRound_18AL.java | 3 src/rails/game/specific/_18EU/OperatingRound_18EU.java | 3 src/rails/game/specific/_18TN/OperatingRound_18TN.java | 4 src/rails/game/state/HashMapState.java | 34 +- src/rails/game/state/Portfolio.java | 5 src/rails/game/state/PortfolioList.java | 72 ----- src/rails/game/state/PortfolioManager.java | 6 src/rails/game/state/PortfolioMap.java | 57 ++-- src/rails/game/state/PortfolioSet.java | 77 +++++ src/rails/game/state/Typable.java | 12 src/rails/ui/swing/GameUIManager.java | 9 src/rails/ui/swing/ORUIManager.java | 13 src/rails/ui/swing/gamespecific/_1835/StatusWindow_1835.java | 4 src/rails/ui/swing/gamespecific/_18EU/StatusWindow_18EU.java | 10 src/rails/ui/swing/hexmap/GUIHex.java | 14 - 46 files changed, 670 insertions(+), 366 deletions(-) New commits: commit 778be678fa5313cc552b4b801f4ead17b1991a21 Author: Stefan Frey <ste...@we...> Date: Fri Jul 27 07:07:39 2012 +0200 added PortfolioHolderTest diff --git a/junit/rails/game/state/PortfolioHolderImpl.java b/junit/rails/game/state/PortfolioHolderImpl.java new file mode 100644 index 0000000..4a7cb1a --- /dev/null +++ b/junit/rails/game/state/PortfolioHolderImpl.java @@ -0,0 +1,17 @@ +package rails.game.state; + +class PortfolioHolderImpl extends AbstractItem implements PortfolioHolder { + + private PortfolioHolderImpl(Owner parent, String id) { + super (parent, id); + } + + static PortfolioHolderImpl create(Owner parent, String id) { + return new PortfolioHolderImpl(parent, id); + } + + public Owner getParent() { + return (Owner)super.getParent(); + } +} + diff --git a/junit/rails/game/state/PortfolioHolderTest.java b/junit/rails/game/state/PortfolioHolderTest.java new file mode 100644 index 0000000..8f1fec5 --- /dev/null +++ b/junit/rails/game/state/PortfolioHolderTest.java @@ -0,0 +1,51 @@ +package rails.game.state; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class PortfolioHolderTest { + + private final static String PORTFOLIO_MAP_ID = "PortfolioMap"; + private final static String PORTFOLIO_SET_ID = "PortfolioSet"; + private final static String OWNER_ID = "Owner"; + private final static String HOLDER_ID = "Holder"; + + private final static String ITEM_ID = "Item"; + private final static String TYPE_ID = "Type"; + + private Root root; + private Owner owner; + private PortfolioHolder holder; + private TypeOwnableItemImpl item; + + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + owner = OwnerImpl.create(root, OWNER_ID); + holder = PortfolioHolderImpl.create(owner, HOLDER_ID); + + item = TypeOwnableItemImpl.create(root, ITEM_ID, TYPE_ID); + StateTestUtils.startActionChangeSet(root); + } + + @Test + public void testPortfolioMap() { + PortfolioMap<String, TypeOwnableItemImpl> portfolio = + PortfolioMap.create(holder, PORTFOLIO_MAP_ID , TypeOwnableItemImpl.class); + item.moveTo(owner); + assertTrue(portfolio.containsItem(item)); + assertSame(owner, item.getOwner()); + } + + @Test + public void testPortfolioSet() { + PortfolioSet<TypeOwnableItemImpl> portfolio = + PortfolioSet.create(holder, PORTFOLIO_SET_ID , TypeOwnableItemImpl.class); + item.moveTo(owner); + assertTrue(portfolio.containsItem(item)); + assertSame(owner, item.getOwner()); + } +} diff --git a/src/rails/game/state/HashMapState.java b/src/rails/game/state/HashMapState.java index b14a845..4fe22db 100644 --- a/src/rails/game/state/HashMapState.java +++ b/src/rails/game/state/HashMapState.java @@ -160,23 +160,23 @@ public final class HashMapState<K,V> extends State { return ImmutableList.copyOf(map.values()); } - public String getData() { - - if (map == null) return ""; - - StringBuilder buf = new StringBuilder("<html>"); - for (K name : map.keySet()) { - if (buf.length() > 6) buf.append("<br>"); - buf.append(name.toString()); - Object value = map.get(name); - if (value != null && rails.util.Util.hasValue(value.toString())) buf.append("=").append(value.toString()); - } - if (buf.length() > 6) { - buf.append("</html>"); - } - return buf.toString(); - - } +// public String getData() { +// +// if (map == null) return ""; +// +// StringBuilder buf = new StringBuilder("<html>"); +// for (K name : map.keySet()) { +// if (buf.length() > 6) buf.append("<br>"); +// buf.append(name.toString()); +// Object value = map.get(name); +// if (value != null && rails.util.Util.hasValue(value.toString())) buf.append("=").append(value.toString()); +// } +// if (buf.length() > 6) { +// buf.append("</html>"); +// } +// return buf.toString(); +// +// } @Override public String observerText() { commit 90a08542c1f46895322f86f440dc2b16209841d3 Author: Stefan Frey <ste...@we...> Date: Thu Jul 26 15:13:31 2012 +0200 refactored PortfolioMap and added Tests, introduced Typable interface diff --git a/junit/rails/game/state/OwnableItemImpl.java b/junit/rails/game/state/OwnableItemImpl.java index ca1d844..c095d66 100644 --- a/junit/rails/game/state/OwnableItemImpl.java +++ b/junit/rails/game/state/OwnableItemImpl.java @@ -5,7 +5,7 @@ package rails.game.state; */ class OwnableItemImpl extends OwnableItem<Ownable> { - private OwnableItemImpl(Item parent, String id) { + protected OwnableItemImpl(Item parent, String id) { super(parent, id, Ownable.class); } diff --git a/junit/rails/game/state/PortfolioListTest.java b/junit/rails/game/state/PortfolioListTest.java deleted file mode 100644 index b7c676f..0000000 --- a/junit/rails/game/state/PortfolioListTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package rails.game.state; - -import static org.fest.assertions.api.Assertions.assertThat; -import static org.junit.Assert.*; - -import java.util.Iterator; -import java.util.Set; - -import org.junit.Before; -import org.junit.Test; - -import com.google.common.collect.Sets; - -public class PortfolioListTest { - - private final static String PORTFOLIO_A_ID = "PortfolioA"; - private final static String PORTFOLIO_B_ID = "PortfolioB"; - private final static String OWNER_A_ID = "OwnerA"; - private final static String OWNER_B_ID = "OwnerB"; - private final static String ITEM_ID = "Item"; - private final static String ANOTHER_ITEM_ID = "AnotherItem"; - - private Root root; - private PortfolioList<Ownable> portfolioA; - private PortfolioList<Ownable> portfolioB; - private Owner ownerA; - private Owner ownerB; - private Ownable item; - private Ownable anotherItem; - - @Before - public void setUp() { - root = StateTestUtils.setUpRoot(); - ownerA = OwnerImpl.create(root, OWNER_A_ID); - ownerB = OwnerImpl.create(root, OWNER_B_ID); - portfolioA = PortfolioList.create(ownerA, PORTFOLIO_A_ID , Ownable.class); - portfolioB = PortfolioList.create(ownerB, PORTFOLIO_B_ID , Ownable.class); - item = OwnableItemImpl.create(root, ITEM_ID); - anotherItem = OwnableItemImpl.create(root, ANOTHER_ITEM_ID); - portfolioA.moveInto(item); - StateTestUtils.startActionChangeSet(root); - } - - // helper function to check the initial state after undo - // includes redo, so after returning the state should be unchanged - private void assertInitialStateAfterUndo() { - StateTestUtils.closeAndUndo(root); - assertTrue(portfolioA.containsItem(item)); - assertSame(ownerA, item.getOwner()); - StateTestUtils.redo(root); - } - - @Test - public void testMoveInto() { - // move item to B - item.moveTo(ownerB); - assertTrue(portfolioB.containsItem(item)); - assertSame(ownerB, item.getOwner()); - - // undo check - assertInitialStateAfterUndo(); - - // redo check - assertTrue(portfolioB.containsItem(item)); - assertSame(ownerB, item.getOwner()); - } - - @Test - public void testContainsItem() { - assertTrue(portfolioA.containsItem(item)); - assertFalse(portfolioB.containsItem(item)); - } - - @Test - public void testItems() { - assertThat(portfolioA.items()).containsOnly(item); - anotherItem.moveTo(ownerA); - assertThat(portfolioA.items()).containsOnly(item, anotherItem); - } - - @Test - public void testSize() { - assertEquals(1, portfolioA.size()); - assertEquals(0, portfolioB.size()); - anotherItem.moveTo(ownerA); - assertEquals(2, portfolioA.size()); - item.moveTo(ownerB); - assertEquals(1, portfolioA.size()); - assertEquals(1, portfolioB.size()); - } - - @Test - public void testIsEmpty() { - assertFalse(portfolioA.isEmpty()); - assertTrue(portfolioB.isEmpty()); - } - - @Test - public void testIterator() { - anotherItem.moveTo(ownerA); - - // no order is defined, so store them - Set<Ownable> iterated = Sets.newHashSet(); - - Iterator<Ownable> it = portfolioA.iterator(); - iterated.add(it.next()); - iterated.add(it.next()); - - assertThat(iterated).containsOnly(item, anotherItem); - // iterator is finished - assertFalse(it.hasNext()); - } - -} diff --git a/junit/rails/game/state/PortfolioManagerTest.java b/junit/rails/game/state/PortfolioManagerTest.java index 2a9e52d..7a4a889 100644 --- a/junit/rails/game/state/PortfolioManagerTest.java +++ b/junit/rails/game/state/PortfolioManagerTest.java @@ -15,7 +15,7 @@ public class PortfolioManagerTest { private Root root; private PortfolioManager pm; - private PortfolioList<Ownable> portfolioA, portfolioB; + private PortfolioSet<Ownable> portfolioA, portfolioB; private Owner ownerA, ownerB, ownerC; @Before @@ -25,8 +25,8 @@ public class PortfolioManagerTest { ownerA = OwnerImpl.create(root, OWNER_A_ID); ownerB = OwnerImpl.create(root, OWNER_B_ID); ownerC = OwnerImpl.create(root, OWNER_C_ID); - portfolioA = PortfolioList.create(ownerA, PORTFOLIO_A_ID , Ownable.class); - portfolioB = PortfolioList.create(ownerB, PORTFOLIO_B_ID , Ownable.class); + portfolioA = PortfolioSet.create(ownerA, PORTFOLIO_A_ID , Ownable.class); + portfolioB = PortfolioSet.create(ownerB, PORTFOLIO_B_ID , Ownable.class); StateTestUtils.startActionChangeSet(root); } diff --git a/junit/rails/game/state/PortfolioMapTest.java b/junit/rails/game/state/PortfolioMapTest.java new file mode 100644 index 0000000..40bcf8f --- /dev/null +++ b/junit/rails/game/state/PortfolioMapTest.java @@ -0,0 +1,148 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.*; + +import java.util.Iterator; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.SetMultimap; +import com.google.common.collect.Sets; + +public class PortfolioMapTest { + + private final static String PORTFOLIO_MAP_ID = "PortfolioMap"; + private final static String PORTFOLIO_SET_ID = "PortfolioSet"; + private final static String OWNER_MAP_ID = "OwnerMap"; + private final static String OWNER_SET_ID = "OwnerSet"; + private final static String ITEM_ID = "Item"; + private final static String ANOTHER_ITEM_ID = "AnotherItem"; + private final static String TYPE_ID = "Type"; + private final static String ANOTHER_TYPE_ID = "AnotherType"; + + private Root root; + private PortfolioMap<String, TypeOwnableItemImpl> portfolioMap; + private PortfolioSet<TypeOwnableItemImpl> portfolioSet; + private Owner ownerMap; + private Owner ownerSet; + private TypeOwnableItemImpl item; + private TypeOwnableItemImpl anotherItem; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + ownerMap = OwnerImpl.create(root, OWNER_MAP_ID); + ownerSet = OwnerImpl.create(root, OWNER_SET_ID); + portfolioMap = PortfolioMap.create(ownerMap, PORTFOLIO_MAP_ID , TypeOwnableItemImpl.class); + portfolioSet = PortfolioSet.create(ownerSet, PORTFOLIO_SET_ID , TypeOwnableItemImpl.class); + item = TypeOwnableItemImpl.create(root, ITEM_ID, TYPE_ID); + anotherItem = TypeOwnableItemImpl.create(root, ANOTHER_ITEM_ID, ANOTHER_TYPE_ID); + portfolioSet.moveInto(item); + StateTestUtils.startActionChangeSet(root); + } + + // helper function to check the initial state after undo + // includes redo, so after returning the state should be unchanged + private void assertInitialStateAfterUndo() { + StateTestUtils.closeAndUndo(root); + assertTrue(portfolioSet.containsItem(item)); + assertSame(ownerSet, item.getOwner()); + StateTestUtils.redo(root); + } + + @Test + public void testMoveInto() { + portfolioMap.moveInto(item); + assertSame(ownerMap, item.getOwner()); + assertTrue(portfolioMap.containsItem(item)); + assertFalse(portfolioSet.containsItem(item)); + // check undo + assertInitialStateAfterUndo(); + // and redo + assertTrue(portfolioMap.containsItem(item)); + } + + @Test + public void testContainsItem() { + assertFalse(portfolioMap.containsItem(item)); + item.moveTo(ownerMap); + assertTrue(portfolioMap.containsItem(item)); + } + + @Test + public void testItems() { + assertThat(portfolioMap.items()).isEmpty(); + item.moveTo(ownerMap); + assertThat(portfolioMap.items()).containsOnly(item); + anotherItem.moveTo(ownerMap); + assertThat(portfolioMap.items()).containsOnly(item, anotherItem); + } + + @Test + public void testSize() { + assertEquals(0, portfolioMap.size()); + item.moveTo(ownerMap); + assertEquals(1, portfolioMap.size()); + anotherItem.moveTo(ownerMap); + assertEquals(2, portfolioMap.size()); + } + + @Test + public void testIsEmpty() { + assertTrue(portfolioMap.isEmpty()); + item.moveTo(ownerMap); + assertFalse(portfolioMap.isEmpty()); + } + + @Test + public void testContainsKey() { + assertFalse(portfolioMap.containsKey(TYPE_ID)); + item.moveTo(ownerMap); + assertTrue(portfolioMap.containsKey(TYPE_ID)); + item.moveTo(ownerSet); + assertFalse(portfolioMap.containsKey(TYPE_ID)); + } + + @Test + public void testGetItems() { + assertThat(portfolioMap.getItems(TYPE_ID)).isEmpty(); + item.moveTo(ownerMap); + assertThat(portfolioMap.getItems(TYPE_ID)).containsOnly(item); + } + + @Test + public void testView() { + item.moveTo(ownerMap); + SetMultimap<String, TypeOwnableItemImpl> view = portfolioMap.view(); + assertTrue(view.containsValue(item)); + // still holds true after removing item + item.moveTo(ownerSet); + assertTrue(view.containsValue(item)); + assertFalse(portfolioMap.containsItem(item)); + } + + @Test + public void testIterator() { + item.moveTo(ownerMap); + anotherItem.moveTo(ownerMap); + + // no order is defined, so store them + Set<Ownable> iterated = Sets.newHashSet(); + + + Iterator<TypeOwnableItemImpl> it = portfolioMap.iterator(); + // and it still works even after removing items + item.moveTo(ownerSet); + + iterated.add(it.next()); + iterated.add(it.next()); + + assertThat(iterated).containsOnly(item, anotherItem); + // iterator is finished + assertFalse(it.hasNext()); + } + +} diff --git a/junit/rails/game/state/PortfolioSetTest.java b/junit/rails/game/state/PortfolioSetTest.java new file mode 100644 index 0000000..9954576 --- /dev/null +++ b/junit/rails/game/state/PortfolioSetTest.java @@ -0,0 +1,122 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.*; + +import java.util.Iterator; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.Sets; + +public class PortfolioSetTest { + + private final static String PORTFOLIO_A_ID = "PortfolioA"; + private final static String PORTFOLIO_B_ID = "PortfolioB"; + private final static String OWNER_A_ID = "OwnerA"; + private final static String OWNER_B_ID = "OwnerB"; + private final static String ITEM_ID = "Item"; + private final static String ANOTHER_ITEM_ID = "AnotherItem"; + + private Root root; + private PortfolioSet<Ownable> portfolioA; + private PortfolioSet<Ownable> portfolioB; + private Owner ownerA; + private Owner ownerB; + private Ownable item; + private Ownable anotherItem; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + ownerA = OwnerImpl.create(root, OWNER_A_ID); + ownerB = OwnerImpl.create(root, OWNER_B_ID); + portfolioA = PortfolioSet.create(ownerA, PORTFOLIO_A_ID , Ownable.class); + portfolioB = PortfolioSet.create(ownerB, PORTFOLIO_B_ID , Ownable.class); + item = OwnableItemImpl.create(root, ITEM_ID); + anotherItem = OwnableItemImpl.create(root, ANOTHER_ITEM_ID); + portfolioA.moveInto(item); + StateTestUtils.startActionChangeSet(root); + } + + // helper function to check the initial state after undo + // includes redo, so after returning the state should be unchanged + private void assertInitialStateAfterUndo() { + StateTestUtils.closeAndUndo(root); + assertTrue(portfolioA.containsItem(item)); + assertSame(ownerA, item.getOwner()); + StateTestUtils.redo(root); + } + + @Test + public void testMoveInto() { + // move item to B + item.moveTo(ownerB); + assertTrue(portfolioB.containsItem(item)); + assertSame(ownerB, item.getOwner()); + + // undo check + assertInitialStateAfterUndo(); + + // redo check + assertTrue(portfolioB.containsItem(item)); + assertSame(ownerB, item.getOwner()); + } + + @Test + public void testContainsItem() { + assertTrue(portfolioA.containsItem(item)); + assertFalse(portfolioB.containsItem(item)); + } + + @Test + public void testItems() { + assertThat(portfolioA.items()).containsOnly(item); + anotherItem.moveTo(ownerA); + Set<Ownable> items = portfolioA.items(); + assertThat(items).containsOnly(item, anotherItem); + // and the view is unchanged after changing the portfolio + anotherItem.moveTo(ownerB); + assertTrue(items.contains(anotherItem)); + assertFalse(portfolioA.containsItem(anotherItem)); + } + + @Test + public void testSize() { + assertEquals(1, portfolioA.size()); + assertEquals(0, portfolioB.size()); + anotherItem.moveTo(ownerA); + assertEquals(2, portfolioA.size()); + item.moveTo(ownerB); + assertEquals(1, portfolioA.size()); + assertEquals(1, portfolioB.size()); + } + + @Test + public void testIsEmpty() { + assertFalse(portfolioA.isEmpty()); + assertTrue(portfolioB.isEmpty()); + } + + @Test + public void testIterator() { + anotherItem.moveTo(ownerA); + + // no order is defined, so store them + Set<Ownable> iterated = Sets.newHashSet(); + + Iterator<Ownable> it = portfolioA.iterator(); + // and it still works even after removing items + anotherItem.moveTo(ownerB); + + iterated.add(it.next()); + iterated.add(it.next()); + + assertThat(iterated).containsOnly(item, anotherItem); + // iterator is finished + assertFalse(it.hasNext()); + } + +} diff --git a/junit/rails/game/state/TypeOwnableItemImpl.java b/junit/rails/game/state/TypeOwnableItemImpl.java new file mode 100644 index 0000000..7ba4b7d --- /dev/null +++ b/junit/rails/game/state/TypeOwnableItemImpl.java @@ -0,0 +1,19 @@ +package rails.game.state; + +// Implementation of a typed OwnableItem +class TypeOwnableItemImpl extends OwnableItem<TypeOwnableItemImpl> implements Typable<String> { + private final String type; + + private TypeOwnableItemImpl(Item parent, String id, String type) { + super(parent, id, TypeOwnableItemImpl.class); + this.type = type; + } + + static TypeOwnableItemImpl create(Item parent, String id, String type) { + return new TypeOwnableItemImpl(parent, id, type); + } + + public String getType() { + return type; + } +} diff --git a/src/rails/game/Company.java b/src/rails/game/Company.java index 4d5ad04..4815807 100644 --- a/src/rails/game/Company.java +++ b/src/rails/game/Company.java @@ -5,7 +5,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import rails.common.parser.ConfigurableComponent; import rails.common.parser.ConfigurationException; @@ -15,7 +15,7 @@ import rails.game.state.BooleanState; import rails.game.state.AbstractItem; import rails.game.state.Item; import rails.game.state.Owner; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; import rails.util.Util; public abstract class Company extends AbstractItem implements Owner, ConfigurableComponent, @@ -53,8 +53,8 @@ Cloneable, Comparable<Company> { protected final BooleanState closedObject = BooleanState.create(this, "closed", false); // Moved here from PrivayeCOmpany on behalf of 1835 - protected final PortfolioList<SpecialProperty> specialProperties = - PortfolioList.create(this, "specialProperties", SpecialProperty.class); + protected final PortfolioSet<SpecialProperty> specialProperties = + PortfolioSet.create(this, "specialProperties", SpecialProperty.class); protected static Logger log = LoggerFactory.getLogger(Company.class.getPackage().getName()); @@ -96,9 +96,9 @@ Cloneable, Comparable<Company> { } /** - * @return ArrayList of all special properties we have. + * @return Set of all special properties we have. */ - public ImmutableList<SpecialProperty> getSpecialProperties() { + public ImmutableSet<SpecialProperty> getSpecialProperties() { return specialProperties.items(); } diff --git a/src/rails/game/GameManager.java b/src/rails/game/GameManager.java index 5f9d4f0..b196d46 100644 --- a/src/rails/game/GameManager.java +++ b/src/rails/game/GameManager.java @@ -1703,7 +1703,7 @@ public class GameManager extends AbstractItem implements ConfigurableComponent, public boolean addSpecialProperty(SpecialProperty property) { if (commonSpecialProperties == null) { - commonSpecialProperties = PortfolioList.create(this, + commonSpecialProperties = PortfolioSet.create(this, "CommonSpecialProperties", SpecialProperty.class); } return commonSpecialProperties.moveInto(property); diff --git a/src/rails/game/MapHex.java b/src/rails/game/MapHex.java index 1c9f497..17e3c65 100644 --- a/src/rails/game/MapHex.java +++ b/src/rails/game/MapHex.java @@ -7,7 +7,7 @@ import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import rails.algorithms.RevenueBonusTemplate; import rails.common.LocalText; @@ -25,7 +25,7 @@ import rails.game.state.BooleanState; import rails.game.state.Observer; import rails.game.state.Owner; import rails.game.state.Portfolio; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; import rails.game.state.AbstractItem; import rails.util.*; @@ -126,7 +126,7 @@ StationHolder { protected List<PublicCompany> destinations; /** Tokens that are not bound to a Station (City), such as Bonus tokens */ - protected final PortfolioList<Token> offStationTokens = PortfolioList.create(this, + protected final PortfolioSet<Token> offStationTokens = PortfolioSet.create(this, "offStationTokens", Token.class); /** Storage of revenueBonus that are bound to the hex */ @@ -979,7 +979,7 @@ StationHolder { return tokens; } - public PortfolioList<Token> getTokens() { + public PortfolioSet<Token> getTokens() { return offStationTokens; } @@ -1015,11 +1015,11 @@ StationHolder { return false; } - public ImmutableList<Token> getTokens(int cityNumber) { + public ImmutableSet<Token> getTokens(int cityNumber) { if (stops.size() > 0 && mStops.get(cityNumber) != null) { return (mStops.get(cityNumber)).getTokens().items(); } else { - return ImmutableList.of(); // empty List + return ImmutableSet.of(); // empty List } } diff --git a/src/rails/game/OperatingRound.java b/src/rails/game/OperatingRound.java index 3c02255..27a5377 100644 --- a/src/rails/game/OperatingRound.java +++ b/src/rails/game/OperatingRound.java @@ -10,6 +10,8 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.TreeSet; +import com.google.common.collect.Iterables; + import rails.common.*; import rails.common.parser.GameOption; import rails.game.action.*; @@ -2811,7 +2813,7 @@ public class OperatingRound extends Round implements Observer { int cash = operatingCompany.value().getCash(); int cost = 0; - List<Train> trains; + Set<Train> trains; boolean hasTrains = operatingCompany.value().getPortfolioModel().getNumberOfTrains() > 0; @@ -2862,7 +2864,7 @@ public class OperatingRound extends Round implements Observer { if (train.canBeExchanged() && hasTrains) { cost = train.getCertType().getExchangeCost(); if (cost <= cash) { - List<Train> exchangeableTrains = + Set<Train> exchangeableTrains = operatingCompany.value().getPortfolioModel().getUniqueTrains(); BuyTrain action = new BuyTrain(train, ipo.getParent(), cost); action.setTrainsForExchange(exchangeableTrains); @@ -3031,7 +3033,7 @@ public class OperatingRound extends Round implements Observer { public void checkForeignSales() { if (getGameParameterAsBoolean(GameDef.Parm.REMOVE_TRAIN_BEFORE_SR) && trainManager.isAnyTrainBought()) { - Train train = trainManager.getAvailableNewTrains().get(0); + Train train = Iterables.get(trainManager.getAvailableNewTrains(), 0); if (train.getCertType().hasInfiniteQuantity()) return; scrapHeap.addTrain(train); ReportBuffer.add(LocalText.getText("RemoveTrain", train.getId())); diff --git a/src/rails/game/PublicCertificate.java b/src/rails/game/PublicCertificate.java index f6e2cd1..e72b973 100644 --- a/src/rails/game/PublicCertificate.java +++ b/src/rails/game/PublicCertificate.java @@ -10,8 +10,9 @@ import rails.common.LocalText; import rails.game.model.CertificatesModel; import rails.game.state.Item; import rails.game.state.OwnableItem; +import rails.game.state.Typable; -public class PublicCertificate extends OwnableItem<PublicCertificate> implements Certificate, Cloneable { +public class PublicCertificate extends OwnableItem<PublicCertificate> implements Certificate, Cloneable, Typable<PublicCompany> { /** From which public company is this a certificate */ protected PublicCompany company; @@ -188,6 +189,11 @@ public class PublicCertificate extends OwnableItem<PublicCertificate> implements return certTypeId; } + // Typable interface + public PublicCompany getType() { + return company; + } + @Override protected Object clone() { try { diff --git a/src/rails/game/PublicCompany.java b/src/rails/game/PublicCompany.java index c961906..bc673b4 100644 --- a/src/rails/game/PublicCompany.java +++ b/src/rails/game/PublicCompany.java @@ -4,6 +4,8 @@ import java.awt.Color; import java.util.*; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import rails.common.GuiDef; import rails.common.LocalText; @@ -1046,7 +1048,7 @@ public class PublicCompany extends Company implements CashOwner, PortfolioOwner // TODO: Check if this works correctly // move all laid tokens to free tokens again - PortfolioList.moveAll( + PortfolioSet.moveAll( baseTokens.getLaidTokens(), baseTokens.getFreeTokens()); // close company on the stock market stockMarket.close(this); @@ -1601,7 +1603,7 @@ public class PublicCompany extends Company implements CashOwner, PortfolioOwner privatesCostThisTurn.change(price); // Move any special abilities to the portfolio, if configured so - List<SpecialProperty> sps = privateCompany.getSpecialProperties(); + Set<SpecialProperty> sps = privateCompany.getSpecialProperties(); if (sps != null) { // Need intermediate List to avoid ConcurrentModificationException List<SpecialProperty> spsToMoveHere = @@ -1818,7 +1820,7 @@ public class PublicCompany extends Company implements CashOwner, PortfolioOwner public BaseToken getFreeToken() { if (baseTokens.getFreeTokens().size() > 0) { - return (BaseToken)baseTokens.getFreeTokens().items().get(0); + return (BaseToken) Iterables.get(baseTokens.getFreeTokens().items(), 0); } else { return null; } @@ -1854,7 +1856,7 @@ public class PublicCompany extends Company implements CashOwner, PortfolioOwner return list; } - public ImmutableList<Token> getLaidBaseTokens() { + public ImmutableSet<Token> getLaidBaseTokens() { return baseTokens.getLaidTokens().items(); } diff --git a/src/rails/game/Stop.java b/src/rails/game/Stop.java index 9c9607c..8f398b2 100644 --- a/src/rails/game/Stop.java +++ b/src/rails/game/Stop.java @@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory; import rails.game.state.AbstractItem; import rails.game.state.GenericState; import rails.game.state.Owner; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; import rails.util.Util; /** @@ -31,7 +31,7 @@ public class Stop extends AbstractItem implements Owner { //private Station relatedStation; private GenericState<Station> relatedStation; private int slots; - private PortfolioList<Token> tokens; + private PortfolioSet<Token> tokens; private String trackEdges; @@ -99,7 +99,7 @@ public class Stop extends AbstractItem implements Owner { super(hex, String.valueOf(number)); this.number = number; uniqueId = getParent().getId() + "_" + number; - tokens = PortfolioList.create(this, "tokens", Token.class); + tokens = PortfolioSet.create(this, "tokens", Token.class); relatedStation = GenericState.create(this, "City_"+uniqueId+"_station"); } @@ -232,7 +232,7 @@ public class Stop extends AbstractItem implements Owner { return uniqueId; } - public PortfolioList<Token> getTokens() { + public PortfolioSet<Token> getTokens() { return tokens; } diff --git a/src/rails/game/Train.java b/src/rails/game/Train.java index 8d2f027..6d64c58 100644 --- a/src/rails/game/Train.java +++ b/src/rails/game/Train.java @@ -9,8 +9,11 @@ import rails.game.state.GenericState; import rails.game.state.Item; import rails.game.state.OwnableItem; import rails.game.state.Portfolio; +import rails.game.state.Typable; -public class Train extends OwnableItem<Train> { +// FIXME: Trains a tricky as they can swap their type +// This change has to be tracked if used in a PortfolioMap +public class Train extends OwnableItem<Train> implements Typable<TrainType> { protected TrainCertificateType certificateType; diff --git a/src/rails/game/TrainManager.java b/src/rails/game/TrainManager.java index dd821c9..82b0469 100644 --- a/src/rails/game/TrainManager.java +++ b/src/rails/game/TrainManager.java @@ -4,8 +4,10 @@ package rails.game; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -331,9 +333,9 @@ public final class TrainManager extends AbstractItem implements ConfigurableComp } - public List<Train> getAvailableNewTrains() { + public Set<Train> getAvailableNewTrains() { - List<Train> availableTrains = new ArrayList<Train>(); + Set<Train> availableTrains = new HashSet<Train>(); Train train; for (TrainCertificateType type : trainCertTypes) { diff --git a/src/rails/game/action/BuyTrain.java b/src/rails/game/action/BuyTrain.java index ce341af..c70873b 100644 --- a/src/rails/game/action/BuyTrain.java +++ b/src/rails/game/action/BuyTrain.java @@ -1,14 +1,9 @@ -/* $Header: /Users/blentz/rails_rcs/cvs/18xx/rails/game/action/BuyTrain.java,v 1.22 2010/06/21 21:35:50 stefanfrey Exp $ - * - * Created on 20-May-2006 - * Change Log: - */ package rails.game.action; import java.io.IOException; import java.io.ObjectInputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import rails.game.Bank; import rails.game.CompanyManager; @@ -34,7 +29,7 @@ public class BuyTrain extends PossibleORAction { private String fromName; private int fixedCost = 0; private boolean forcedBuyIfNoRoute = false; // TODO Can be disabled once route checking exists - transient private List<Train> trainsForExchange = null; + transient private Set<Train> trainsForExchange = null; private String[] trainsForExchangeUniqueIds; /** Obsolete, but left in for backwards compatibility of saved files */ @@ -79,13 +74,13 @@ public class BuyTrain extends PossibleORAction { this.typeName = type.getName(); } - public BuyTrain setTrainsForExchange(List<Train> trains) { + public BuyTrain setTrainsForExchange(Set<Train> trains) { trainsForExchange = trains; if (trains != null) { trainsForExchangeUniqueIds = new String[trains.size()]; - for (int i = 0; i < trains.size(); i++) { - trainsForExchangeUniqueIds[i] = trains.get(i).getId(); - // Must be replaced by unique Ids - why was this a todo? + int i = 0; + for (Train train:trains) { + trainsForExchangeUniqueIds[i++] = train.getId(); } } return this; @@ -165,7 +160,7 @@ public class BuyTrain extends PossibleORAction { return trainsForExchange != null && !trainsForExchange.isEmpty(); } - public List<Train> getTrainsForExchange() { + public Set<Train> getTrainsForExchange() { return trainsForExchange; } @@ -325,7 +320,7 @@ public class BuyTrain extends PossibleORAction { // from = gameManager.getPortfolioByName(fromName); if (trainsForExchangeUniqueIds != null && trainsForExchangeUniqueIds.length > 0) { - trainsForExchange = new ArrayList<Train>(); + trainsForExchange = new HashSet<Train>(); for (int i = 0; i < trainsForExchangeUniqueIds.length; i++) { trainsForExchange.add(trainManager.getTrainByUniqueId(trainsForExchangeUniqueIds[i])); } diff --git a/src/rails/game/action/DiscardTrain.java b/src/rails/game/action/DiscardTrain.java index 35b4f9f..9bb98e9 100644 --- a/src/rails/game/action/DiscardTrain.java +++ b/src/rails/game/action/DiscardTrain.java @@ -1,14 +1,9 @@ -/* $Header: /Users/blentz/rails_rcs/cvs/18xx/rails/game/action/DiscardTrain.java,v 1.11 2009/12/27 18:30:11 evos Exp $ - * - * Created on 20-May-2006 - * Change Log: - */ package rails.game.action; import java.io.IOException; import java.io.ObjectInputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import rails.game.*; @@ -18,7 +13,7 @@ import rails.game.*; public class DiscardTrain extends PossibleORAction { // Server settings - transient private List<Train> ownedTrains = null; + transient private Set<Train> ownedTrains = null; private String[] ownedTrainsUniqueIds; /** True if discarding trains is mandatory */ @@ -30,25 +25,26 @@ public class DiscardTrain extends PossibleORAction { public static final long serialVersionUID = 1L; - public DiscardTrain(PublicCompany company, List<Train> trains) { + public DiscardTrain(PublicCompany company, Set<Train> trains) { super(); this.ownedTrains = trains; this.ownedTrainsUniqueIds = new String[trains.size()]; - for (int i = 0; i < trains.size(); i++) { - ownedTrainsUniqueIds[i] = trains.get(i).getId(); + int i = 0; + for (Train train:trains) { + ownedTrainsUniqueIds[i++] = train.getId(); } this.company = company; this.companyName = company.getId(); } - public DiscardTrain(PublicCompany company, List<Train> trains, + public DiscardTrain(PublicCompany company, Set<Train> trainsToDiscardFrom, boolean forced) { - this(company, trains); + this(company, trainsToDiscardFrom); this.forced = forced; } - public List<Train> getOwnedTrains() { + public Set<Train> getOwnedTrains() { return ownedTrains; } @@ -110,7 +106,7 @@ public class DiscardTrain extends PossibleORAction { } if (ownedTrainsUniqueIds != null && ownedTrainsUniqueIds.length > 0) { - ownedTrains = new ArrayList<Train>(); + ownedTrains = new HashSet<Train>(); for (int i = 0; i < ownedTrainsUniqueIds.length; i++) { ownedTrains.add(trainManager.getTrainByUniqueId(ownedTrainsUniqueIds[i])); } diff --git a/src/rails/game/model/BaseTokensModel.java b/src/rails/game/model/BaseTokensModel.java index 5f487ac..c11e680 100644 --- a/src/rails/game/model/BaseTokensModel.java +++ b/src/rails/game/model/BaseTokensModel.java @@ -4,20 +4,20 @@ import rails.game.BaseToken; import rails.game.PublicCompany; import rails.game.Token; import rails.game.state.Model; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; /** * A model presenting the number of tokens */ public class BaseTokensModel extends Model { - private final PortfolioList<Token> freeBaseTokens; - private final PortfolioList<Token> laidBaseTokens; + private final PortfolioSet<Token> freeBaseTokens; + private final PortfolioSet<Token> laidBaseTokens; private BaseTokensModel(PublicCompany parent, String id) { super(parent, id); - freeBaseTokens = PortfolioList.create(parent, "freeBaseTokens", Token.class); - laidBaseTokens = PortfolioList.create(parent, "laidBaseTokens", Token.class); + freeBaseTokens = PortfolioSet.create(parent, "freeBaseTokens", Token.class); + laidBaseTokens = PortfolioSet.create(parent, "laidBaseTokens", Token.class); } public static BaseTokensModel create(PublicCompany parent, String id){ @@ -46,11 +46,11 @@ public class BaseTokensModel extends Model { laidBaseTokens.moveInto(token); } - public PortfolioList<Token> getFreeTokens() { + public PortfolioSet<Token> getFreeTokens() { return freeBaseTokens; } - public PortfolioList<Token> getLaidTokens() { + public PortfolioSet<Token> getLaidTokens() { return laidBaseTokens; } diff --git a/src/rails/game/model/CertificatesModel.java b/src/rails/game/model/CertificatesModel.java index 5938b0c..76ccffc 100644 --- a/src/rails/game/model/CertificatesModel.java +++ b/src/rails/game/model/CertificatesModel.java @@ -2,7 +2,7 @@ package rails.game.model; import java.util.Iterator; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import rails.game.Player; import rails.game.PublicCertificate; @@ -23,7 +23,7 @@ public final class CertificatesModel extends Model { public final static String ID = "CertificatesModel"; - private final PortfolioMap<PublicCertificate> certificates; + private final PortfolioMap<PublicCompany, PublicCertificate> certificates; private CertificatesModel(PortfolioHolder parent) { super(parent, ID); @@ -39,7 +39,7 @@ public final class CertificatesModel extends Model { return (PortfolioHolder)getParent(); } - public PortfolioMap<PublicCertificate> getPortfolio() { + public PortfolioMap<PublicCompany, PublicCertificate> getPortfolio() { return certificates; } @@ -78,11 +78,11 @@ public final class CertificatesModel extends Model { return certificates.toString(); } - public ImmutableList<PublicCertificate> getCertificates() { + public ImmutableSet<PublicCertificate> getCertificates() { return certificates.items(); } - public ImmutableList<PublicCertificate> getCertificates(PublicCompany company) { + public ImmutableSet<PublicCertificate> getCertificates(PublicCompany company) { return certificates.getItems(company); } diff --git a/src/rails/game/model/PortfolioModel.java b/src/rails/game/model/PortfolioModel.java index a9901e5..96049e1 100644 --- a/src/rails/game/model/PortfolioModel.java +++ b/src/rails/game/model/PortfolioModel.java @@ -2,14 +2,17 @@ package rails.game.model; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; +import com.google.common.collect.ImmutableSet; import rails.common.LocalText; import rails.game.Bank; @@ -31,7 +34,7 @@ import rails.game.special.SpecialProperty; import rails.game.state.Model; import rails.game.state.PortfolioHolder; import rails.game.state.Portfolio; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; // FIXME: Solve id, name and uniquename clashes @@ -57,7 +60,7 @@ public final class PortfolioModel extends Model implements PortfolioHolder { /** Owned tokens */ // TODO Currently only used to discard expired Bonus tokens. - private final Portfolio<Token> bonusTokens = PortfolioList.create(this, "BonusTokens", Token.class); + private final Portfolio<Token> bonusTokens = PortfolioSet.create(this, "BonusTokens", Token.class); /** * Private-independent special properties. When moved here, a special @@ -65,7 +68,7 @@ public final class PortfolioModel extends Model implements PortfolioHolder { * 18AL named train tokens. */ private final Portfolio<SpecialProperty> specialProperties = - PortfolioList.create(this, "SpecialProperties", SpecialProperty.class); + PortfolioSet.create(this, "SpecialProperties", SpecialProperty.class); private final GameManager gameManager; @@ -140,11 +143,11 @@ public final class PortfolioModel extends Model implements PortfolioHolder { return null; } - public ImmutableList<PrivateCompany> getPrivateCompanies() { + public ImmutableSet<PrivateCompany> getPrivateCompanies() { return privates.getPortfolio().items(); } - public ImmutableList<PublicCertificate> getCertificates() { + public ImmutableSet<PublicCertificate> getCertificates() { return certificates.getPortfolio().items(); } @@ -166,7 +169,7 @@ public final class PortfolioModel extends Model implements PortfolioHolder { } */ - public ImmutableList<PublicCertificate> getCertificates(PublicCompany company) { + public ImmutableSet<PublicCertificate> getCertificates(PublicCompany company) { return certificates.getPortfolio().getItems(company); } @@ -336,7 +339,7 @@ public final class PortfolioModel extends Model implements PortfolioHolder { return trains.getPortfolio().size(); } - public ImmutableList<Train> getTrainList() { + public ImmutableSet<Train> getTrainList() { return trains.getPortfolio().items(); } @@ -355,9 +358,9 @@ public final class PortfolioModel extends Model implements PortfolioHolder { } /** Returns one train of any type held */ - public List<Train> getUniqueTrains() { + public Set<Train> getUniqueTrains() { - List<Train> trainsFound = new ArrayList<Train>(); + Set<Train> trainsFound = new HashSet<Train>(); Map<TrainType, Object> trainTypesFound = new HashMap<TrainType, Object>(); for (Train train : trains.getPortfolio()) { @@ -506,9 +509,9 @@ public final class PortfolioModel extends Model implements PortfolioHolder { */ /** - * @return ArrayList of all special properties we have. + * @return Set of all special properties we have. */ - public ImmutableList<SpecialProperty> getPersistentSpecialProperties() { + public ImmutableSet<SpecialProperty> getPersistentSpecialProperties() { return specialProperties.items(); } @@ -542,7 +545,7 @@ public final class PortfolioModel extends Model implements PortfolioHolder { public <T extends SpecialProperty> List<T> getSpecialProperties( Class<T> clazz, boolean includeExercised) { List<T> result = new ArrayList<T>(); - List<SpecialProperty> sps; + Set<SpecialProperty> sps; if (getParent() instanceof Player || getParent() instanceof PublicCompany) { diff --git a/src/rails/game/model/PrivatesModel.java b/src/rails/game/model/PrivatesModel.java index 055d2a5..86ad87d 100644 --- a/src/rails/game/model/PrivatesModel.java +++ b/src/rails/game/model/PrivatesModel.java @@ -5,7 +5,7 @@ import rails.game.PrivateCompany; import rails.game.state.Model; import rails.game.state.Portfolio; import rails.game.state.PortfolioHolder; -import rails.game.state.PortfolioList; +import rails.game.state.PortfolioSet; public final class PrivatesModel extends Model { @@ -17,7 +17,7 @@ public final class PrivatesModel extends Model { private PrivatesModel(PortfolioHolder parent, String id) { super(parent, id); - privates = PortfolioList.create(parent, "privates", PrivateCompany.class); + privates = PortfolioSet.create(parent, "privates", PrivateCompany.class); } /** diff --git a/src/rails/game/model/TrainsModel.java b/src/rails/game/model/TrainsModel.java index b266a23..a8f6289 100644 --- a/src/rails/game/model/TrainsModel.java +++ b/src/rails/game/model/TrainsModel.java @@ -1,21 +1,24 @@ package rails.game.model; import com.google.common.collect.HashMultiset; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multiset; import rails.game.TrainCertificateType; import rails.game.Train; +import rails.game.TrainType; import rails.game.state.Model; import rails.game.state.Portfolio; import rails.game.state.PortfolioHolder; import rails.game.state.PortfolioMap; +// FIXME: It is tricky to use the PortfolioMap as the TrainType can switch +// their type, potentially it is better to use a PortfolioSet public class TrainsModel extends Model { public static final String ID = "TrainsModel"; - private final PortfolioMap<Train> trains; + private final PortfolioMap<TrainType, Train> trains; private boolean abbrList = false; @@ -39,7 +42,7 @@ public class TrainsModel extends Model { this.abbrList = abbrList; } - public ImmutableList<Train> getTrains() { + public ImmutableSet<Train> getTrains() { return trains.items(); } diff --git a/src/rails/game/specific/_1835/OperatingRound_1835.java b/src/rails/game/specific/_1835/OperatingRound_1835.java index 18b8e0c..5f8d738 100644 --- a/src/rails/game/specific/_1835/OperatingRound_1835.java +++ b/src/rails/game/specific/_1835/OperatingRound_1835.java @@ -2,6 +2,8 @@ package rails.game.specific._1835; import java.util.*; +import com.google.common.collect.Iterables; + import rails.common.DisplayBuffer; import rails.common.LocalText; import rails.common.parser.GameOption; @@ -81,7 +83,7 @@ public final class OperatingRound_1835 extends OperatingRound { * so it can be subtracted if PR operates */ if (recipient instanceof Player && priv.getSpecialProperties() != null && priv.getSpecialProperties().size() > 0) { - SpecialProperty sp = priv.getSpecialProperties().get(0); + SpecialProperty sp = Iterables.get(priv.getSpecialProperties(), 0); if (sp instanceof ExchangeForShare) { ExchangeForShare efs = (ExchangeForShare) sp; if (efs.getPublicCompanyName().equalsIgnoreCase(GameManager_1835.PR_ID)) { @@ -144,9 +146,9 @@ public final class OperatingRound_1835 extends OperatingRound { super.initTurn(); - List<SpecialProperty> sps = operatingCompany.value().getSpecialProperties(); + Set<SpecialProperty> sps = operatingCompany.value().getSpecialProperties(); if (sps != null && !sps.isEmpty()) { - ExchangeForShare efs = (ExchangeForShare) sps.get(0); + ExchangeForShare efs = (ExchangeForShare) Iterables.get(sps, 0); addIncomeDenialShare (operatingCompany.value().getPresident(), efs.getShare()); } } diff --git a/src/rails/game/specific/_1835/PrussianFormationRound.java b/src/rails/game/specific/_1835/PrussianFormationRound.java index 835f4be..6ced1eb 100644 --- a/src/rails/game/specific/_1835/PrussianFormationRound.java +++ b/src/rails/game/specific/_1835/PrussianFormationRound.java @@ -2,6 +2,8 @@ package rails.game.specific._1835; import java.util.*; +import com.google.common.collect.Iterables; + import rails.common.DisplayBuffer; import rails.common.GuiDef; import rails.common.LocalText; @@ -79,19 +81,19 @@ public final class PrussianFormationRound extends StockRound { log.debug("Original Prussian starting player was "+startingPlayer.getId()); setCurrentPlayer(startingPlayer); if (forcedMerge) { - List<SpecialProperty> sps; + Set<SpecialProperty> sps; setFoldablePrePrussians(); List<Company> foldables = new ArrayList<Company> (); for (PrivateCompany company : gameManager.getAllPrivateCompanies()) { sps = company.getSpecialProperties(); - if (sps != null && !sps.isEmpty() && sps.get(0) instanceof ExchangeForShare) { + if (sps != null && !sps.isEmpty() && Iterables.get(sps, 0) instanceof ExchangeForShare) { foldables.add(company); } } for (PublicCompany company : gameManager.getAllPublicCompanies()) { if (company.isClosed()) continue; sps = company.getSpecialProperties(); - if (sps != null && !sps.isEmpty() && sps.get(0) instanceof ExchangeForShare) { + if (sps != null && !sps.isEmpty() && Iterables.get(sps, 0) instanceof ExchangeForShare) { foldables.add(company); } } @@ -135,18 +137,18 @@ public final class PrussianFormationRound extends StockRound { foldablePrePrussians = new ArrayList<Company> (); SpecialProperty sp; for (PrivateCompany company : currentPlayer.getPortfolioModel().getPrivateCompanies()) { - sp = company.getSpecialProperties().get(0); + sp = Iterables.get(company.getSpecialProperties(), 0); if (sp instanceof ExchangeForShare) { foldablePrePrussians.add(company); } } PublicCompany company; - List<SpecialProperty> sps; + Set<SpecialProperty> sps; for (PublicCertificate cert : currentPlayer.getPortfolioModel().getCertificates()) { if (!cert.isPresidentShare()) continue; company = cert.getCompany(); sps = company.getSpecialProperties(); - if (sps != null && !sps.isEmpty() && sps.get(0) instanceof ExchangeForShare) { + if (sps != null && !sps.isEmpty() && Iterables.get(sps, 0) instanceof ExchangeForShare) { foldablePrePrussians.add(company); } } @@ -321,7 +323,7 @@ public final class PrussianFormationRound extends StockRound { player = ((PublicCompany)company).getPresident(); } // Shortcut, sp should be checked - efs = (ExchangeForShare) company.getSpecialProperties().get(0); + efs = (ExchangeForShare) Iterables.get(company.getSpecialProperties(), 0); cert = unavailable.findCertificate(prussian, efs.getShare()/prussian.getShareUnit(), president); player.getPortfolioModel().addPublicCertificate(cert); diff --git a/src/rails/game/specific/_1856/CGRFormationRound.java b/src/rails/game/specific/_1856/CGRFormationRound.java index a2ea45d..7283e94 100644 --- a/src/rails/game/specific/_1856/CGRFormationRound.java +++ b/src/rails/game/specific/_1856/CGRFormationRound.java @@ -34,7 +34,7 @@ public final class CGRFormationRound extends SwitchableUIRound { * effects from the merger, processed at the end * thus no need for state variables */ - private List<Train> trainsToDiscardFrom = null; + private Set<Train> trainsToDiscardFrom = null; private boolean forcedTrainDiscard = true; private List<ExchangeableToken> tokensToExchangeFrom = null; private List<BaseToken> nonHomeTokens = null; @@ -556,7 +556,7 @@ public final class CGRFormationRound extends SwitchableUIRound { } // Move any remaining trains - List<Train> trains = comp.getPortfolioModel().getTrainList(); + Set<Train> trains = comp.getPortfolioModel().getTrainList(); for (Train train : trains) { cgr.getPortfolioModel().addTrain(train); if (train.isPermanent()) cgr.setHadPermanentTrain(true); @@ -668,7 +668,7 @@ bonuses: for (Bonus bonus : bonuses) { // Check the trains, autodiscard any excess non-permanent trains // int trainLimit = cgr.getTrainLimit(gameManager.getCurrentPlayerIndex()); int trainLimit = cgr.getCurrentTrainLimit(); - List<Train> trains = cgr.getPortfolioModel().getTrainList(); + Set<Train> trains = cgr.getPortfolioModel().getTrainList(); if (cgr.getNumberOfTrains() > trainLimit) { ReportBuffer.add(""); int numberToDiscard = cgr.getNumberOfTrains() - trainLimit; @@ -770,7 +770,7 @@ bonuses: for (Bonus bonus : bonuses) { } else if (!this.cgrHasDiscardedTrains.value()) { // Check if CGR still has non-permanent trains // these may be discarded voluntarily - trainsToDiscardFrom = new ArrayList<Train>(); + trainsToDiscardFrom = new HashSet<Train>(); for (Train train : cgr.getPortfolioModel().getTrainList()) { if (!train.isPermanent()) { trainsToDiscardFrom.add(train); diff --git a/src/rails/game/specific/_1856/OperatingRound_1856.java b/src/rails/game/specific/_1856/OperatingRound_1856.java index 9c0981e..6c40d6d 100644 --- a/src/rails/game/specific/_1856/OperatingRound_1856.java +++ b/src/rails/game/specific/_1856/OperatingRound_1856.java @@ -3,6 +3,8 @@ package rails.game.specific._1856; import java.util.ArrayList; import java.util.List; +import com.google.common.collect.Iterables; + import rails.common.DisplayBuffer; import rails.common.GuiDef; import rails.common.LocalText; @@ -66,7 +68,7 @@ public class OperatingRound_1856 extends OperatingRound { if (!operatingCompany.value().hasOperated()) { int soldPercentage = getSoldPercentage (operatingCompany.value()); - Train nextAvailableTrain = gameManager.getTrainManager().getAvailableNewTrains().get(0); + Train nextAvailableTrain = Iterables.get(gameManager.getTrainManager().getAvailableNewTrains(), 0); int trainNumber; try { trainNumber = Integer.parseInt(nextAvailableTrain.getId()); diff --git a/src/rails/game/specific/_1856/PublicCompany_1856.java b/src/rails/game/specific/_1856/PublicCompany_1856.java index 0eec963..6625635 100644 --- a/src/rails/game/specific/_1856/PublicCompany_1856.java +++ b/src/rails/game/specific/_1856/PublicCompany_1856.java @@ -1,5 +1,7... [truncated message content] |