From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>
--- .../freecol/client/gui/dialog/PreCombatDialog.java | 5 +- .../gui/panel/colopedia/ResourcesDetailPanel.java | 5 +- .../gui/panel/colopedia/UnitDetailPanel.java | 11 ++- src/net/sf/freecol/common/model/BuildQueue.java | 12 ++- src/net/sf/freecol/common/model/Building.java | 42 ++++---- src/net/sf/freecol/common/model/Colony.java | 14 +-- src/net/sf/freecol/common/model/ColonyTile.java | 35 +++---- src/net/sf/freecol/common/model/Consumer.java | 17 +++- .../sf/freecol/common/model/FeatureContainer.java | 83 ++++++++-------- src/net/sf/freecol/common/model/FreeColObject.java | 110 +++++++++++++++------ .../sf/freecol/common/model/LostCityRumour.java | 4 +- .../sf/freecol/common/model/ProductionCache.java | 4 +- src/net/sf/freecol/common/model/Resource.java | 8 +- .../sf/freecol/common/model/SimpleCombatModel.java | 32 +++--- src/net/sf/freecol/common/model/Specification.java | 11 ++- src/net/sf/freecol/common/model/Tile.java | 18 +++- .../sf/freecol/common/model/TileImprovement.java | 8 +- src/net/sf/freecol/common/model/TileItem.java | 21 +++- .../sf/freecol/common/model/TileItemContainer.java | 7 +- src/net/sf/freecol/common/model/Unit.java | 31 +++--- src/net/sf/freecol/common/model/WorkLocation.java | 22 ++++- src/net/sf/freecol/server/ai/NativeAIPlayer.java | 4 +- src/net/sf/freecol/server/model/ServerPlayer.java | 2 +- .../net/sf/freecol/common/model/BuildingTest.java | 37 +++---- .../net/sf/freecol/common/model/ColonyTest.java | 8 +- .../net/sf/freecol/common/model/CombatTest.java | 14 +-- .../freecol/common/model/FoundingFatherTest.java | 4 +- .../freecol/common/model/IndividualFatherTest.java | 10 +- .../net/sf/freecol/common/model/ModifierTest.java | 12 +-- .../sf/freecol/common/model/NationTypeTest.java | 4 +- test/src/net/sf/freecol/common/model/TileTest.java | 8 +- .../sf/freecol/server/model/ServerUnitTest.java | 5 +- 32 files changed, 357 insertions(+), 251 deletions(-) diff --git a/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java b/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java index c9392d30818..3ed3e421266 100644 --- a/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java +++ b/src/net/sf/freecol/client/gui/dialog/PreCombatDialog.java @@ -20,6 +20,7 @@ package net.sf.freecol.client.gui.dialog; import java.awt.Font; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -137,7 +138,7 @@ public class PreCombatDialog extends FreeColConfirmDialog { Font bigFont = FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScaleFactor()); float offenceResult - = FeatureContainer.applyModifiers(0f, turn, attackModifiers); + = FeatureContainer.applyModifiers(0f, turn, new ArrayList<>(attackModifiers)); JLabel finalOffenceLabel = Utility.localizedLabel("finalResult"); finalOffenceLabel.setFont(bigFont); panel.add(new JSeparator(JSeparator.HORIZONTAL), @@ -150,7 +151,7 @@ public class PreCombatDialog extends FreeColConfirmDialog { panel.add(finalOffenceResult); float defenceResult - = FeatureContainer.applyModifiers(0f, turn, defenceModifiers); + = FeatureContainer.applyModifiers(0f, turn, new ArrayList<>(defenceModifiers)); JLabel finalDefenceLabel = Utility.localizedLabel("finalResult"); finalDefenceLabel.setFont(bigFont); panel.add(finalDefenceLabel, "skip"); diff --git a/src/net/sf/freecol/client/gui/panel/colopedia/ResourcesDetailPanel.java b/src/net/sf/freecol/client/gui/panel/colopedia/ResourcesDetailPanel.java index eea89593a5d..a6b89823f8e 100644 --- a/src/net/sf/freecol/client/gui/panel/colopedia/ResourcesDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/colopedia/ResourcesDetailPanel.java @@ -19,6 +19,7 @@ package net.sf.freecol.client.gui.panel.colopedia; +import java.util.Collections; import java.util.List; import javax.swing.JButton; @@ -88,8 +89,8 @@ public class ResourcesDetailPanel panel.add(Utility.localizedLabel("colopedia.resource.bonusProduction")); JPanel goodsPanel = new JPanel(); goodsPanel.setOpaque(false); - List<Modifier> mods = sort(type.getModifiers(), - Modifier.ascendingModifierIndexComparator); + List<Modifier> mods = type.getModifiers(); + Collections.sort(mods, Modifier.ascendingModifierIndexComparator); for (Modifier modifier : mods) { String text = ModifierFormat.getModifierAsString(modifier); if (modifier.hasScope()) { diff --git a/src/net/sf/freecol/client/gui/panel/colopedia/UnitDetailPanel.java b/src/net/sf/freecol/client/gui/panel/colopedia/UnitDetailPanel.java index a48b23ad856..8fb6e9ed4e7 100644 --- a/src/net/sf/freecol/client/gui/panel/colopedia/UnitDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/colopedia/UnitDetailPanel.java @@ -21,6 +21,7 @@ package net.sf.freecol.client.gui.panel.colopedia; import java.awt.GridLayout; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -183,11 +184,11 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel<UnitType> { panel.add(textPane, "span, width 60%"); } - final Function<GoodsType, Stream<Modifier>> goodsMapper = gt -> - type.getModifiers(gt.getId()); - List<Modifier> bonusList - = sort(flatten(spec.getGoodsTypeList(), goodsMapper), - Modifier.ascendingModifierIndexComparator); + List<Modifier> bonusList = new ArrayList<>(); + for (GoodsType gt : spec.getGoodsTypeList()) + type.fillModifiers(bonusList, gt.getId()); + Collections.sort(bonusList, Modifier.ascendingModifierIndexComparator); + int bonusNumber = bonusList.size(); if (bonusNumber > 0) { StringTemplate template = StringTemplate diff --git a/src/net/sf/freecol/common/model/BuildQueue.java b/src/net/sf/freecol/common/model/BuildQueue.java index 4fb6e0248b5..fd73b153bc4 100644 --- a/src/net/sf/freecol/common/model/BuildQueue.java +++ b/src/net/sf/freecol/common/model/BuildQueue.java @@ -22,7 +22,6 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Stream; import net.sf.freecol.common.option.GameOptions; import static net.sf.freecol.common.util.CollectionUtils.*; @@ -218,8 +217,15 @@ public class BuildQueue<T extends BuildableType> implements Consumer { * {@inheritDoc} */ @Override - public Stream<Modifier> getModifiers(String id) { - return Stream.<Modifier>empty(); + public void fillModifiers(List<Modifier> result, String id) { + } + + /** + * {@inheritDoc} + */ + @Override + public List<Modifier> getModifiers(String id) { + return Collections.<Modifier>emptyList(); } diff --git a/src/net/sf/freecol/common/model/Building.java b/src/net/sf/freecol/common/model/Building.java index 85a1703e33d..653929c6de9 100644 --- a/src/net/sf/freecol/common/model/Building.java +++ b/src/net/sf/freecol/common/model/Building.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -143,22 +142,21 @@ public class Building extends WorkLocation * *multiplicative* modifiers, as this would capture the master blacksmith * doubling. * + * @param result The list to fill into * @param id The String identifier * @param turn The turn number of type {@link Turn} * @param unitType The optional {@code UnitType} to produce them. * @return A stream of the applicable modifiers. */ - public Stream<Modifier> getCompetenceModifiers(String id, + private void fillCompetenceModifiers(List<Modifier> result, String id, UnitType unitType, Turn turn) { final float competence = getCompetenceFactor(); - return (competence == 1.0f) // Floating comparison OK! - ? unitType.getModifiers(id, getType(), turn) - : map(unitType.getModifiers(id, getType(), turn), - m -> { - return (m.getType() == Modifier.ModifierType.ADDITIVE) - ? new Modifier(m).setValue(m.getValue() * competence) - : m; - }); + if (competence == 1.0f) // Floating comparison OK! + fillModifiers(result, id, getType(), turn); + else + for (Modifier m : unitType.getModifiers(id, getType(), turn)) + result.add((m.getType() == Modifier.ModifierType.ADDITIVE) + ? new Modifier(m).setValue(m.getValue() * competence) : m); } /** @@ -561,7 +559,7 @@ public class Building extends WorkLocation * {@inheritDoc} */ @Override - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { final BuildingType type = getType(); final String id = (goodsType == null) ? null : goodsType.getId(); @@ -569,15 +567,15 @@ public class Building extends WorkLocation final Player owner = getOwner(); final Turn turn = getGame().getTurn(); - return (unitType != null) - // With a unit, unit specific bonuses apply - ? concat(this.getModifiers(id, unitType, turn), - colony.getProductionModifiers(goodsType, unitType, this), - getCompetenceModifiers(id, unitType, turn), - owner.getModifiers(id, unitType, turn)) - // With no unit, only the building-specific bonuses - : concat(colony.getModifiers(id, type, turn), - owner.getModifiers(id, type, turn)); + if (unitType == null) { + colony.fillModifiers(result, id, type, turn); + owner.fillModifiers(result, id, type, turn); + } else { + this.fillModifiers(result, id, unitType, turn); + colony.fillProductionModifiers(result, goodsType, unitType, this); + fillCompetenceModifiers(result, id, unitType, turn); + owner.fillModifiers(result, id, unitType, turn); + } } /** @@ -652,10 +650,10 @@ public class Building extends WorkLocation * {@inheritDoc} */ @Override - public Stream<Modifier> getModifiers(String id, FreeColSpecObjectType fcgot, + public void fillModifiers(List<Modifier> result, String id, FreeColSpecObjectType fcgot, Turn turn) { // Buildings have no modifiers independent of type - return getType().getModifiers(id, fcgot, turn); + getType().fillModifiers(result, id, fcgot, turn); } diff --git a/src/net/sf/freecol/common/model/Colony.java b/src/net/sf/freecol/common/model/Colony.java index e960164fd84..67f1a307dad 100644 --- a/src/net/sf/freecol/common/model/Colony.java +++ b/src/net/sf/freecol/common/model/Colony.java @@ -32,7 +32,6 @@ import java.util.function.Function; import java.util.function.ToIntFunction; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -2058,23 +2057,24 @@ public class Colony extends Settlement implements Nameable, TradeLocation { /** - * Get the current production {@code Modifier}, which is + * Fill in the current production {@code Modifier}, which is * generated from the current production bonus. * + * @param result The {@code List} to fill into. * @param goodsType The {@code GoodsType} to produce. * @param unitType An optional {@code UnitType} to do the work. * @param wl The {@link WorkLocation} * @return A stream of suitable {@code Modifier}s. */ - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType, WorkLocation wl) { - if (productionBonus == 0) return Stream.<Modifier>empty(); + if (productionBonus == 0) return; int bonus = (int)Math.floor(productionBonus * wl.getRebelFactor()); Modifier mod = new Modifier(goodsType.getId(), bonus, Modifier.ModifierType.ADDITIVE, Specification.SOL_MODIFIER_SOURCE); mod.setModifierIndex(Modifier.COLONY_PRODUCTION_INDEX); - return Stream.of(mod); + result.add(mod); } /** @@ -2450,12 +2450,12 @@ loop: for (WorkLocation wl : getWorkLocationsForProducing(goodsType)) { final Turn turn = getGame().getTurn(); List<Modifier> mods; - mods = toList(goodsType.getModifiers(Modifier.LIBERTY)); + mods = goodsType.getModifiers(Modifier.LIBERTY); if (!mods.isEmpty()) { modifyLiberty((int)applyModifiers(amount, turn, mods)); } - mods = toList(goodsType.getModifiers(Modifier.IMMIGRATION)); + mods = goodsType.getModifiers(Modifier.IMMIGRATION); if (!mods.isEmpty()) { int migration = (int)applyModifiers(amount, turn, mods); modifyImmigration(migration); diff --git a/src/net/sf/freecol/common/model/ColonyTile.java b/src/net/sf/freecol/common/model/ColonyTile.java index e69f75d25aa..fb6ae92b2d8 100644 --- a/src/net/sf/freecol/common/model/ColonyTile.java +++ b/src/net/sf/freecol/common/model/ColonyTile.java @@ -22,7 +22,6 @@ package net.sf.freecol.common.model; import java.util.Collections; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -453,9 +452,9 @@ public class ColonyTile extends WorkLocation { * {@inheritDoc} */ @Override - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { - if (!canProduce(goodsType, unitType)) return Stream.<Modifier>empty(); + if (!canProduce(goodsType, unitType)) return; final Tile workTile = getWorkTile(); final TileType type = workTile.getType(); @@ -463,22 +462,24 @@ public class ColonyTile extends WorkLocation { final Colony colony = getColony(); final Player owner = colony.getOwner(); final Turn turn = getGame().getTurn(); - return (unitType != null) + + if (unitType != null) { // Unit modifiers apply - ? concat(workTile.getProductionModifiers(goodsType, unitType), - colony.getProductionModifiers(goodsType, unitType, this), - unitType.getModifiers(id, type, turn), - ((owner == null) ? null - : owner.getModifiers(id, unitType, turn))) + workTile.fillProductionModifiers(result, goodsType, unitType); + colony.fillProductionModifiers(result, goodsType, unitType, this); + unitType.fillModifiers(result, id, type, turn); + if (owner != null) + owner.fillModifiers(result, id, unitType, turn); + } else if (isColonyCenterTile()) { // Unattended only possible in center, colony modifiers apply - : (isColonyCenterTile()) - ? concat(workTile.getProductionModifiers(goodsType, null), - colony.getProductionModifiers(goodsType, null, this), - colony.getModifiers(id, null, turn), - ((owner == null) ? null - : owner.getModifiers(id, type, turn))) - // Otherwise impossible - : Stream.<Modifier>empty(); + workTile.fillProductionModifiers(result, goodsType, null); + colony.fillProductionModifiers(result, goodsType, null, this); + colony.fillModifiers(result, id, null, turn); + if (owner != null) + owner.fillModifiers(result, id, type, turn); + } + + // Otherwise impossible } /** diff --git a/src/net/sf/freecol/common/model/Consumer.java b/src/net/sf/freecol/common/model/Consumer.java index 5563f15033a..00192b2efb9 100644 --- a/src/net/sf/freecol/common/model/Consumer.java +++ b/src/net/sf/freecol/common/model/Consumer.java @@ -21,7 +21,6 @@ package net.sf.freecol.common.model; import java.util.Comparator; import java.util.List; -import java.util.stream.Stream; /** @@ -91,13 +90,25 @@ public interface Consumer { /** + * Fill in the modifier set with the given id. The modifier most + * relevant to consumers is "consumeOnlySurplusProduction", which + * implies that the consumer does not consume stored goods (used + * by the country and stables). + * + * @param result The list to fill {@code Modifier}s into. + * @param id The object identifier. + */ + public void fillModifiers(List<Modifier> result, String id); + + + /** * Get the modifier set with the given id. The modifier most * relevant to consumers is "consumeOnlySurplusProduction", which * implies that the consumer does not consume stored goods (used * by the country and stables). * * @param id The object identifier. - * @return The stream of {@code Modifier}s found. + * @return The list of {@code Modifier}s found. */ - public Stream<Modifier> getModifiers(String id); + public List<Modifier> getModifiers(String id); } diff --git a/src/net/sf/freecol/common/model/FeatureContainer.java b/src/net/sf/freecol/common/model/FeatureContainer.java index 7091faaaf6e..d2cfb88a312 100644 --- a/src/net/sf/freecol/common/model/FeatureContainer.java +++ b/src/net/sf/freecol/common/model/FeatureContainer.java @@ -20,12 +20,13 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import static net.sf.freecol.common.util.CollectionUtils.*; @@ -102,7 +103,7 @@ public final class FeatureContainer { * Is the given set of abilities non-empty and contains no * false-valued members? * - * @param abilities A stream of {@code Ability}s to check. + * @param abilities A list of {@code Ability}s to check. * @return True if the abilities are `satisfied'. */ public static boolean hasAbility(List<Ability> abilities) { @@ -221,30 +222,53 @@ public final class FeatureContainer { /** - * Gets the set of modifiers with the given identifier from this + * Fills in the set of modifiers with the given identifier from this * container. * + * @param result The {@code List} to fill into. * @param id The object identifier. * @param fcgot An optional {@code FreeColSpecObjectType} the * modifier applies to. * @param turn An optional applicable {@code Turn}. - * @return A stream of {@code Modifier}s. */ - public Stream<Modifier> getModifiers(String id, + public void fillModifiers(List<Modifier> result, + String id, FreeColSpecObjectType fcgot, Turn turn) { - if (!modifiersPresent()) return Stream.<Modifier>empty(); - Set<Modifier> mset = new HashSet<>(); + if (!modifiersPresent()) return; synchronized (modifiersLock) { if (id == null) { - for (Set<Modifier> ms : modifiers.values()) mset.addAll(ms); + for (Set<Modifier> ms : modifiers.values()) + for (Modifier m : ms) + if (m.appliesTo(fcgot, turn)) + result.add(m); } else { Set<Modifier> ms = modifiers.get(id); - if (ms != null) mset.addAll(ms); + if (ms != null) + for (Modifier m : ms) + result.add(m); } } - removeInPlace(mset, m -> !m.appliesTo(fcgot, turn)); - return (mset.isEmpty()) ? Stream.<Modifier>empty() : mset.stream(); + } + + /** + * Get a {@code List} of modifiers with the given identifier from this + * container. + * + * @param result The list to fill into. + * @param id The object identifier. + * @param fcgot An optional {@code FreeColSpecObjectType} the + * modifier applies to. + * @param turn An optional applicable {@code Turn}. + * @return A list of {@code Modifier}s. + */ + public List<Modifier> getModifiers(String id, + FreeColSpecObjectType fcgot, + Turn turn) { + if (!modifiersPresent()) return Collections.<Modifier>emptyList(); + List<Modifier> result = new ArrayList<>(); + fillModifiers(result, id, fcgot, turn); + return result; } /** @@ -272,39 +296,14 @@ public final class FeatureContainer { * @return The modified number. */ public static float applyModifiers(float number, Turn turn, - Collection<Modifier> mods) { - return (mods == null || mods.isEmpty()) ? number - : applyModifiers_internal(number, turn, - sort(mods, Modifier.ascendingModifierIndexComparator)); - } + List<Modifier> modifiers) { + if (modifiers == null) + return number; - /** - * Applies a stream of modifiers to the given float value. - * - * @param number The number to modify. - * @param turn An optional applicable {@code Turn}. - * @param mods The {@code Modifier}s to apply. - * @return The modified number. - */ - public static float applyModifiers(float number, Turn turn, - Stream<Modifier> mods) { - return (mods == null) ? number - : applyModifiers_internal(number, turn, - sort(mods, Modifier.ascendingModifierIndexComparator)); - } + Collections.sort(modifiers, Modifier.ascendingModifierIndexComparator); - /** - * Implement applyModifiers. - * - * @param number The number to modify. - * @param turn An optional applicable {@code Turn}. - * @param mods The {@code Modifier}s to apply. - * @return The modified number. - */ - private static float applyModifiers_internal(float number, Turn turn, - Collection<Modifier> mods) { float result = number; - for (Modifier m : mods) { + for (Modifier m : modifiers) { float value = m.getValue(turn); if (Float.compare(value, Modifier.UNKNOWN) == 0) { return value; @@ -514,7 +513,7 @@ public final class FeatureContainer { sb.append(']'); } siz = sb.length(); - for (Modifier modifier : iterable(getModifiers(null, null, null))) { + for (Modifier modifier : getModifiers(null, null, null)) { sb.append(' ').append(modifier); } if (sb.length() > siz) { diff --git a/src/net/sf/freecol/common/model/FreeColObject.java b/src/net/sf/freecol/common/model/FreeColObject.java index e93de77f818..f584d08a93f 100644 --- a/src/net/sf/freecol/common/model/FreeColObject.java +++ b/src/net/sf/freecol/common/model/FreeColObject.java @@ -29,12 +29,13 @@ import java.io.IOException; import java.io.OutputStream; import java.io.StringReader; import java.io.StringWriter; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -563,7 +564,7 @@ public abstract class FreeColObject */ public boolean hasModifier(String id, FreeColSpecObjectType fcgot, Turn turn) { - return any(getModifiers(id, fcgot, turn)); + return getModifiers(id, fcgot, turn).size() != 0; } /** @@ -573,7 +574,7 @@ public abstract class FreeColObject * @return True if the key is present. */ public final boolean containsModifierKey(String key) { - return any(getModifiers(key)); + return getModifiers(key).size() != 0; } /** @@ -582,7 +583,18 @@ public abstract class FreeColObject * @return A list of modifiers. */ public final List<Modifier> getSortedModifiers() { - return sort(getModifiers(), Modifier.ascendingModifierIndexComparator); + List<Modifier> result = getModifiers(); + Collections.sort(result, Modifier.ascendingModifierIndexComparator); + return result; + } + + /** + * Fill in the modifiers of this object. + * + * @param result list to fill in the modifiers. + */ + public final void fillModifiers(List<Modifier> result) { + fillModifiers(result, null); } /** @@ -590,51 +602,98 @@ public abstract class FreeColObject * * @return A set of modifiers. */ - public final Stream<Modifier> getModifiers() { - return getModifiers(null); + public final List<Modifier> getModifiers() { + List<Modifier> result = new ArrayList<>(); + fillModifiers(result); + return result; } /** - * Gets the set of modifiers with the given identifier from this object. + * Fill in the set of modifiers with the given identifier from this object. * + * @param list The list to fill into. * @param id The object identifier. + */ + public final void fillModifiers(List<Modifier> result, String id) { + fillModifiers(result, id, null); + } + + /** + * Get the set of modifiers with the given identifier from this object. + * + * @param id The object identifier. + * * @return A set of modifiers. */ - public final Stream<Modifier> getModifiers(String id) { - return getModifiers(id, null); + public final List<Modifier> getModifiers(String id) { + List<Modifier> result = new ArrayList<>(); + fillModifiers(result, id); + return result; } /** - * Gets the set of modifiers with the given identifier from this object. + * Fill in the set of modifiers with the given identifier from this object. * + * @param result The list to fill into. * @param id The object identifier. * @param fcgot An optional {@code FreeColSpecObjectType} the * modifier applies to. - * @return A set of modifiers. */ - public final Stream<Modifier> getModifiers(String id, + public final void fillModifiers(List<Modifier> result, String id, FreeColSpecObjectType fcgot) { - return getModifiers(id, fcgot, null); + fillModifiers(result, id, fcgot, null); } /** * Gets the set of modifiers with the given identifier from this object. * + * @param id The object identifier. + * @param fcgot An optional {@code FreeColSpecObjectType} the + * modifier applies to. + * @return A list of modifiers. + */ + public final List<Modifier> getModifiers(String id, + FreeColSpecObjectType fcgot) { + List<Modifier> result = new ArrayList<>(); + fillModifiers(result, id, fcgot); + return result; + } + + /** + * Fills in the set of modifiers with the given identifier from this object. + * * Subclasses with complex modifier handling may override this * routine. * + * @param result The list to fill into. * @param id The object identifier. * @param fcgot An optional {@code FreeColSpecObjectType} the * modifier applies to. * @param turn An optional applicable {@code Turn}. - * @return A set of modifiers. */ - public Stream<Modifier> getModifiers(String id, + public void fillModifiers(List<Modifier> result, String id, FreeColSpecObjectType fcgot, Turn turn) { FeatureContainer fc = getFeatureContainer(); - return (fc == null) ? Stream.<Modifier>empty() - : fc.getModifiers(id, fcgot, turn); + if (fc != null) + fc.fillModifiers(result, id, fcgot, turn); + } + + /** + * Gets the set of modifiers with the given identifier from this object. + * + * @param id The object identifier. + * @param fcgot An optional {@code FreeColSpecObjectType} the + * modifier applies to. + * @param turn An optional applicable {@code Turn}. + * @return A list of modifiers. + */ + public List<Modifier> getModifiers(String id, + FreeColSpecObjectType fcgot, + Turn turn) { + List<Modifier> result = new ArrayList<>(); + fillModifiers(result, id, fcgot, turn); + return result; } /** @@ -675,20 +734,7 @@ public abstract class FreeColObject * @return The modified number. */ public static final float applyModifiers(float number, Turn turn, - Collection<Modifier> mods) { - return FeatureContainer.applyModifiers(number, turn, mods); - } - - /** - * Applies a stream of modifiers to the given number. - * - * @param number The number to modify. - * @param turn An optional applicable {@code Turn}. - * @param mods The {@code Modifier}s to apply. - * @return The modified number. - */ - public static final float applyModifiers(float number, Turn turn, - Stream<Modifier> mods) { + List<Modifier> mods) { return FeatureContainer.applyModifiers(number, turn, mods); } @@ -753,7 +799,7 @@ public abstract class FreeColObject * @return A list of defence {@code Modifier}s. */ public List<Modifier> getDefenceModifiers() { - return toList(getModifiers(Modifier.DEFENCE)); + return getModifiers(Modifier.DEFENCE); } diff --git a/src/net/sf/freecol/common/model/LostCityRumour.java b/src/net/sf/freecol/common/model/LostCityRumour.java index 12526637a2c..48ef7947e20 100644 --- a/src/net/sf/freecol/common/model/LostCityRumour.java +++ b/src/net/sf/freecol/common/model/LostCityRumour.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -343,9 +342,8 @@ public class LostCityRumour extends TileItem { * {@inheritDoc} */ @Override - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { - return Stream.<Modifier>empty(); } /** diff --git a/src/net/sf/freecol/common/model/ProductionCache.java b/src/net/sf/freecol/common/model/ProductionCache.java index 38433c0329f..7cc7ccbe102 100644 --- a/src/net/sf/freecol/common/model/ProductionCache.java +++ b/src/net/sf/freecol/common/model/ProductionCache.java @@ -125,8 +125,8 @@ public class ProductionCache { List<AbstractGoods> goods = new ArrayList<>(); for (Consumer consumer : colony.getConsumers()) { - List<Modifier> modifiers = toList(consumer - .getModifiers(Modifier.CONSUME_ONLY_SURPLUS_PRODUCTION)); + List<Modifier> modifiers = + consumer.getModifiers(Modifier.CONSUME_ONLY_SURPLUS_PRODUCTION); goods.clear(); for (AbstractGoods g : consumer.getConsumedGoods()) { goodsUsed.add(g.getType()); diff --git a/src/net/sf/freecol/common/model/Resource.java b/src/net/sf/freecol/common/model/Resource.java index d1cc29838a2..37accc50c46 100644 --- a/src/net/sf/freecol/common/model/Resource.java +++ b/src/net/sf/freecol/common/model/Resource.java @@ -20,7 +20,7 @@ package net.sf.freecol.common.model; import java.util.logging.Logger; -import java.util.stream.Stream; +import java.util.List; import javax.xml.stream.XMLStreamException; @@ -233,10 +233,10 @@ public class Resource extends TileItem { * {@inheritDoc} */ @Override - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { - return (goodsType == null) ? Stream.<Modifier>empty() - : getType().getModifiers(goodsType.getId(), unitType); + if (goodsType != null) + getType().fillModifiers(result, goodsType.getId(), unitType); } /** diff --git a/src/net/sf/freecol/common/model/SimpleCombatModel.java b/src/net/sf/freecol/common/model/SimpleCombatModel.java index ed992f0ff23..aeea63e63f7 100644 --- a/src/net/sf/freecol/common/model/SimpleCombatModel.java +++ b/src/net/sf/freecol/common/model/SimpleCombatModel.java @@ -150,7 +150,7 @@ public class SimpleCombatModel extends CombatModel { || combatIsSettlementAttack(attacker, defender)) { Set<Modifier> mods = getOffensiveModifiers(attacker, defender); Turn turn = attacker.getGame().getTurn(); - result = FeatureContainer.applyModifiers(0.0f, turn, mods); + result = FeatureContainer.applyModifiers(0.0f, turn, new ArrayList<>(mods)); if (lb != null) { logModifiers(lb, mods); lb.add(" = ", result); @@ -203,7 +203,7 @@ public class SimpleCombatModel extends CombatModel { || combatIsBombard(attacker, defender)) { Set<Modifier> mods = getDefensiveModifiers(attacker, defender); Turn turn = defender.getGame().getTurn(); - result = FeatureContainer.applyModifiers(0.0f, turn, mods); + result = FeatureContainer.applyModifiers(0.0f, turn, new ArrayList<>(mods)); if (lb != null) { logModifiers(lb, mods); lb.add(" = ", result); @@ -252,9 +252,9 @@ public class SimpleCombatModel extends CombatModel { // Special bonuses against certain nation types if (defender instanceof Ownable) { Player owner = ((Ownable)defender).getOwner(); - result.addAll(toList(attackerUnit - .getModifiers(Modifier.OFFENCE_AGAINST, - owner.getNationType()))); + result.addAll( + attackerUnit.getModifiers(Modifier.OFFENCE_AGAINST, + owner.getNationType())); } // Land/naval specific @@ -293,7 +293,7 @@ public class SimpleCombatModel extends CombatModel { Set<Modifier> result) { // Attack bonus final Specification spec = attacker.getSpecification(); - result.addAll(toList(spec.getModifiers(Modifier.ATTACK_BONUS))); + result.addAll(spec.getModifiers(Modifier.ATTACK_BONUS)); // Goods penalty always applies int goodsCount = attacker.getGoodsSpaceTaken(); @@ -336,15 +336,15 @@ public class SimpleCombatModel extends CombatModel { final Specification spec = attacker.getSpecification(); // Attack bonus - result.addAll(toList(spec.getModifiers(Modifier.ATTACK_BONUS))); + result.addAll(spec.getModifiers(Modifier.ATTACK_BONUS)); // Movement penalty switch (attacker.getMovesLeft()) { case 1: - result.addAll(toList(spec.getModifiers(Modifier.BIG_MOVEMENT_PENALTY))); + result.addAll(spec.getModifiers(Modifier.BIG_MOVEMENT_PENALTY)); break; case 2: - result.addAll(toList(spec.getModifiers(Modifier.SMALL_MOVEMENT_PENALTY))); + result.addAll(spec.getModifiers(Modifier.SMALL_MOVEMENT_PENALTY)); break; default: break; @@ -352,7 +352,7 @@ public class SimpleCombatModel extends CombatModel { // Amphibious attack? if (combatIsAmphibious(attacker, defender)) { - result.addAll(toList(spec.getModifiers(Modifier.AMPHIBIOUS_ATTACK))); + result.addAll(spec.getModifiers(Modifier.AMPHIBIOUS_ATTACK)); } if (combatIsAttackMeasurement(attacker, defender)) { @@ -360,7 +360,7 @@ public class SimpleCombatModel extends CombatModel { } else if (combatIsSettlementAttack(attacker, defender)) { // Settlement present, apply bombardment bonus - result.addAll(toList(attacker.getModifiers(Modifier.BOMBARD_BONUS))); + result.addAll(attacker.getModifiers(Modifier.BOMBARD_BONUS)); // Popular support bonus if (combatIsWarOfIndependence(attacker, defender)) { @@ -373,7 +373,7 @@ public class SimpleCombatModel extends CombatModel { if (tile != null) { if (tile.hasSettlement()) { // Bombard bonus applies to settlement defence - result.addAll(toList(attacker.getModifiers(Modifier.BOMBARD_BONUS))); + result.addAll(attacker.getModifiers(Modifier.BOMBARD_BONUS)); // Popular support bonus if (combatIsWarOfIndependence(attacker, defender)) { @@ -400,7 +400,7 @@ public class SimpleCombatModel extends CombatModel { && attacker.getSettlement() == null && attacker.getState() != Unit.UnitState.FORTIFIED && defenderUnit.getSettlement() == null) { - result.addAll(toList(spec.getModifiers(Modifier.ARTILLERY_IN_THE_OPEN))); + result.addAll(spec.getModifiers(Modifier.ARTILLERY_IN_THE_OPEN)); } } else { throw new IllegalStateException("Bogus combat"); @@ -534,7 +534,7 @@ public class SimpleCombatModel extends CombatModel { // Artillery in the Open penalty if (defender.hasAbility(Ability.BOMBARD) && defender.getState() != Unit.UnitState.FORTIFIED) { - result.addAll(toList(spec.getModifiers(Modifier.ARTILLERY_IN_THE_OPEN))); + result.addAll(spec.getModifiers(Modifier.ARTILLERY_IN_THE_OPEN)); } } else { // In settlement @@ -545,7 +545,7 @@ public class SimpleCombatModel extends CombatModel { if (defender.hasAbility(Ability.BOMBARD) && attacker != null && ((Unit)attacker).getOwner().isIndian()) { - result.addAll(toList(spec.getModifiers(Modifier.ARTILLERY_AGAINST_RAID))); + result.addAll(spec.getModifiers(Modifier.ARTILLERY_AGAINST_RAID)); } // Automatic defensive role (e.g. Revere) @@ -565,7 +565,7 @@ public class SimpleCombatModel extends CombatModel { // Fortify bonus if (defender.getState() == Unit.UnitState.FORTIFIED && !disableFortified) { - result.addAll(toList(spec.getModifiers(Modifier.FORTIFIED))); + result.addAll(spec.getModifiers(Modifier.FORTIFIED)); } } } diff --git a/src/net/sf/freecol/common/model/Specification.java b/src/net/sf/freecol/common/model/Specification.java index 8564f3e2a52..63ec6f2461d 100644 --- a/src/net/sf/freecol/common/model/Specification.java +++ b/src/net/sf/freecol/common/model/Specification.java @@ -34,7 +34,6 @@ import java.util.function.Predicate; import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -947,9 +946,11 @@ public final class Specification { * @param id The object identifier to look for. * @return A stream of {@code Modifier}s. */ - public Stream<Modifier> getModifiers(String id) { + public List<Modifier> getModifiers(String id) { List<Modifier> result = allModifiers.get(id); - return (result == null) ? Stream.<Modifier>empty() : result.stream(); + return ((result == null) + ? Collections.<Modifier>emptyList() + : new ArrayList<Modifier>(result)); // copy to allow modification } @@ -2303,7 +2304,7 @@ public final class Specification { // @compat 0.11.3 // Added the cargo penalty modifier - if (none(getModifiers(Modifier.CARGO_PENALTY))) { + if (getModifiers(Modifier.CARGO_PENALTY).size() == 0) { addModifier(new Modifier(Modifier.CARGO_PENALTY, -12.5f, Modifier.ModifierType.PERCENTAGE, CARGO_PENALTY_SOURCE, Modifier.GENERAL_COMBAT_INDEX)); @@ -2323,7 +2324,7 @@ public final class Specification { // @compat 0.11.5 // Added a modifier to hardy pioneer UnitType hardyPioneer = getUnitType("model.unit.hardyPioneer"); - if (none(hardyPioneer.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION))) { + if (hardyPioneer.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION).size() == 0) { Modifier m = new Modifier(Modifier.TILE_TYPE_CHANGE_PRODUCTION, 2.0f, Modifier.ModifierType.MULTIPLICATIVE); Scope scope = new Scope(); diff --git a/src/net/sf/freecol/common/model/Tile.java b/src/net/sf/freecol/common/model/Tile.java index 897fcc70acb..e1ebd454862 100644 --- a/src/net/sf/freecol/common/model/Tile.java +++ b/src/net/sf/freecol/common/model/Tile.java @@ -33,7 +33,6 @@ import java.util.function.ToIntFunction; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -1661,15 +1660,24 @@ public final class Tile extends UnitLocation implements Named, Ownable { /** * Get the production modifiers for this tile. * + * @param result The {@code List} to fill into. * @param goodsType The {@code GoodsType} to produce. * @param unitType An optional {@code UnitType} to do the work. * @return A stream of production {@code Modifier}s. */ - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { - return (canProduce(goodsType, unitType) && tileItemContainer != null) - ? tileItemContainer.getProductionModifiers(goodsType, unitType) - : Stream.<Modifier>empty(); + if (canProduce(goodsType, unitType) && tileItemContainer != null) + tileItemContainer.fillProductionModifiers(result, goodsType, unitType); + } + + /** + * {@inheritDoc} + */ + public List<Modifier> getProductionModifiers(GoodsType goodsType, UnitType unitType) { + List<Modifier> result = new ArrayList<>(); + fillProductionModifiers(result, goodsType, unitType); + return result; } /** diff --git a/src/net/sf/freecol/common/model/TileImprovement.java b/src/net/sf/freecol/common/model/TileImprovement.java index e04804c782e..7bde46857e1 100644 --- a/src/net/sf/freecol/common/model/TileImprovement.java +++ b/src/net/sf/freecol/common/model/TileImprovement.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.function.Function; import java.util.logging.Logger; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -502,17 +501,16 @@ public class TileImprovement extends TileItem implements Named { * {@inheritDoc} */ @Override - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { final Specification spec = getSpecification(); Modifier m; - return (goodsType != null && isComplete() + if (goodsType != null && isComplete() && !(/* unattended */ !isNatural() && unitType == null && !goodsType.isFoodType() && spec.getBoolean(GameOptions.ONLY_NATURAL_IMPROVEMENTS)) && (m = getProductionModifier(goodsType)) != null) - ? Stream.of(m) - : Stream.<Modifier>empty(); + result.add(m); } /** diff --git a/src/net/sf/freecol/common/model/TileItem.java b/src/net/sf/freecol/common/model/TileItem.java index 4b98f642fc0..5b9b2ba8f3f 100644 --- a/src/net/sf/freecol/common/model/TileItem.java +++ b/src/net/sf/freecol/common/model/TileItem.java @@ -19,8 +19,9 @@ package net.sf.freecol.common.model; +import java.util.ArrayList; import java.util.logging.Logger; -import java.util.stream.Stream; +import java.util.List; import javax.xml.stream.XMLStreamException; @@ -121,14 +122,28 @@ public abstract class TileItem extends FreeColGameObject UnitType unitType); /** + * Fill in the production modifiers for the given type of goods and unit. + * + * @param result The {@code List} to fill into. + * @param goodsType The {@code GoodsType} to produce. + * @param unitType The optional {@code unitType} to produce them. + */ + public abstract void fillProductionModifiers(List<Modifier> mods, GoodsType goodsType, + UnitType unitType); + + /** * Gets the production modifiers for the given type of goods and unit. * * @param goodsType The {@code GoodsType} to produce. * @param unitType The optional {@code unitType} to produce them. * @return A stream of the applicable modifiers. */ - public abstract Stream<Modifier> getProductionModifiers(GoodsType goodsType, - UnitType unitType); + public List<Modifier> getProductionModifiers(GoodsType goodsType, + UnitType unitType) { + List<Modifier> result = new ArrayList<>(); + fillProductionModifiers(result, goodsType, unitType); + return result; + } /** * Is this a natural TileItem? diff --git a/src/net/sf/freecol/common/model/TileItemContainer.java b/src/net/sf/freecol/common/model/TileItemContainer.java index 7d4f0aeb7c8..72e04532686 100644 --- a/src/net/sf/freecol/common/model/TileItemContainer.java +++ b/src/net/sf/freecol/common/model/TileItemContainer.java @@ -22,7 +22,6 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -419,11 +418,11 @@ public class TileItemContainer extends FreeColGameObject { * @param unitType The optional {@code unitType} to produce them. * @return A stream of the applicable {@code Modifier}s. */ - public Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType) { synchronized (tileItems) { - return flatten(tileItems, - ti -> ti.getProductionModifiers(goodsType, unitType)); + for (TileItem ti : tileItems) + ti.fillProductionModifiers(result, goodsType, unitType); } } diff --git a/src/net/sf/freecol/common/model/Unit.java b/src/net/sf/freecol/common/model/Unit.java index 41a21952375..f288085f91b 100644 --- a/src/net/sf/freecol/common/model/Unit.java +++ b/src/net/sf/freecol/common/model/Unit.java @@ -28,7 +28,6 @@ import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; -import java.util.stream.Stream; import java.util.logging.Logger; import javax.xml.stream.XMLStreamException; @@ -3226,12 +3225,13 @@ public class Unit extends GoodsLocation */ public int getLineOfSight() { final Turn turn = getGame().getTurn(); - return (int)applyModifiers(unitType.getLineOfSight(), turn, - Stream.concat(this.getModifiers(Modifier.LINE_OF_SIGHT_BONUS, - unitType, turn), - ((hasTile() && getTile().isExplored()) - ? getTile().getType().getModifiers(Modifier.LINE_OF_SIGHT_BONUS, unitType, turn) - : Stream.<Modifier>empty()))); + List<Modifier> modifiers = new ArrayList<>(); + + this.fillModifiers(modifiers, Modifier.LINE_OF_SIGHT_BONUS, unitType, turn); + if (hasTile() && getTile().isExplored()) + getTile().getType().fillModifiers(modifiers, Modifier.LINE_OF_SIGHT_BONUS, unitType, turn); + + return (int)applyModifiers(unitType.getLineOfSight(), turn, modifiers); } /** @@ -4271,17 +4271,16 @@ public class Unit extends GoodsLocation * {@inheritDoc} */ @Override - public Stream<Modifier> getModifiers(String id, FreeColSpecObjectType fcgot, + public void fillModifiers(List<Modifier> result, String id, FreeColSpecObjectType fcgot, Turn turn) { - final Player owner = getOwner(); - final UnitType unitType = getType(); + // UnitType modifiers always apply. + getType().fillModifiers(result, id, fcgot, turn); + + // The player's modifiers apply. + getOwner().fillModifiers(result, id, fcgot, turn); - return concat(// UnitType modifiers always apply. - unitType.getModifiers(id, fcgot, turn), - // The player's modifiers apply. - owner.getModifiers(id, fcgot, turn), - // Role modifiers apply. - role.getModifiers(id, fcgot, turn)); + // Role modifiers apply. + role.fillModifiers(result, id, fcgot, turn); } diff --git a/src/net/sf/freecol/common/model/WorkLocation.java b/src/net/sf/freecol/common/model/WorkLocation.java index 74362e90ac3..f69039ef2fa 100644 --- a/src/net/sf/freecol/common/model/WorkLocation.java +++ b/src/net/sf/freecol/common/model/WorkLocation.java @@ -19,6 +19,7 @@ package net.sf.freecol.common.model; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -26,7 +27,6 @@ import java.util.HashMap; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -872,14 +872,30 @@ public abstract class WorkLocation extends UnitLocation * unit type. If no unit is specified the unattended production * is calculated. * + * @param result The result list to fill into. * @param goodsType The {@code GoodsType} to produce. * @param unitType The optional {@code UnitType} to produce them. - * @return A stream of the applicable modifiers. */ - public abstract Stream<Modifier> getProductionModifiers(GoodsType goodsType, + public abstract void fillProductionModifiers(List<Modifier> result, GoodsType goodsType, UnitType unitType); /** + * Gets the production modifiers for the given type of goods and + * unit type. If no unit is specified the unattended production + * is calculated. + * + * @param goodsType The {@code GoodsType} to produce. + * @param unitType The optional {@code UnitType} to produce them. + * @return A list of the applicable modifiers. + */ + public List<Modifier> getProductionModifiers(GoodsType goodsType, + UnitType unitType) { + List<Modifier> result = new ArrayList<>(); + fillProductionModifiers(result, goodsType, unitType); + return result; + } + + /** * Get the production types available for this work location. * * @param unattended If true, get unattended production types. diff --git a/src/net/sf/freecol/server/ai/NativeAIPlayer.java b/src/net/sf/freecol/server/ai/NativeAIPlayer.java index 87be4e3bac9..baf90fabdf1 100644 --- a/src/net/sf/freecol/server/ai/NativeAIPlayer.java +++ b/src/net/sf/freecol/server/ai/NativeAIPlayer.java @@ -816,7 +816,7 @@ public class NativeAIPlayer extends MissionAIPlayer { for (NativeTradeItem nti : nt.getUnitToSettlement()) { if (nti.priceIsSet()) continue; int price = (int)FeatureContainer.applyModifiers(1.0f / anger - * is.getPriceToBuy(nti.getGoods()), turn, modifiers); + * is.getPriceToBuy(nti.getGoods()), turn, new ArrayList<>(modifiers)); for (int h = nti.getHaggleCount(); h >= 0; h--) { price = NativeTrade.haggleUp(price); } @@ -837,7 +837,7 @@ public class NativeAIPlayer extends MissionAIPlayer { } for (NativeTradeItem nti : nt.getSettlementToUnit()) { int price = (int)FeatureContainer.applyModifiers((float)anger - * is.getPriceToSell(nti.getGoods()), turn, modifiers); + * is.getPriceToSell(nti.getGoods()), turn, new ArrayList<>(modifiers)); for (int h = nti.getHaggleCount(); h >= 0; h--) { price = NativeTrade.haggleDown(price); } diff --git a/src/net/sf/freecol/server/model/ServerPlayer.java b/src/net/sf/freecol/server/model/ServerPlayer.java index e49d8b2d602..836bdcf29d0 100644 --- a/src/net/sf/freecol/server/model/ServerPlayer.java +++ b/src/net/sf/freecol/server/model/ServerPlayer.java @@ -1927,7 +1927,7 @@ outer: for (Effect effect : effects) { } // Some modifiers are special - for (Modifier m : iterable(father.getModifiers())) { + for (Modifier m : father.getModifiers()) { if (Modifier.LINE_OF_SIGHT_BONUS.equals(m.getId())) { // Check for tiles that are now visible. They need to be // explored, and always updated so that units are visible. diff --git a/test/src/net/sf/freecol/common/model/BuildingTest.java b/test/src/net/sf/freecol/common/model/BuildingTest.java index 5a1ea0492cc..92adb8eb592 100644 --- a/test/src/net/sf/freecol/common/model/BuildingTest.java +++ b/test/src/net/sf/freecol/common/model/BuildingTest.java @@ -689,13 +689,13 @@ public class BuildingTest extends FreeColTestCase { List<Modifier> modifiers; Colony colony = getStandardColony(2); - modifiers = toList(colony.getModifiers(Modifier.DEFENCE)); + modifiers = colony.getModifiers(Modifier.DEFENCE); assertEquals(1, modifiers.size()); Modifier modifier = first(modifiers); assertEquals(50f, modifier.getValue()); assertEquals(ModifierType.PERCENTAGE, modifier.getType()); - modifiers = toList(stockadeType.getModifiers(Modifier.DEFENCE)); + modifiers = stockadeType.getModifiers(Modifier.DEFENCE); assertEquals(1, modifiers.size()); modifier = first(modifiers); assertEquals(100f, modifier.getValue()); @@ -703,7 +703,7 @@ public class BuildingTest extends FreeColTestCase { assertEquals(0f, stockadeType.applyModifiers(0f, turn, Modifier.MINIMUM_COLONY_SIZE)); - modifiers = toList(fortType.getModifiers(Modifier.DEFENCE)); + modifiers = fortType.getModifiers(Modifier.DEFENCE); assertEquals(1, modifiers.size()); modifier = first(modifiers); assertEquals(150f, modifier.getValue()); @@ -711,7 +711,7 @@ public class BuildingTest extends FreeColTestCase { assertEquals(0f, stockadeType.applyModifiers(0f, turn, Modifier.MINIMUM_COLONY_SIZE)); - modifiers = toList(fortressType.getModifiers(Modifier.DEFENCE)); + modifiers = fortressType.getModifiers(Modifier.DEFENCE); assertEquals(1, modifiers.size()); modifier = first(modifiers); assertEquals(200f, modifier.getValue()); @@ -827,6 +827,13 @@ public class BuildingTest extends FreeColTestCase { colony.getNetProductionOf(horsesType)); } + public static boolean anyMod(List<Modifier> mods, Modifier modifier) { + for (Modifier m : mods) + if (m == modifier) + return true; + return false; + } + public void testTownhallProduction() { final Game game = getGame(); game.setMap(getTestMap(true)); @@ -843,7 +850,7 @@ public class BuildingTest extends FreeColTestCase { for (Unit u : building.getUnits()) u.setLocation(tile); assertTrue("No initial modifiers", - none(colony.getModifiers("model.goods.bells"))); + colony.getModifiers("model.goods.bells").size() == 0); assertEquals("Initial bell production", 1, building.getTotalProductionOf(bellsType)); @@ -858,29 +865,25 @@ public class BuildingTest extends FreeColTestCase { // Add Jefferson. FoundingFather jefferson = spec() .getFoundingFather("model.foundingFather.thomasJefferson"); - List<Modifier> modifiers = toList(jefferson.getModifiers("model.goods.bells")); + List<Modifier> modifiers = jefferson.getModifiers("model.goods.bells"); assertEquals("Jefferson modifier size", 1, modifiers.size()); Modifier bellsModifier = first(modifiers); owner.addFather(jefferson); // Jefferson is a property of the player... assertTrue("Jefferson should be present in player", - any(owner.getModifiers("model.goods.bells"), - m -> m == bellsModifier)); + anyMod(owner.getModifiers("model.goods.bells"), bellsModifier)); assertTrue("Jefferson should be present in player in building scope", - any(owner.getModifiers("model.goods.bells", townHallType, turn), - m -> m == bellsModifier)); + anyMod(owner.getModifiers("model.goods.bells", townHallType, turn), bellsModifier)); assertFalse("Jefferson should not be present in player in unit scope", - any(owner.getModifiers("model.goods.bells", freeColonistType, turn), - m -> m == bellsModifier)); + anyMod(owner.getModifiers("model.goods.bells", freeColonistType, turn), bellsModifier)); + // ...not the colony, assertFalse("Jefferson modifier should not be present in colony", - any(colony.getModifiers("model.goods.bells"), - m -> m == bellsModifier)); + anyMod(colony.getModifiers("model.goods.bells"), bellsModifier)); // ...and the building modifiers do not have it. assertFalse("Jefferson modifier should not be present in building modifiers", - any(building.getModifiers("model.goods.bells"), - m -> m == bellsModifier)); + anyMod(building.getModifiers("model.goods.bells"), bellsModifier)); // 3(colonist) assertEquals("Production(Colonist/Jefferson)", 3, @@ -1005,7 +1008,7 @@ public class BuildingTest extends FreeColTestCase { : output.getAmount(); if (expect != output.getAmount()) { assertTrue("Modifiers expected", - count(type.getModifiers(outputType.getId())) > 0); + type.getModifiers().size() > 0); } assertEquals("Wrong productivity for " + type + " in " + building, expect, productivity); diff --git a/test/src/net/sf/freecol/common/model/ColonyTest.java b/test/src/net/sf/freecol/common/model/ColonyTest.java index c30fcff0996..a8034b6c074 100644 --- a/test/src/net/sf/freecol/common/model/ColonyTest.java +++ b/test/src/net/sf/freecol/common/model/ColonyTest.java @@ -184,8 +184,12 @@ public class ColonyTest extends FreeColTestCase { } private int countParties(Colony colony) { - return count(colony.getModifiers("model.goods.bells"), - m -> Specification.COLONY_GOODS_PARTY_SOURCE.equals(m.getSource())); + Modifier mods = colony.getModifiers("model.goods.bells"); + int cnt = 0; + for (Modifier m : mods) + if (Specification.COLONY_GOODS_PARTY_SOURCE.equals(m.getSource())) + cnt++; + return cnt; } public void testTeaParty() { diff --git a/test/src/net/sf/freecol/common/model/CombatTest.java b/test/src/net/sf/freecol/common/model/CombatTest.java index 7c5858ccbea..2ab01a91908 100644 --- a/test/src/net/sf/freecol/common/model/CombatTest.java +++ b/test/src/net/sf/freecol/common/model/CombatTest.java @@ -116,11 +116,11 @@ public class CombatTest extends FreeColTestCase { assertFalse(colonist.hasAbility(Ability.AMBUSH_PENALTY)); final Modifier bigMovementPenalty - = first(spec().getModifiers(Modifier.BIG_MOVEMENT_PENALTY)); + = first(spec().getModifiers(Modifier.BIG_MOVEMENT_PENALTY); final Modifier attackModifier = first(spec().getModifiers(Modifier.ATTACK_BONUS)); final List<Modifier> veteranModifiers - = toList(veteranType.getModifiers(Modifier.OFFENCE)); + = veteranType.getModifiers(Modifier.OFFENCE); assertEquals(1, veteranModifiers.size()); final Modifier veteranModifier = first(veteranModifiers); @@ -139,7 +139,7 @@ public class CombatTest extends FreeColTestCase { final Modifier fortifiedModifier = first(spec().getModifiers(Modifier.FORTIFIED)); - final List<Modifier> hillsModifiers = toList(hills.getDefenceModifiers()); + final List<Modifier> hillsModifiers = hills.getDefenceModifiers(); assertEquals(1, hillsModifiers.size()); Modifier hillsModifier = first(hillsModifiers); @@ -311,8 +311,8 @@ public class CombatTest extends FreeColTestCase { Set<Modifier> defenceModifiers = combatModel .getDefensiveModifiers(attacker, colonist); - forEach(soldierRole.getModifiers(Modifier.DEFENCE), - m -> assertTrue(defenceModifiers.contains(m))); + for (Modifier m : soldierRole.getModifiers(Modifier.DEFENCE)) + assertTrue(defenceModifiers.contains(m)); } public void testDefendSettlement() { @@ -345,8 +345,8 @@ public class CombatTest extends FreeColTestCase { Set<Modifier> defenceModifiers = combatModel .getDefensiveModifiers(attacker, defender); - forEach(nativeDragoonRole.getModifiers(Modifier.DEFENCE), - m -> assertTrue(defenceModifiers.contains(m))); + for (Modifier m : nativeDragoonRole.getModifiers(Modifier.DEFENCE)) + assertTrue(defenceModifiers.contains(m)); } public void testAttackIgnoresMovementPoints() throws Exception { diff --git a/test/src/net/sf/freecol/common/model/FoundingFatherTest.java b/test/src/net/sf/freecol/common/model/FoundingFatherTest.java index a9bea46ee66..93f75dd1a65 100644 --- a/test/src/net/sf/freecol/common/model/FoundingFatherTest.java +++ b/test/src/net/sf/freecol/common/model/FoundingFatherTest.java @@ -69,7 +69,7 @@ public class FoundingFatherTest extends FreeColTestCase { spec().addModifier(modifier); dutch.addFather(father2); - List<Modifier> modifiers = toList(dutch.getModifiers("some.new.modifier")); + List<Modifier> modifiers = dutch.getModifiers("some.new.modifier"); assertEquals(1, modifiers.size()); assertEquals(2f, first(modifiers).getValue()); assertEquals(4f, FeatureContainer.applyModifiers(2, null, modifiers)); @@ -80,7 +80,7 @@ public class FoundingFatherTest extends FreeColTestCase { ModifierType.ADDITIVE, father3)); dutch.addFather(father3); - assertTrue(any(dutch.getModifiers("some.new.modifier"))); + assertTrue(dutch.getModifiers("some.new.modifier").size() > 0); assertEquals(6f, dutch.applyModifiers(2, null, "some.new.modifier")); FoundingFather father4 = new FoundingFather("father4", spec()); diff --git a/test/src/net/sf/freecol/common/model/IndividualFatherTest.java b/test/src/net/sf/freecol/common/model/IndividualFatherTest.java index d1588e6d6dc..17dfa27230b 100644 --- a/test/src/net/sf/freecol/common/model/IndividualFatherTest.java +++ b/test/src/net/sf/freecol/common/model/IndividualFatherTest.java @@ -253,16 +253,16 @@ public class IndividualFatherTest extends FreeColTestCase { Unit unit = colony.getFirstUnit(); townHall.add(unit); - assertTrue(none(player.getModifiers("model.goods.bells"))); - assertTrue(none(colony.getModifiers("model.goods.bells"))); + assertTrue(player.getModifiers("model.goods.bells").size() == 0); + assertTrue(colony.getModifiers("model.goods.bells").size() == 0); int expected = 4; assertEquals(expected, townHall.getTotalProductionOf(bellsType)); player.addFather(thomasJefferson); expected += expected * 0.5; // Add Jefferson bonus assertEquals(1, count(player.getModifiers("model.goods.bells"))); - assertTrue(none(colony.getModifiers("model.goods.bells"))); - assertEquals(1, count(townHall.getProductionModifiers(bellsType, null))); + assertTrue(colony.getModifiers("model.goods.bells").size() == 0); + assertTrue(townHall.getProductionModifiers(bellsType, null).size() == 1); assertEquals(expected, townHall.getTotalProductionOf(bellsType)); } @@ -336,7 +336,7 @@ public class IndividualFatherTest extends FreeColTestCase { player.recalculateBellsBonus(); assertTrue(player.hasAbility(Ability.ADD_TAX_TO_BELLS)); - List<Modifier> modifiers = toList(player.getModifiers("model.goods.bells")); + List<Modifier> modifiers = player.getModifiers("model.goods.bells"); assertEquals(1, count(modifiers)); Modifier paineModifier = first(modifiers); diff --git a/test/src/net/sf/freecol/common/model/ModifierTest.java b/test/src/net/sf/freecol/common/model/ModifierTest.java index 0911273a633..1be9a53ce48 100644 --- a/test/src/net/sf/freecol/common/model/ModifierTest.java +++ b/test/src/net/sf/freecol/common/model/ModifierTest.java @@ -155,12 +155,12 @@ public class ModifierTest extends FreeColTestCase { assertFalse(modifier1.appliesTo(carpenter)); List<Modifier> result - = toList(featureContainer.getModifiers("test", frigate, null)); + = featureContainer.getModifiers("test", frigate, null); assertEquals(3, result.size()); assertEquals(((1 + 3) * 1.5f) + ((1 + 3) * 1.5f) * 30 / 100, FeatureContainer.applyModifiers(1, null, result)); - result = toList(featureContainer.getModifiers("test", carpenter, null)); + result = featureContainer.getModifiers("test", carpenter, null); assertEquals(2, result.size()); assertEquals(1.5f + (1.5f * 30) / 100, FeatureContainer.applyModifiers(1, null, result)); @@ -172,12 +172,12 @@ public class ModifierTest extends FreeColTestCase { assertTrue(modifier2.appliesTo(frigate)); assertTrue(modifier2.appliesTo(carpenter)); - result = toList(featureContainer.getModifiers("test", frigate, null)); + result = featureContainer.getModifiers("test", frigate, null); assertEquals(3, result.size()); assertEquals(((1 + 3) * 1.5f) + ((1 + 3) * 1.5f) * 30 / 100, FeatureContainer.applyModifiers(1, null, result)); - result = toList(featureContainer.getModifiers("test", carpenter, null)); + result = featureContainer.getModifiers("test", carpenter, null); assertEquals(2, result.size()); assertEquals(1.5f + (1.5f * 30) / 100, FeatureContainer.applyModifiers(1, null, result)); @@ -210,10 +210,10 @@ public class ModifierTest extends FreeColTestCase { FeatureContainer featureContainer = new FeatureContainer(); featureContainer.addModifier(modifier1); featureContainer.addModifier(modifier2); - List<Modifier> modifiers = toList(featureContainer.getModifiers("test", frigate, new Turn(15))); + List<Modifier> modifiers = featureContainer.getModifiers("test", frigate, new Turn(15)); assertEquals(1, modifiers.size()); assertEquals(modifier1, first(modifiers)); - modifiers = toList(featureContainer.getModifiers("test", frigate, new Turn(35))); + modifiers = featureContainer.getModifiers("test", frigate, new Turn(35)); assertEquals(1, modifiers.size()); assertEquals(modifier2, first(modifiers)); } diff --git a/test/src/net/sf/freecol/common/model/NationTypeTest.java b/test/src/net/sf/freecol/common/model/NationTypeTest.java index 629f3f81d6e..e5a5fe2db57 100644 --- a/test/src/net/sf/freecol/common/model/NationTypeTest.java +++ b/test/src/net/sf/freecol/common/model/NationTypeTest.java @@ -144,7 +144,7 @@ public class NationTypeTest extends FreeColTestCase { Colony colony = getStandardColony(); colony.getOwner().changeNationType(spec().getNationType("model.nationType.building")); - List<Modifier> modifiers = toList(colony.getOwner().getModifiers("model.goods.hammers")); + List<Modifier> modifiers = colony.getOwner().getModifiers("model.goods.hammers"); assertEquals(1, modifiers.size()); BuildingType carpenterHouse = spec().getBuildingType("model.building.carpenterHouse"); @@ -157,7 +157,7 @@ public class NationTypeTest extends FreeColTestCase { colony.getOwner().changeNationType(spec().getNationType("model.nationType.furTrapping")); - modifiers = toList(colony.getOwner().getModifiers("model.goods.coats")); + modifiers = colony.getOwner().getModifiers("model.goods.coats"); assertEquals(1, modifiers.size()); BuildingType traderHouse = spec().getBuildingType("model.building.furTraderHouse"); diff --git a/test/src/net/sf/freecol/common/model/TileTest.java b/test/src/net/sf/freecol/common/model/TileTest.java index 80888e32cc6..f5cf63b5d28 100644 --- a/test/src/net/sf/freecol/common/model/TileTest.java +++ b/test/src/net/sf/freecol/common/model/TileTest.java @@ -20,7 +20,6 @@ package net.sf.freecol.common.model; import java.util.List; -import java.util.stream.Stream; import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.util.test.FreeColTestCase; @@ -525,9 +524,12 @@ public class TileTest extends FreeColTestCase { mineralsResource)); } - private boolean hasBonusFrom(Stream<Modifier> modifierSet, + private boolean hasBonusFrom(List<Modifier> modifierSet, FreeColSpecObjectType source) { - return any(modifierSet, matchKeyEquals(source, Modifier::getSource)); + for (Modifier m : modifierSet) + if (Utils.equals(source, m.getSource())) + return true; + return false; } diff --git a/test/src/net/sf/freecol/server/model/ServerUnitTest.java b/test/src/net/sf/freecol/server/model/ServerUnitTest.java index 324a50d4bd6..bd96aca16dd 100644 --- a/test/src/net/sf/freecol/server/model/ServerUnitTest.java +++ b/test/src/net/sf/freecol/server/model/ServerUnitTest.java @@ -484,10 +484,9 @@ public class ServerUnitTest extends FreeColTestCase { colony.getGoodsCount(lumberType)); // Upgrade to lumber mill - assertTrue(none(colony.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION))); + assertTrue(colony.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION).size() == 0); colony.getBuilding(carpenterHouseType).upgrade(); - assertEquals(1, - count(colony.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION))); + assertTrue(colony.getModifiers(Modifier.TILE_TYPE_CHANGE_PRODUCTION).size() == 1); // Almost clear another tile Tile tile2 = tile.getNeighbourOrNull(Direction.N); -- 2.11.0.rc0.7.gbe5a750 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Freecol-developers mailing list Freecol-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freecol-developers