From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>
--- .../client/gui/dialog/EditSettlementDialog.java | 2 +- .../client/gui/panel/report/ReportIndianPanel.java | 2 +- src/net/sf/freecol/common/model/Player.java | 74 ++++++++++++++-------- .../sf/freecol/common/model/SimpleCombatModel.java | 4 +- src/net/sf/freecol/server/FreeColServer.java | 4 +- src/net/sf/freecol/server/ai/NativeAIPlayer.java | 8 +-- src/net/sf/freecol/server/model/ServerGame.java | 9 +-- src/net/sf/freecol/server/model/ServerPlayer.java | 18 +++--- .../freecol/server/generator/MapGeneratorTest.java | 2 +- 9 files changed, 71 insertions(+), 52 deletions(-) diff --git a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java index 8cde7a524bb..9ac37076c90 100644 --- a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java +++ b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java @@ -228,7 +228,7 @@ public final class EditSettlementDialog extends FreeColDialog<IndianSettlement> if (this.capital.isSelected() && !is.isCapital()) { // make sure we downgrade the old capital for (IndianSettlement indianSettlement - : is.getOwner().getIndianSettlementList()) { + : is.getOwner().getIndianSettlements()) { indianSettlement.setCapital(false); } is.setCapital(true); diff --git a/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java b/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java index b01ab6ee434..a531adaa804 100644 --- a/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java +++ b/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java @@ -94,7 +94,7 @@ public final class ReportIndianPanel extends ReportPanel { private void buildIndianAdvisorPanel(Player player, Player opponent) { final NationSummary ns = igc().getNationSummary(opponent); List<IndianSettlement> nativeSettlements - = opponent.getIndianSettlementList(); + = opponent.getIndianSettlements(); String numSettlements = String.valueOf(nativeSettlements.size()) + " / " + ((ns == null) ? "?" : String.valueOf(ns.getNumberOfSettlements())); diff --git a/src/net/sf/freecol/common/model/Player.java b/src/net/sf/freecol/common/model/Player.java index f0354687958..1714d5ec7f7 100644 --- a/src/net/sf/freecol/common/model/Player.java +++ b/src/net/sf/freecol/common/model/Player.java @@ -2426,8 +2426,12 @@ public class Player extends FreeColGameObject implements Nameable { * or null if not found. */ public IndianSettlement getIndianSettlementByName(String name) { - return find(getIndianSettlements(), - matchKeyEquals(name, IndianSettlement::getName)); + synchronized (this.settlements) { + for (Settlement s : this.settlements) + if (s instanceof IndianSettlement && Utils.equals(name, ((IndianSettlement)s).getName())) + return (IndianSettlement)s; + } + return null; } /** @@ -2488,25 +2492,35 @@ public class Player extends FreeColGameObject implements Nameable { } /** - * Get a stream of all the indian settlements this player owns. + * Get a list of all the IndianSettlements this player owns. * - * @return A stream of the {@code IndianSettlement}s this player owns. + * @return A list of the {@code IndianSettlement}s this player owns. */ - public Stream<IndianSettlement> getIndianSettlements() { - return getIndianSettlementList().stream(); + public List<IndianSettlement> getIndianSettlements() { + synchronized (this.settlements) { + List<IndianSettlement> result = new ArrayList<>(); + for (Settlement s : this.settlements) + if (s instanceof IndianSettlement) + result.add((IndianSettlement)s); + return result; + } } /** - * Get a list of all the IndianSettlements this player owns. + * Get a list of all the IndianSettlements this player owns, that have + * been contacted by given player. * - * @return A list of the {@code IndianSettlement}s this player owns. + * @return A list of this player's {@code IndianSettlement}s, that have + * been contacted by given player. */ - public List<IndianSettlement> getIndianSettlementList() { - List<IndianSettlement> result = new ArrayList<>(); - for (Settlement s : this.settlements) - if (s instanceof IndianSettlement) - result.add((IndianSettlement)s); - return result; + public List<IndianSettlement> getIndianSettlementsContacted(Player player) { + synchronized (this.settlements) { + List<IndianSettlement> result = new ArrayList<>(); + for (Settlement s : this.settlements) + if (s instanceof IndianSettlement && s.hasContacted(player)) + result.add((IndianSettlement)s); + return result; + } } /** @@ -2517,24 +2531,32 @@ public class Player extends FreeColGameObject implements Nameable { * @return A list of the {@code IndianSettlement}s with a matching * missionary. */ - public List<IndianSettlement> getIndianSettlementsWithMissionaryList(Player p) { - List<IndianSettlement> result = new ArrayList<>(); - for (Settlement s : this.settlements) - if ((s instanceof IndianSettlement) && ((IndianSettlement)s).hasMissionary(p)) - result.add((IndianSettlement)s); - return result; + public List<IndianSettlement> getIndianSettlementsWithMissionary(Player p) { + synchronized (this.settlements) { + List<IndianSettlement> result = new ArrayList<>(); + for (Settlement s : this.settlements) + if ((s instanceof IndianSettlement) && ((IndianSettlement)s).hasMissionary(p)) + result.add((IndianSettlement)s); + return result; + } } /** - * Get a stream of all indian settlements owned by this player with + * Check whether player has an indian settlements owned by this player with * a missionary from a given player. * * @param p The {@code Player}. - * @return A stream of the {@code IndianSettlement}s with a matching - * missionary. + * @return A True if there player has an indian settlement with missionary + * from given player. */ - public Stream<IndianSettlement> getIndianSettlementsWithMissionary(Player p) { - return getIndianSettlementsWithMissionaryList(p).stream(); + public final boolean hasIndianSettlementsWithMissionary(Player p) { + synchronized (this.settlements) { + List<IndianSettlement> result = new ArrayList<>(); + for (Settlement s : this.settlements) + if ((s instanceof IndianSettlement) && ((IndianSettlement)s).hasMissionary(p)) + return true; + return false; + } } /** @@ -2902,7 +2924,7 @@ public class Player extends FreeColGameObject implements Nameable { // All missions if using enhanced missionaries. if (spec.getBoolean(GameOptions.ENHANCED_MISSIONARIES)) for (Player other : getGame().getLiveNativePlayers(this)) - for (IndianSettlement is : getIndianSettlementsWithMissionaryList(this)) + for (IndianSettlement is : getIndianSettlementsWithMissionary(this)) vismap.setVisible(is); // All other European settlements if can see all colonies. diff --git a/src/net/sf/freecol/common/model/SimpleCombatModel.java b/src/net/sf/freecol/common/model/SimpleCombatModel.java index 64fc90d4cb1..a536559adcb 100644 --- a/src/net/sf/freecol/common/model/SimpleCombatModel.java +++ b/src/net/sf/freecol/common/model/SimpleCombatModel.java @@ -794,10 +794,8 @@ public class SimpleCombatModel extends CombatModel { lose++; } } else if (r >= 1.0 - winner.getBurnProbability()) { - if (any(transform(loserPlayer.getIndianSettlements(), - s -> s.hasMissionary(winnerPlayer)))) { + if (loserPlayer.hasIndianSettlementsWithMissionary(winnerPlayer)) crs.add(CombatResult.BURN_MISSIONS); - } } } if (settlement.getUnitCount() + tile.getUnitCount() <= lose) { diff --git a/src/net/sf/freecol/server/FreeColServer.java b/src/net/sf/freecol/server/FreeColServer.java index 2ded50a8033..c056fed241a 100644 --- a/src/net/sf/freecol/server/FreeColServer.java +++ b/src/net/sf/freecol/server/FreeColServer.java @@ -1155,7 +1155,7 @@ public final class FreeColServer { p.setReady(true); // Players in running game must be ready // @compat 0.10.5 if (p.isIndian()) { - for (IndianSettlement is : p.getIndianSettlementList()) { + for (IndianSettlement is : p.getIndianSettlements()) { ((ServerIndianSettlement)is).updateMostHated(); } } @@ -1317,7 +1317,7 @@ public final class FreeColServer { + Tension.Level.CONTENT.getLimit()) / 2; for (Player other : serverGame.getLiveNativePlayers(player)) { player.setStance(other, Stance.PEACE); - for (IndianSettlement is : player.getIndianSettlementList()) { + for (IndianSettlement is : player.getIndianSettlements()) { is.setAlarm(other, new Tension(alarm)); } } diff --git a/src/net/sf/freecol/server/ai/NativeAIPlayer.java b/src/net/sf/freecol/server/ai/NativeAIPlayer.java index 4121139630e..237002960c0 100644 --- a/src/net/sf/freecol/server/ai/NativeAIPlayer.java +++ b/src/net/sf/freecol/server/ai/NativeAIPlayer.java @@ -140,7 +140,7 @@ public class NativeAIPlayer extends MissionAIPlayer { // Give defensive missions up to the minimum expected defence, // leave the rest with the default wander-hostile mission. - for (IndianSettlement is : player.getIndianSettlementList()) { + for (IndianSettlement is : player.getIndianSettlements()) { List<Unit> units = is.getAllUnitsList(); while (units.size() > is.getRequiredDefenders()) { Unit u = units.remove(0); @@ -189,7 +189,7 @@ public class NativeAIPlayer extends MissionAIPlayer { private void secureSettlements(int[] randoms, LogBuilder lb) { int randomIdx = 0; List<IndianSettlement> settlements - = getPlayer().getIndianSettlementList(); + = getPlayer().getIndianSettlements(); for (IndianSettlement is : settlements) { // Spread arms and horses between camps // FIXME: maybe make this dependent on difficulty level? @@ -467,7 +467,7 @@ public class NativeAIPlayer extends MissionAIPlayer { int randomIdx = 0; lb.mark(); - for (IndianSettlement is : player.getIndianSettlementList()) { + for (IndianSettlement is : player.getIndianSettlements()) { // Do not bring gifts all the time. if (randoms[randomIdx++] >= giftProbability) continue; @@ -567,7 +567,7 @@ public class NativeAIPlayer extends MissionAIPlayer { int randomIdx = 0; lb.mark(); - for (IndianSettlement is : player.getIndianSettlementList()) { + for (IndianSettlement is : player.getIndianSettlements()) { // Do not demand tribute all of the time. if (randoms[randomIdx++] >= demandProbability) continue; diff --git a/src/net/sf/freecol/server/model/ServerGame.java b/src/net/sf/freecol/server/model/ServerGame.java index 815f7660010..a9899897bf5 100644 --- a/src/net/sf/freecol/server/model/ServerGame.java +++ b/src/net/sf/freecol/server/model/ServerGame.java @@ -50,6 +50,7 @@ import net.sf.freecol.common.model.Goods; import net.sf.freecol.common.model.GoodsLocation; import net.sf.freecol.common.model.HighSeas; import net.sf.freecol.common.model.HistoryEvent; +import net.sf.freecol.common.model.IndianSettlement; import net.sf.freecol.common.model.Limit; import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.ModelMessage; @@ -367,9 +368,8 @@ public class ServerGame extends Game implements ServerModelObject { Set<Tile> updated = new HashSet<>(); ServerPlayer strongest = (ServerPlayer)strongAI; ServerPlayer weakest = (ServerPlayer)weakAI; - forEach(flatten(getLiveNativePlayers(), - p -> p.getIndianSettlementsWithMissionary(weakest)), - is -> { + for (Player p : getLiveNativePlayers()) { + for (IndianSettlement is : p.getIndianSettlementsWithMissionary(weakest)) { lb.add(" ", is.getName(), "(mission)"); is.getTile().cacheUnseen(strongest);//+til tiles.add(is.getTile()); @@ -380,7 +380,8 @@ public class ServerGame extends Game implements ServerModelObject { is.getTile().updateIndianSettlement(strongest); cs.add(See.perhaps().always(strongest), is); } - }); + } + } for (Colony c : weakest.getColonies()) { updated.addAll(c.getOwnedTiles()); ((ServerColony)c).csChangeOwner(strongest, false, cs);//-vis(both),-til diff --git a/src/net/sf/freecol/server/model/ServerPlayer.java b/src/net/sf/freecol/server/model/ServerPlayer.java index 745401de83a..d904f23ffe2 100644 --- a/src/net/sf/freecol/server/model/ServerPlayer.java +++ b/src/net/sf/freecol/server/model/ServerPlayer.java @@ -633,7 +633,7 @@ public class ServerPlayer extends Player implements ServerModelObject { // Clean up missions and remove tension/alarm/stance. for (Player other : getGame().getLivePlayers(this)) { if (isEuropean() && other.isIndian()) { - for (IndianSettlement is : other.getIndianSettlementList()) { + for (IndianSettlement is : other.getIndianSettlements()) { ServerIndianSettlement sis = (ServerIndianSettlement)is; if (is.hasMissionary(this)) sis.csKillMissionary(null, cs); is.getTile().cacheUnseen();//+til @@ -1384,9 +1384,9 @@ public class ServerPlayer extends Player implements ServerModelObject { // Propagate tension change as settlement alarm to all // settlements except the one that originated it (if any). if (isIndian()) { - for (IndianSettlement is : transform(getIndianSettlements(), - i -> i != origin && i.hasContacted(player))) { - ((ServerIndianSettlement)is).csModifyAlarm(player, add, + for (IndianSettlement is : getIndianSettlementsContacted(player)) { + if (is != origin) + ((ServerIndianSettlement)is).csModifyAlarm(player, add, false, cs);//+til } } @@ -1758,7 +1758,7 @@ outer: for (Effect effect : effects) { // The simple way to do it is just to save all old tension // levels and check if they have changed after applying // all the changes. - List<IndianSettlement> allSettlements = getIndianSettlementList(); + List<IndianSettlement> allSettlements = getIndianSettlements(); java.util.Map<IndianSettlement, java.util.Map<Player, Tension.Level>> oldLevels = new HashMap<>(); for (IndianSettlement is : allSettlements) { @@ -1970,8 +1970,7 @@ outer: for (Effect effect : effects) { for (Player p : transform(game.getLiveNativePlayers(), p -> p.hasContacted(this))) { p.setTension(this, new Tension(Tension.TENSION_MIN)); - for (IndianSettlement is : transform(p.getIndianSettlements(), - is -> is.hasContacted(this))) { + for (IndianSettlement is : p.getIndianSettlementsContacted(this)) { is.getTile().cacheUnseen();//+til is.setAlarm(this, new Tension(Tension.TENSION_MIN));//-til cs.add(See.only(this), is); @@ -2557,8 +2556,7 @@ outer: for (Effect effect : effects) { // FIXME: just the tension cs.add(See.perhaps().always(this), defenderPlayer); csChangeStance(Stance.PEACE, defenderPlayer, true, cs); - for (IndianSettlement is : transform(defenderPlayer.getIndianSettlements(), - is -> is.hasContacted(this))) { + for (IndianSettlement is : defenderPlayer.getIndianSettlements()) { is.getAlarm(this).setValue(Tension.SURRENDERED); // Only update attacker with settlements that have // been seen, as contact can occur with its members. @@ -2704,7 +2702,7 @@ outer: for (Effect effect : effects) { // Burn down the missions boolean here = is.hasMissionary(attackerPlayer); - for (IndianSettlement s : nativePlayer.getIndianSettlementsWithMissionaryList(attackerPlayer)) { + for (IndianSettlement s : nativePlayer.getIndianSettlementsWithMissionary(attackerPlayer)) { ((ServerIndianSettlement)s).csKillMissionary(null, cs); } // Backtrack on updating this tile, avoiding duplication in csCombat diff --git a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java index aea6944b7c8..2960c83a78f 100644 --- a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java +++ b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java @@ -178,7 +178,7 @@ public class MapGeneratorTest extends FreeColTestCase { // has at least one settlement. int settlements = 0; int capitals = 0; - for (IndianSettlement s : p.getIndianSettlementList()) { + for (IndianSettlement s : p.getIndianSettlements()) { settlements++; if (s.isCapital()) capitals++; } -- 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