From: "Enrico Weigelt, metux IT consult" <[email protected]>
---
.../sf/freecol/client/gui/panel/ColonyPanel.java | 2 +-
.../freecol/client/gui/panel/QuickActionMenu.java | 2 +-
src/net/sf/freecol/common/model/Colony.java | 170 ++++++++++++++++-----
.../sf/freecol/common/model/ProductionType.java | 12 ++
src/net/sf/freecol/common/model/WorkLocation.java | 7 +
src/net/sf/freecol/server/ai/ColonyPlan.java | 4 +-
src/net/sf/freecol/server/ai/mission/Mission.java | 2 +-
src/net/sf/freecol/server/model/ServerColony.java | 11 +-
.../net/sf/freecol/common/model/ColonyTest.java | 2 +-
9 files changed, 165 insertions(+), 47 deletions(-)
diff --git a/src/net/sf/freecol/client/gui/panel/ColonyPanel.java
b/src/net/sf/freecol/client/gui/panel/ColonyPanel.java
index 4e4887b05b8..03a46e7f8bc 100644
--- a/src/net/sf/freecol/client/gui/panel/ColonyPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/ColonyPanel.java
@@ -614,7 +614,7 @@ public final class ColonyPanel extends PortPanel
if (colony == null) return;
// Check for non-producing locations that can now produce.
- for (WorkLocation wl : colony.getCurrentWorkLocationsList()) {
+ for (WorkLocation wl : colony.getCurrentWorkLocations()) {
boolean change = false, check = wl.getProductionType() == null;
for (Unit unit : transform(wl.getUnits(), u ->
(check || !wl.produces(u.getWorkType())))) {
diff --git a/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java
b/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java
index 8e59b38087b..62c7de17e91 100644
--- a/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java
+++ b/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java
@@ -333,7 +333,7 @@ public final class QuickActionMenu extends JPopupMenu {
int bestOwnedProd = bonus + bonusChange,
bestUnownedProd = bonus + bonusChange;
WorkLocation bestOwned = null, bestUnowned = null;
- for (WorkLocation wl : colony.getAllWorkLocationsList()) {
+ for (WorkLocation wl : colony.getAllWorkLocations()) {
int prod = 0;
switch (wl.getNoAddReason(unit)) {
case NONE:
diff --git a/src/net/sf/freecol/common/model/Colony.java
b/src/net/sf/freecol/common/model/Colony.java
index a84496bbe5e..a71c95ad293 100644
--- a/src/net/sf/freecol/common/model/Colony.java
+++ b/src/net/sf/freecol/common/model/Colony.java
@@ -47,7 +47,7 @@ import static net.sf.freecol.common.util.CollectionUtils.*;
import net.sf.freecol.common.option.GameOptions;
import net.sf.freecol.common.util.LogBuilder;
import net.sf.freecol.common.util.RandomChoice;
-
+import net.sf.freecol.common.util.Utils;
/**
* Represents a colony. A colony contains {@link Building}s and
@@ -455,7 +455,7 @@ public class Colony extends Settlement implements Nameable,
TradeLocation {
Occupation best = new Occupation(null, null, null);
int bestAmount = 0;
- for (WorkLocation wl : getCurrentWorkLocationsList()) {
+ for (WorkLocation wl : getCurrentWorkLocations()) {
bestAmount = best.improve(unit, wl, bestAmount, workTypes, lb);
}
@@ -538,7 +538,7 @@ public class Colony extends Settlement implements Nameable,
TradeLocation {
*
* @return The list of work locations.
*/
- public List<WorkLocation> getAllWorkLocationsList() {
+ public List<WorkLocation> getAllWorkLocations() {
List<WorkLocation> ret = new ArrayList<>();
synchronized (this.colonyTiles) {
ret.addAll(this.colonyTiles);
@@ -550,19 +550,22 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
}
/**
- * Gets a stream of every work location in this colony.
+ * Gets a list of every work location in this colony.
*
- * @return The stream of work locations.
+ * @return The list of work locations.
*/
- public Stream<WorkLocation> getAllWorkLocations() {
- Stream<WorkLocation> ret = Stream.<WorkLocation>empty();
+ public WorkLocation findWorkLocationById(String id) {
synchronized (this.colonyTiles) {
- ret = concat(ret, map(this.colonyTiles, ct -> (WorkLocation)ct));
+ for (ColonyTile walk : this.colonyTiles)
+ if (Utils.equals(id, walk.getId()))
+ return walk;
}
synchronized (this.buildingMap) {
- ret = concat(ret, map(this.buildingMap.values(), b ->
(WorkLocation)b));
+ for (Building walk : this.buildingMap.values())
+ if (Utils.equals(id, walk.getId()))
+ return walk;
}
- return ret;
+ return null;
}
/**
@@ -571,36 +574,82 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
*
* @return The list of available {@code WorkLocation}s.
*/
- public List<WorkLocation> getAvailableWorkLocationsList() {
- return transform(getAllWorkLocations(), WorkLocation::isAvailable);
+ public int countAvailableWorkLocations() {
+ int result = 0;
+ synchronized (this.colonyTiles) {
+ for (ColonyTile walk : this.colonyTiles)
+ if (walk.isAvailable())
+ result++;
+ }
+ synchronized (this.buildingMap) {
+ for (Building walk : this.buildingMap.values())
+ if (walk.isAvailable())
+ result++;
+ }
+ return result;
}
/**
- * Get a stream of all freely available work locations in this
- * colony.
+ * Count the freely available work locations in this colony.
*
- * @return The stream of available {@code WorkLocation}s.
+ * @return The list of available {@code WorkLocation}s.
*/
- public Stream<WorkLocation> getAvailableWorkLocations() {
- return getAvailableWorkLocationsList().stream();
+ public List<WorkLocation> getAvailableWorkLocations() {
+ List<WorkLocation> result = new ArrayList<>();
+ synchronized (this.colonyTiles) {
+ for (ColonyTile walk : this.colonyTiles)
+ if (walk.isAvailable())
+ result.add(walk);
+ }
+ synchronized (this.buildingMap) {
+ for (Building walk : this.buildingMap.values())
+ if (walk.isAvailable())
+ result.add(walk);
+ }
+ return result;
}
/**
- * Gets a list of all current work locations in this colony.
+ * Gets a list of all freely available work locations
+ * in this colony, that can add given unit.
*
- * @return The list of current {@code WorkLocation}s.
+ * @param unit The {@code Unit} about to be added.
+ * @param skip An optional WorkLocation to skip
+ * @return The list of available {@code WorkLocation}s.
*/
- public List<WorkLocation> getCurrentWorkLocationsList() {
- return transform(getAllWorkLocations(), WorkLocation::isCurrent);
+ public int getAvailableWorkLocationsCanAdd(Unit unit, WorkLocation skip) {
+ int result = 0;
+ synchronized (this.colonyTiles) {
+ for (ColonyTile walk : this.colonyTiles)
+ if (walk != skip && walk.isAvailable() && walk.canAdd(unit))
+ result++;
+ }
+ synchronized (this.buildingMap) {
+ for (Building walk : this.buildingMap.values())
+ if (walk != skip && walk.isAvailable() && walk.canAdd(unit))
+ result++;
+ }
+ return result;
}
/**
- * Get a stream of all current work locations in this colony.
+ * Gets a list of all current work locations in this colony.
*
- * @return The stream of current {@code WorkLocation}s.
+ * @return The list of current {@code WorkLocation}s.
*/
- public Stream<WorkLocation> getCurrentWorkLocations() {
- return getCurrentWorkLocationsList().stream();
+ public List<WorkLocation> getCurrentWorkLocations() {
+ List<WorkLocation> result = new ArrayList<>();
+ synchronized (this.colonyTiles) {
+ for (ColonyTile walk : this.colonyTiles)
+ if (walk.isCurrent())
+ result.add(walk);
+ }
+ synchronized (this.buildingMap) {
+ for (Building walk : this.buildingMap.values())
+ if (walk.isCurrent())
+ result.add(walk);
+ }
+ return result;
}
/**
@@ -664,7 +713,17 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* {@code Ability}, or null if not found.
*/
public WorkLocation getWorkLocationWithAbility(String ability) {
- return find(getCurrentWorkLocations(), wl -> wl.hasAbility(ability));
+ synchronized (this.colonyTiles) {
+ for (ColonyTile ct : this.colonyTiles)
+ if (ct.isCurrent() && ct.hasAbility(ability))
+ return ct;
+ }
+ synchronized (this.buildingMap) {
+ for (Building b : this.buildingMap.values())
+ if (b.isCurrent() && b.hasAbility(ability))
+ return b;
+ }
+ return null;
}
/**
@@ -693,7 +752,17 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* {@code Modifier}, or null if not found.
*/
public WorkLocation getWorkLocationWithModifier(String modifier) {
- return find(getCurrentWorkLocations(), wl -> wl.hasModifier(modifier));
+ synchronized (this.colonyTiles) {
+ for (WorkLocation walk : this.colonyTiles)
+ if (walk.isCurrent() && walk.hasModifier(modifier))
+ return walk;
+ }
+ synchronized (this.buildingMap) {
+ for (WorkLocation walk : this.buildingMap.values())
+ if (walk.isCurrent() && walk.hasModifier(modifier))
+ return walk;
+ }
+ return null;
}
/**
@@ -720,8 +789,18 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* the given type of goods.
*/
public List<WorkLocation> getWorkLocationsForConsuming(GoodsType
goodsType) {
- return transform(getCurrentWorkLocations(),
- wl -> AbstractGoods.anyIsType(wl.getInputs(), goodsType));
+ List<WorkLocation> ret = new ArrayList<>();
+ synchronized (this.colonyTiles) {
+ for (WorkLocation walk : this.colonyTiles)
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getInputs(), goodsType))
+ ret.add(walk);
+ }
+ synchronized (this.buildingMap) {
+ for (WorkLocation walk : this.buildingMap.values())
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getInputs(), goodsType))
+ ret.add(walk);
+ }
+ return ret;
}
/**
@@ -732,8 +811,18 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* the given type of goods.
*/
public List<WorkLocation> getWorkLocationsForProducing(GoodsType
goodsType) {
- return transform(getCurrentWorkLocations(),
- wl -> AbstractGoods.anyIsType(wl.getOutputs(), goodsType));
+ List<WorkLocation> result = new ArrayList<>();
+ synchronized (this.colonyTiles) {
+ for (WorkLocation walk : this.colonyTiles)
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getOutputs(), goodsType))
+ result.add(walk);
+ }
+ synchronized (this.buildingMap) {
+ for (WorkLocation walk : this.buildingMap.values())
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getOutputs(), goodsType))
+ result.add(walk);
+ }
+ return result;
}
/**
@@ -746,7 +835,17 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* the given type of goods, or null if not found.
*/
public WorkLocation getWorkLocationForProducing(GoodsType goodsType) {
- return first(getWorkLocationsForProducing(goodsType));
+ synchronized (this.colonyTiles) {
+ for (WorkLocation walk : this.colonyTiles)
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getOutputs(), goodsType))
+ return walk;
+ }
+ synchronized (this.buildingMap) {
+ for (WorkLocation walk : this.buildingMap.values())
+ if (walk.isCurrent() &&
AbstractGoods.anyIsType(walk.getOutputs(), goodsType))
+ return walk;
+ }
+ return null;
}
/**
@@ -1712,7 +1811,7 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
int result, v;
if (player.owns(this)) {
result = 0;
- for (WorkLocation wl : getAvailableWorkLocationsList()) {
+ for (WorkLocation wl : getAvailableWorkLocations()) {
v = wl.evaluateFor(player);
if (v == Integer.MIN_VALUE) return Integer.MIN_VALUE;
result += v;
@@ -2033,7 +2132,7 @@ public class Colony extends Settlement implements
Nameable, TradeLocation {
* present.
*/
public void updateProductionTypes() {
- for (WorkLocation wl : getAvailableWorkLocationsList()) {
+ for (WorkLocation wl : getAvailableWorkLocations()) {
wl.updateProductionType();
}
}
@@ -2394,8 +2493,7 @@ loop: for (WorkLocation wl :
getWorkLocationsForProducing(goodsType)) {
public <T extends FreeColObject> T getCorresponding(T fco) {
final String id = fco.getId();
return (fco instanceof WorkLocation)
- ? (T)find(getAllWorkLocations(),
- matchKeyEquals(id, WorkLocation::getId))
+ ? (T)findWorkLocationById(id)
: (fco instanceof Tile)
? (T)((getTile().getId().equals(id)) ? getTile()
: find(map(getColonyTiles(), ColonyTile::getWorkTile),
diff --git a/src/net/sf/freecol/common/model/ProductionType.java
b/src/net/sf/freecol/common/model/ProductionType.java
index c5f965205bf..2911fe78bde 100644
--- a/src/net/sf/freecol/common/model/ProductionType.java
+++ b/src/net/sf/freecol/common/model/ProductionType.java
@@ -155,6 +155,18 @@ public class ProductionType extends FreeColSpecObject {
}
/**
+ * Check whether this production type can consume an {@code AbstractGoods}
+ */
+ public final boolean canConsume(AbstractGoods goods) {
+ if (inputs != null)
+ for (AbstractGoods walk : inputs)
+ if (walk.isType(goods.getType()))
+ return true;
+
+ return false;
+ }
+
+ /**
* Set the input goods.
*
* @param newInputs The new list of input {@code AbstractGoods}.
diff --git a/src/net/sf/freecol/common/model/WorkLocation.java
b/src/net/sf/freecol/common/model/WorkLocation.java
index 40d69537f04..da1b7b157f7 100644
--- a/src/net/sf/freecol/common/model/WorkLocation.java
+++ b/src/net/sf/freecol/common/model/WorkLocation.java
@@ -418,6 +418,13 @@ public abstract class WorkLocation extends UnitLocation
}
/**
+ * Check whether this WorkLocation can consume an {@code AbstractGoods}
+ */
+ public final boolean canConsume(AbstractGoods ag) {
+ return (productionType == null ? false :
productionType.canConsume(ag));
+ }
+
+ /**
* Get the {@code AbstractGoods} produced by this work location.
*
* @return A stream of {@code AbstractGoods} produced.
diff --git a/src/net/sf/freecol/server/ai/ColonyPlan.java
b/src/net/sf/freecol/server/ai/ColonyPlan.java
index 1de387b5019..5db72192068 100644
--- a/src/net/sf/freecol/server/ai/ColonyPlan.java
+++ b/src/net/sf/freecol/server/ai/ColonyPlan.java
@@ -394,7 +394,7 @@ public class ColonyPlan {
*/
private Map<GoodsType, Map<WorkLocation, Integer>> createProductionMap() {
Map<GoodsType, Map<WorkLocation, Integer>> production = new
HashMap<>();
- for (WorkLocation wl : colony.getAvailableWorkLocationsList()) {
+ for (WorkLocation wl : colony.getAvailableWorkLocations()) {
for (GoodsType g : spec().getGoodsTypeList()) {
int p = wl.getGenericPotential(g);
if (p > 0) {
@@ -1377,7 +1377,7 @@ public class ColonyPlan {
// starvation and add one worker.
if (col.getUnitCount() == 0) {
if (getFoodPlans().isEmpty()) {
-locations: for (WorkLocation wl : col.getAvailableWorkLocationsList()) {
+locations: for (WorkLocation wl : col.getAvailableWorkLocations()) {
for (Unit u : new ArrayList<>(workers)) {
for (GoodsType type : libertyGoodsTypes) {
if (wl.canAdd(u)
diff --git a/src/net/sf/freecol/server/ai/mission/Mission.java
b/src/net/sf/freecol/server/ai/mission/Mission.java
index 32772c60fbd..ab9a28966e3 100644
--- a/src/net/sf/freecol/server/ai/mission/Mission.java
+++ b/src/net/sf/freecol/server/ai/mission/Mission.java
@@ -613,7 +613,7 @@ public abstract class Mission extends AIObject {
Colony colony = (Colony)s;
// Favour coastal
value += ((colony.isConnectedPort()) ? 10 : 0)
- + colony.getAvailableWorkLocationsList().size();
+ + colony.getAvailableWorkLocationCount();
}
return value;
});
diff --git a/src/net/sf/freecol/server/model/ServerColony.java
b/src/net/sf/freecol/server/model/ServerColony.java
index 5c047e3c631..5b09be3c743 100644
--- a/src/net/sf/freecol/server/model/ServerColony.java
+++ b/src/net/sf/freecol/server/model/ServerColony.java
@@ -195,10 +195,11 @@ public class ServerColony extends Colony implements
ServerModelObject {
public boolean ejectUnits(WorkLocation workLocation, List<Unit> units) {
if (units == null || units.isEmpty()) return false;
unit: for (Unit u : units) {
- for (WorkLocation wl : transform(getAvailableWorkLocations(),
- w -> w != workLocation &&
w.canAdd(u))) {
- u.setLocation(wl);//-vis: safe/colony
- continue unit;
+ for (WorkLocation wl : getAvailableWorkLocations()) {
+ if ((wl != workLocation) && wl.canAdd(u)) {
+ u.setLocation(wl);//-vis: safe/colony
+ continue unit;
+ }
}
u.setLocation(getTile());//-vis: safe/colony
}
@@ -547,7 +548,7 @@ public class ServerColony extends Colony implements
ServerModelObject {
container.saveState();
// Check for learning by experience
- for (WorkLocation workLocation : getCurrentWorkLocationsList()) {
+ for (WorkLocation workLocation : getCurrentWorkLocations()) {
((ServerModelObject)workLocation).csNewTurn(random, lb, cs);
ProductionInfo productionInfo = getProductionInfo(workLocation);
if (productionInfo == null) continue;
diff --git a/test/src/net/sf/freecol/common/model/ColonyTest.java
b/test/src/net/sf/freecol/common/model/ColonyTest.java
index 2d246878463..71b1827cb34 100644
--- a/test/src/net/sf/freecol/common/model/ColonyTest.java
+++ b/test/src/net/sf/freecol/common/model/ColonyTest.java
@@ -508,7 +508,7 @@ public class ColonyTest extends FreeColTestCase {
assertEquals(oct.getColony(), copied);
assertEquals(oct.getOwningSettlement(), copied);
- for (WorkLocation wl : colony.getAllWorkLocationsList()) {
+ for (WorkLocation wl : colony.getAllWorkLocations()) {
WorkLocation owl = copied.getCorresponding(wl);
assertNotNull(owl);
assertFalse(wl == owl);
--
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/freecol-developers