91 float allowedArcBonusIfClose) {
92 Vector2f playerLoc =
Global.
getSector().getPlayerFleet().getLocationInHyperspace();
95 MarketAPI market =
null;
96 if (person !=
null) market = person.getMarket();
100 float angleToOther = Misc.getAngleInDegrees(playerLoc, other);
101 float distToOther = Misc.getDistance(playerLoc, other);
103 float angleDiff = Misc.getAngleDiff(missionAngle, angleToOther);
105 float maxAllowedAngleDiff = allowedArc / 2f;
106 float thresholdDistForBonusAngle = 5000f;
107 if (distToOther < thresholdDistForBonusAngle) {
108 float f = (1f - distToOther / thresholdDistForBonusAngle);
110 maxAllowedAngleDiff += f * allowedArcBonusIfClose / 2f;
112 return angleDiff <= maxAllowedAngleDiff;
120 public static class SystemInDirectionOfOtherMissionsReq
implements StarSystemRequirement {
122 protected float arcMult;
124 this.mission = mission;
125 this.arcMult = arcMult;
127 public boolean systemMatchesRequirement(StarSystemAPI system) {
133 public static class MarketInDirectionOfOtherMissionsReq
implements MarketRequirement {
135 protected float arcMult;
137 this.mission = mission;
138 this.arcMult = arcMult;
140 public boolean marketMatchesRequirement(MarketAPI market) {
146 public static class PlanetInDirectionOfOtherMissionsReq
implements PlanetRequirement {
147 protected HubMissionWithSearch mission;
148 protected float arcMult;
149 public PlanetInDirectionOfOtherMissionsReq(HubMissionWithSearch mission,
float arcMult) {
150 this.mission = mission;
151 this.arcMult = arcMult;
153 public boolean planetMatchesRequirement(PlanetAPI planet) {
162 public static class EntityInDirectionOfOtherMissionsReq
implements EntityRequirement {
163 protected HubMissionWithSearch mission;
164 protected float arcMult;
165 public EntityInDirectionOfOtherMissionsReq(HubMissionWithSearch mission,
float arcMult) {
166 this.mission = mission;
167 this.arcMult = arcMult;
169 public boolean entityMatchesRequirement(SectorEntityToken entity) {
170 return mission.matchesSetMissionAngle(entity.getLocationInHyperspace(),
175 public static class TerrainInDirectionOfOtherMissionsReq
implements TerrainRequirement {
176 protected HubMissionWithSearch mission;
177 protected float arcMult;
178 public TerrainInDirectionOfOtherMissionsReq(HubMissionWithSearch mission,
float arcMult) {
179 this.mission = mission;
180 this.arcMult = arcMult;
182 public boolean terrainMatchesRequirement(CampaignTerrainAPI terrain) {
183 return mission.matchesSetMissionAngle(terrain.getLocationInHyperspace(),
189 public static class SystemInDirection
implements StarSystemRequirement {
192 protected HubMissionWithSearch mission;
194 public SystemInDirection(HubMissionWithSearch mission,
float dir,
float arc) {
195 this.mission = mission;
199 public boolean systemMatchesRequirement(StarSystemAPI system) {
200 if (mission.getPerson() ==
null)
return false;
201 if (mission.getPerson().getMarket() ==
null)
return false;
202 Vector2f from = mission.getPerson().getMarket().getLocationInHyperspace();
203 return Misc.isInArc(dir, arc, from, system.getLocation());
207 public static class SystemInDirectionFrom
implements StarSystemRequirement {
208 protected Vector2f from;
212 public SystemInDirectionFrom(Vector2f from,
float dir,
float arc) {
217 public boolean systemMatchesRequirement(StarSystemAPI system) {
218 return Misc.isInArc(dir, arc, from, system.getLocation());
222 public static class MarketIsReq
implements MarketRequirement {
225 public MarketIsReq(MarketAPI param,
boolean negate) {
227 this.negate = negate;
229 public boolean marketMatchesRequirement(MarketAPI market) {
230 boolean result = market == param;
235 public static class MarketFactionReq
implements MarketRequirement {
237 Set<String> factions;
238 public MarketFactionReq(
boolean negate, String ... factions) {
239 this.factions =
new LinkedHashSet<String>();
240 this.factions.addAll(Arrays.asList(factions));
241 this.negate = negate;
243 public boolean marketMatchesRequirement(MarketAPI market) {
244 boolean result = factions.contains(market.getFactionId());
250 public static class MarketTacticalBombardableReq
implements MarketRequirement {
252 public MarketTacticalBombardableReq(
boolean negate) {
253 this.negate = negate;
255 public boolean marketMatchesRequirement(MarketAPI market) {
256 boolean result = !MarketCMD.getTacticalBombardmentTargets(market).isEmpty();
262 public static class MarketFactionHostileReq
implements MarketRequirement {
265 public MarketFactionHostileReq(
boolean negate, String faction) {
266 this.faction = faction;
267 this.negate = negate;
269 public boolean marketMatchesRequirement(MarketAPI market) {
270 boolean result = market.getFaction().isHostileTo(faction);
289 public static class MarketMilitaryReq
implements MarketRequirement {
290 public boolean marketMatchesRequirement(MarketAPI market) {
291 return Misc.isMilitary(market);
294 public static class MarketNotMilitaryReq
implements MarketRequirement {
295 public boolean marketMatchesRequirement(MarketAPI market) {
296 return !Misc.isMilitary(market);
300 public static class MarketHiddenReq
implements MarketRequirement {
301 public boolean marketMatchesRequirement(MarketAPI market) {
302 return market.isHidden();
305 public static class MarketNotHiddenReq
implements MarketRequirement {
306 public boolean marketMatchesRequirement(MarketAPI market) {
307 return !market.isHidden();
311 public static class MarketNotInHyperReq
implements MarketRequirement {
312 public boolean marketMatchesRequirement(MarketAPI market) {
313 return !market.isInHyperspace();
317 public static class MarketMemoryFlagReq
implements MarketRequirement {
320 public MarketMemoryFlagReq(String key, Object value) {
324 public boolean marketMatchesRequirement(MarketAPI market) {
325 Object val = market.getMemoryWithoutUpdate().get(key);
326 return val !=
null && val.equals(value);
330 public static class MarketLocationReq
implements MarketRequirement {
332 Set<LocationAPI> locations;
333 public MarketLocationReq(
boolean negate, LocationAPI ... locations) {
334 this.locations =
new LinkedHashSet<LocationAPI>();
335 this.locations.addAll(Arrays.asList(locations));
336 this.negate = negate;
338 public boolean marketMatchesRequirement(MarketAPI market) {
339 boolean result = locations.contains(market.getContainingLocation());
344 public static class MarketFactionCustomReq
extends StringCollectionReqs implements MarketRequirement {
345 public MarketFactionCustomReq(ReqMode mode, String ... custom) {
348 public boolean marketMatchesRequirement(MarketAPI market) {
349 Set<String>
set =
new HashSet<String>();
350 for (String custom : tags) {
351 if (market.getFaction().getCustomBoolean(custom)) {
355 return matchesRequirements(
set);
359 public static interface GenericRequirement {
362 public static interface StarSystemRequirement
extends GenericRequirement {
363 public boolean systemMatchesRequirement(StarSystemAPI system);
365 public static interface PlanetRequirement
extends GenericRequirement {
366 public boolean planetMatchesRequirement(PlanetAPI planet);
368 public static interface EntityRequirement
extends GenericRequirement {
369 public boolean entityMatchesRequirement(SectorEntityToken entity);
371 public static interface MarketRequirement
extends GenericRequirement {
372 public boolean marketMatchesRequirement(MarketAPI market);
374 public static interface CommodityRequirement
extends GenericRequirement {
375 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com);
377 public static interface TerrainRequirement
extends GenericRequirement {
378 public boolean terrainMatchesRequirement(CampaignTerrainAPI terrain);
381 public static boolean matchesReq(GenericRequirement req, Object param) {
382 if (req instanceof StarSystemRequirement) {
383 return ((StarSystemRequirement) req).systemMatchesRequirement((StarSystemAPI) param);
385 if (req instanceof PlanetRequirement) {
386 return ((PlanetRequirement) req).planetMatchesRequirement((PlanetAPI) param);
388 if (req instanceof EntityRequirement) {
389 return ((EntityRequirement) req).entityMatchesRequirement((SectorEntityToken) param);
391 if (req instanceof MarketRequirement) {
392 if (((MarketAPI)param).isInvalidMissionTarget())
return false;
393 return ((MarketRequirement) req).marketMatchesRequirement((MarketAPI) param);
395 if (req instanceof CommodityRequirement) {
396 return ((CommodityRequirement) req).commodityMatchesRequirement((CommodityOnMarketAPI) param);
398 if (req instanceof TerrainRequirement) {
399 return ((TerrainRequirement) req).terrainMatchesRequirement((CampaignTerrainAPI) param);
404 public static class TerrainTypeReq
extends StringCollectionReqs implements TerrainRequirement {
405 public TerrainTypeReq(
ReqMode mode, String[] types) {
408 public boolean terrainMatchesRequirement(CampaignTerrainAPI terrain) {
409 Set<String>
set =
new HashSet<String>();
410 set.add(terrain.getType());
411 return matchesRequirements(
set);
414 public static class TerrainHasSpecialNameReq
implements TerrainRequirement {
415 public TerrainHasSpecialNameReq() {
417 public boolean terrainMatchesRequirement(CampaignTerrainAPI terrain) {
418 String n1 = terrain.getPlugin().getTerrainName();
419 String n2 = terrain.getPlugin().getNameForTooltip();
420 if (n1 ==
null)
return false;
421 return (!n1.equals(n2));
424 public static class EntityUndiscoveredReq
implements EntityRequirement {
426 public EntityUndiscoveredReq(
boolean negate) {
427 this.negate = negate;
429 public boolean entityMatchesRequirement(SectorEntityToken entity) {
430 boolean result = entity.isDiscoverable();
436 public static class EntityTypeReq
implements EntityRequirement {
437 private Set<String>
set;
438 public EntityTypeReq(String[] types) {
439 set =
new LinkedHashSet<String>();
440 for (String type : types) {
444 public boolean entityMatchesRequirement(SectorEntityToken entity) {
445 return set.contains(entity.getCustomEntityType());
449 public static class EntityMemoryReq
implements EntityRequirement {
450 private List<String> flags =
new ArrayList<String>();
451 public EntityMemoryReq(String ... flags) {
452 for (String flag : flags) {
453 this.flags.add(flag);
456 public boolean entityMatchesRequirement(SectorEntityToken entity) {
457 for (String flag : flags) {
458 if (!entity.getMemoryWithoutUpdate().getBoolean(flag))
return false;
464 public static class SystemOnFringeOfSectorReq
implements StarSystemRequirement {
465 protected float rangeLY = Global.getSettings().getFloat(
"sectorHeight") / Misc.getUnitsPerLightYear() *
467 protected boolean negate =
false;
468 public SystemOnFringeOfSectorReq() {
471 public SystemOnFringeOfSectorReq(
boolean negate) {
472 this.negate = negate;
474 public boolean systemMatchesRequirement(StarSystemAPI system) {
475 boolean result = Misc.getDistanceLY(
new Vector2f(), system.getLocation()) > rangeLY;
480 public static class SystemInInnerSectorReq
implements StarSystemRequirement {
481 protected float rangeLY = Global.getSettings().getFloat(
"sectorHeight") / Misc.getUnitsPerLightYear() *
483 protected boolean negate =
false;
484 public SystemInInnerSectorReq() {
487 public SystemInInnerSectorReq(
boolean negate) {
488 this.negate = negate;
490 public boolean systemMatchesRequirement(StarSystemAPI system) {
491 boolean result = Misc.getDistanceLY(
new Vector2f(), system.getLocation()) < rangeLY;
497 public static class SystemWithinRangeReq
implements StarSystemRequirement {
498 private Vector2f loc;
499 private float minRangeLY;
500 private float maxRangeLY;
501 public SystemWithinRangeReq(Vector2f loc,
float minRangeLY,
float maxRangeLY) {
503 this.minRangeLY = minRangeLY;
504 this.maxRangeLY = maxRangeLY;
506 public boolean systemMatchesRequirement(StarSystemAPI system) {
507 float dist = Misc.getDistanceLY(loc, system.getLocation());
508 return dist >= minRangeLY && dist <= maxRangeLY;
512 public static class SystemHasBaseReq
implements StarSystemRequirement {
513 private String factionId;
514 public SystemHasBaseReq(String factionId) {
515 this.factionId = factionId;
517 public boolean systemMatchesRequirement(StarSystemAPI system) {
518 for (MarketAPI market : Misc.getMarketsInLocation(system)) {
519 if (!factionId.equals(market.getFactionId()))
continue;
520 if (market.getMemoryWithoutUpdate().getBoolean(MemFlags.HIDDEN_BASE_MEM_FLAG)) {
528 public static class SystemHasColonyReq
implements StarSystemRequirement {
529 private String factionId;
531 public SystemHasColonyReq(String factionId,
int minSize) {
532 this.factionId = factionId;
533 this.minSize = minSize;
535 public boolean systemMatchesRequirement(StarSystemAPI system) {
536 for (MarketAPI market : Misc.getMarketsInLocation(system)) {
537 if (!factionId.equals(market.getFactionId()))
continue;
538 if (market.getSize() < minSize)
continue;
539 if (market.getMemoryWithoutUpdate().getBoolean(MemFlags.HIDDEN_BASE_MEM_FLAG)) {
548 public static class MultipleStarSystemRequirements
implements StarSystemRequirement {
549 protected StarSystemRequirement [] reqs;
550 protected ReqMode mode;
551 public MultipleStarSystemRequirements(ReqMode mode, StarSystemRequirement ... reqs) {
555 public boolean systemMatchesRequirement(StarSystemAPI system) {
558 for (StarSystemRequirement req : reqs) if (!req.systemMatchesRequirement(system)) return false;
561 for (StarSystemRequirement req : reqs) if (req.systemMatchesRequirement(system)) return true;
564 for (StarSystemRequirement req : reqs) if (!req.systemMatchesRequirement(system)) return true;
567 for (StarSystemRequirement req : reqs) if (req.systemMatchesRequirement(system)) return false;
573 public static class MultiplePlanetRequirements
implements PlanetRequirement {
574 protected PlanetRequirement [] reqs;
575 protected ReqMode mode;
576 public MultiplePlanetRequirements(ReqMode mode, PlanetRequirement ... reqs) {
580 public boolean planetMatchesRequirement(PlanetAPI planet) {
583 for (PlanetRequirement req : reqs) if (!req.planetMatchesRequirement(planet)) return false;
586 for (PlanetRequirement req : reqs) if (req.planetMatchesRequirement(planet)) return true;
589 for (PlanetRequirement req : reqs) if (!req.planetMatchesRequirement(planet)) return true;
592 for (PlanetRequirement req : reqs) if (req.planetMatchesRequirement(planet)) return false;
598 public static class MultipleEntityRequirements
implements EntityRequirement {
599 protected EntityRequirement [] reqs;
600 protected ReqMode mode;
601 public MultipleEntityRequirements(ReqMode mode, EntityRequirement ... reqs) {
605 public boolean entityMatchesRequirement(SectorEntityToken entity) {
608 for (EntityRequirement req : reqs) if (!req.entityMatchesRequirement(entity)) return false;
611 for (EntityRequirement req : reqs) if (req.entityMatchesRequirement(entity)) return true;
614 for (EntityRequirement req : reqs) if (!req.entityMatchesRequirement(entity)) return true;
617 for (EntityRequirement req : reqs) if (req.entityMatchesRequirement(entity)) return false;
624 public static class MultipleMarketRequirements
implements MarketRequirement {
625 protected MarketRequirement [] reqs;
626 protected ReqMode mode;
627 public MultipleMarketRequirements(ReqMode mode, MarketRequirement ... reqs) {
631 public boolean marketMatchesRequirement(MarketAPI market) {
634 for (MarketRequirement req : reqs) if (!req.marketMatchesRequirement(market)) return false;
637 for (MarketRequirement req : reqs) if (req.marketMatchesRequirement(market)) return true;
640 for (MarketRequirement req : reqs) if (!req.marketMatchesRequirement(market)) return true;
643 for (MarketRequirement req : reqs) if (req.marketMatchesRequirement(market)) return false;
650 public static class MultipleCommodityRequirements
implements CommodityRequirement {
651 protected CommodityRequirement [] reqs;
652 protected ReqMode mode;
653 public MultipleCommodityRequirements(ReqMode mode, CommodityRequirement ... reqs) {
657 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
660 for (CommodityRequirement req : reqs) if (!req.commodityMatchesRequirement(com)) return false;
663 for (CommodityRequirement req : reqs) if (req.commodityMatchesRequirement(com)) return true;
666 for (CommodityRequirement req : reqs) if (!req.commodityMatchesRequirement(com)) return true;
669 for (CommodityRequirement req : reqs) if (req.commodityMatchesRequirement(com)) return false;
677 public static class PlanetOrbitIsNotNearJumpPoint
implements PlanetRequirement {
678 protected float checkDist;
679 public PlanetOrbitIsNotNearJumpPoint(
float checkDist) {
680 this.checkDist = checkDist;
682 public boolean planetMatchesRequirement(PlanetAPI planet) {
683 StarSystemAPI system = planet.getStarSystem();
684 if (system ==
null)
return true;
686 float planetDist = planet.getCircularOrbitRadius();
687 if (planet.getOrbit() ==
null) {
688 planetDist = planet.getLocation().length();
691 for (SectorEntityToken jp : system.getJumpPoints()) {
693 if (jp.getOrbitFocus() == planet.getOrbitFocus()) {
694 float jpDist = jp.getCircularOrbitRadius();
695 if (jp.getOrbitFocus() ==
null) {
696 jpDist = jp.getLocation().length();
698 dist = Math.abs(planetDist - jpDist);
699 if (jp.getOrbitFocus() ==
null && planet.getOrbitFocus() ==
null) {
700 dist = Misc.getDistance(planet, jp);
702 }
else if (jp.getOrbitFocus() ==
null && planet.getOrbitFocus() !=
null) {
703 float jpDist = Misc.getDistance(jp, planet.getOrbitFocus());
704 dist = Math.abs(planetDist - jpDist);
705 if (jp.getOrbitFocus() ==
null && planet.getOrbitFocus() ==
null) {
706 dist = Misc.getDistance(planet, jp);
708 }
else if (jp.getOrbitFocus() !=
null && planet.getOrbitFocus() ==
null) {
709 float jpDist = jp.getCircularOrbitRadius();
710 float pDist2 = Misc.getDistance(jp.getOrbitFocus(), jp);
711 dist = Math.abs(pDist2 - jpDist);
712 if (jp.getOrbitFocus() ==
null && planet.getOrbitFocus() ==
null) {
713 dist = Misc.getDistance(planet, jp);
715 }
else if (jp.getOrbitFocus() !=
null && planet.getOrbitFocus() !=
null) {
717 float jpDist = jp.getCircularOrbitRadius();
718 dist = Misc.getDistance(jp.getOrbitFocus(), planet.getOrbitFocus());
719 dist -= planetDist + jpDist;
721 if (dist < checkDist)
return false;
727 public static class PlanetIsPopulatedReq
implements PlanetRequirement {
728 protected boolean negate =
false;
729 public PlanetIsPopulatedReq() {
732 public PlanetIsPopulatedReq(
boolean negate) {
733 this.negate = negate;
735 public boolean planetMatchesRequirement(PlanetAPI planet) {
736 boolean result = planet.getMarket() !=
null && !planet.getMarket().isPlanetConditionMarketOnly();
741 public static class PlanetUnexploredRuinsReq
implements PlanetRequirement {
742 protected boolean negate =
false;
743 public PlanetUnexploredRuinsReq() {
746 public PlanetUnexploredRuinsReq(
boolean negate) {
747 this.negate = negate;
749 public boolean planetMatchesRequirement(PlanetAPI planet) {
750 MarketAPI market = planet.getMarket();
751 boolean result = market !=
null && market.isPlanetConditionMarketOnly() &&
752 !market.getMemoryWithoutUpdate().getBoolean(
"$ruinsExplored");
757 public static class PlanetFullySurveyedReq
implements PlanetRequirement {
758 protected boolean negate =
false;
759 public PlanetFullySurveyedReq() {
762 public PlanetFullySurveyedReq(
boolean negate) {
763 this.negate = negate;
765 public boolean planetMatchesRequirement(PlanetAPI planet) {
766 boolean result = planet.getMarket() !=
null && planet.getMarket().getSurveyLevel() == SurveyLevel.FULL;
771 public static class PlanetUnsurveyedReq
implements PlanetRequirement {
772 protected boolean negate =
false;
773 public PlanetUnsurveyedReq() {
776 public PlanetUnsurveyedReq(
boolean negate) {
777 this.negate = negate;
779 public boolean planetMatchesRequirement(PlanetAPI planet) {
780 boolean result = planet.getMarket() !=
null && planet.getMarket().getSurveyLevel() == SurveyLevel.NONE;
785 public static class PlanetIsGasGiantReq
implements PlanetRequirement {
786 protected boolean negate =
false;
787 public PlanetIsGasGiantReq() {
790 public PlanetIsGasGiantReq(
boolean negate) {
791 this.negate = negate;
793 public boolean planetMatchesRequirement(PlanetAPI planet) {
794 boolean result = planet.isGasGiant();
799 public static class SystemHasPulsarReq
implements StarSystemRequirement {
800 protected boolean negate =
false;
801 public SystemHasPulsarReq() {
804 public SystemHasPulsarReq(
boolean negate) {
805 this.negate = negate;
807 public boolean systemMatchesRequirement(StarSystemAPI system) {
808 boolean result = Misc.hasPulsar(system);
814 public static class SystemHasAtLeastJumpPointsReq
implements StarSystemRequirement {
815 protected int min = 0;
816 public SystemHasAtLeastJumpPointsReq(
int min) {
819 public boolean systemMatchesRequirement(StarSystemAPI system) {
820 return system.getJumpPoints().size() >= min;
824 public static class SystemIsNebulaReq
implements StarSystemRequirement {
825 protected boolean negate =
false;
826 public SystemIsNebulaReq() {
829 public SystemIsNebulaReq(
boolean negate) {
830 this.negate = negate;
832 public boolean systemMatchesRequirement(StarSystemAPI system) {
833 boolean result = system.isNebula();
838 public static class SystemIsBlackHoleReq
implements StarSystemRequirement {
839 protected boolean negate =
false;
840 public SystemIsBlackHoleReq() {
843 public SystemIsBlackHoleReq(
boolean negate) {
844 this.negate = negate;
846 public boolean systemMatchesRequirement(StarSystemAPI system) {
847 boolean result = system.getStar() !=
null && system.getStar().getSpec().isBlackHole();
852 public static class StarSystemUnexploredReq
implements StarSystemRequirement {
853 protected boolean negate =
false;
854 public StarSystemUnexploredReq() {
857 public StarSystemUnexploredReq(
boolean negate) {
858 this.negate = negate;
860 public boolean systemMatchesRequirement(StarSystemAPI system) {
864 boolean result = !system.isEnteredByPlayer();
865 if (DebugFlags.ALLOW_VIEW_UNEXPLORED_SYSTEM_MAP) {
866 result = system.getDaysSinceLastPlayerVisit() >= 100000f;
873 public static class StarSystemDaysSincePlayerVisitReq
implements StarSystemRequirement {
874 protected float days;
875 public StarSystemDaysSincePlayerVisitReq(
float days) {
878 public boolean systemMatchesRequirement(StarSystemAPI system) {
879 boolean result = system.getDaysSinceLastPlayerVisit() >= days;
883 public static class StarSystemHasNumPlanetsReq
implements StarSystemRequirement {
885 public StarSystemHasNumPlanetsReq(
int num) {
888 public boolean systemMatchesRequirement(StarSystemAPI system) {
890 if (system.getStar() !=
null) stars++;
891 if (system.getSecondary() !=
null) stars++;
892 if (system.getTertiary() !=
null) stars++;
893 return system.getPlanets().size() - stars >= num;
897 public static class StarSystemHasNumTerrainReq
implements StarSystemRequirement {
899 public StarSystemHasNumTerrainReq(
int num) {
902 public boolean systemMatchesRequirement(StarSystemAPI system) {
903 return system.getTerrainCopy().size() >= num;
907 public static class StarSystemHasNumPlanetsAndTerrainReq
implements StarSystemRequirement {
909 public StarSystemHasNumPlanetsAndTerrainReq(
int num) {
912 public boolean systemMatchesRequirement(StarSystemAPI system) {
914 if (system.getStar() !=
null) stars++;
915 if (system.getSecondary() !=
null) stars++;
916 if (system.getTertiary() !=
null) stars++;
917 return system.getPlanets().size() - stars + system.getTerrainCopy().size() >= num;
921 public static class StringCollectionReqs {
923 List<String> tags =
new ArrayList<String>();
924 public StringCollectionReqs(ReqMode mode, String ... tags) {
926 for (String tag : tags) {
930 public boolean matchesRequirements(Collection<String>
set) {
933 for (String tag : tags) if (!
set.contains(tag)) return false;
936 for (String tag : tags) if (
set.contains(tag)) return true;
939 for (String tag : tags) if (!
set.contains(tag)) return true;
942 for (String tag : tags) if (
set.contains(tag)) return false;
949 public static class RequiredSystemTags
extends StringCollectionReqs implements StarSystemRequirement {
950 public RequiredSystemTags(ReqMode mode, String[] tags) {
953 public boolean systemMatchesRequirement(StarSystemAPI system) {
954 return matchesRequirements(system.getTags());
957 public static class RequiredTerrainTags
extends StringCollectionReqs implements TerrainRequirement {
958 public RequiredTerrainTags(ReqMode mode, String[] tags) {
961 public boolean terrainMatchesRequirement(CampaignTerrainAPI terrain) {
962 return matchesRequirements(terrain.getTags());
965 public static class RequiredPlanetTags
extends StringCollectionReqs implements PlanetRequirement {
966 public RequiredPlanetTags(ReqMode mode, String[] tags) {
969 public boolean planetMatchesRequirement(PlanetAPI planet) {
970 return matchesRequirements(planet.getTags());
973 public static class RequiredEntityTags
extends StringCollectionReqs implements EntityRequirement {
974 public RequiredEntityTags(ReqMode mode, String[] tags) {
977 public boolean entityMatchesRequirement(SectorEntityToken entity) {
978 return matchesRequirements(entity.getTags());
981 public static class RequiredPlanetConditions
extends StringCollectionReqs implements PlanetRequirement {
982 public RequiredPlanetConditions(ReqMode mode, String[] tags) {
985 public boolean planetMatchesRequirement(PlanetAPI planet) {
986 List<String>
set =
new ArrayList<String>();
987 if (planet.getMarket() !=
null) {
988 for (MarketConditionAPI mc : planet.
getMarket().getConditions()) {
992 return matchesRequirements(
set);
996 public static class RequiredCommodityTags
extends StringCollectionReqs implements CommodityRequirement {
997 public RequiredCommodityTags(ReqMode mode, String[] tags) {
1000 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
1001 List<String>
set =
new ArrayList<String>();
1002 set.addAll(com.getCommodity().getTags());
1003 return matchesRequirements(
set);
1007 public static class RequiredMarketConditions
extends StringCollectionReqs implements MarketRequirement {
1008 public RequiredMarketConditions(ReqMode mode, String[] tags) {
1011 public boolean marketMatchesRequirement(MarketAPI market) {
1012 List<String>
set =
new ArrayList<String>();
1013 for (MarketConditionAPI mc : market.getConditions()) {
1014 set.add(mc.getId());
1016 return matchesRequirements(
set);
1020 public static class RequiredMarketIndustries
extends StringCollectionReqs implements MarketRequirement {
1021 public RequiredMarketIndustries(ReqMode mode, String[] tags) {
1024 public boolean marketMatchesRequirement(MarketAPI market) {
1025 List<String>
set =
new ArrayList<String>();
1026 for (Industry ind : market.getIndustries()) {
1027 set.add(ind.getId());
1029 return matchesRequirements(
set);
1034 public static class SearchData {
1035 public List<GenericRequirement> systemReqs =
new ArrayList<GenericRequirement>();
1036 public List<GenericRequirement> systemPrefs =
new ArrayList<GenericRequirement>();
1037 public List<PlanetRequirement> planetReqs =
new ArrayList<PlanetRequirement>();
1038 public List<PlanetRequirement> planetPrefs =
new ArrayList<PlanetRequirement>();
1039 public List<EntityRequirement> entityReqs =
new ArrayList<EntityRequirement>();
1040 public List<EntityRequirement> entityPrefs =
new ArrayList<EntityRequirement>();
1041 public List<MarketRequirement> marketReqs =
new ArrayList<MarketRequirement>();
1042 public List<MarketRequirement> marketPrefs =
new ArrayList<MarketRequirement>();
1043 public List<TerrainRequirement> terrainReqs =
new ArrayList<TerrainRequirement>();
1044 public List<TerrainRequirement> terrainPrefs =
new ArrayList<TerrainRequirement>();
1045 public List<CommodityRequirement> commodityReqs =
new ArrayList<CommodityRequirement>();
1046 public List<CommodityRequirement> commodityPrefs =
new ArrayList<CommodityRequirement>();
1048 List<StarSystemAPI> matchingSystems =
null;
1049 List<StarSystemAPI> preferredSystems =
null;
1051 List<MarketAPI> matchingMarkets =
null;
1052 List<MarketAPI> preferredMarkets =
null;
1055 protected transient SearchData
search =
new SearchData();
1061 search =
new SearchData();
1077 search.systemPrefs.add(
new SystemInDirectionOfOtherMissionsReq(
this, 1f));
1081 search.systemReqs.add(
new SystemInDirection(
this, dir, arc));
1085 search.systemPrefs.add(
new SystemInDirection(
this, dir, arc));
1089 search.systemReqs.add(
new SystemInDirectionFrom(from, dir, arc));
1093 search.systemPrefs.add(
new SystemInDirectionFrom(from, dir, arc));
1103 search.planetPrefs.add(
new PlanetInDirectionOfOtherMissionsReq(
this, 1f));
1107 search.entityPrefs.add(
new EntityInDirectionOfOtherMissionsReq(
this, 1f));
1111 search.terrainPrefs.add(
new TerrainInDirectionOfOtherMissionsReq(
this, 1f));
1115 search.marketPrefs.add(
new MarketInDirectionOfOtherMissionsReq(
this, 1f));
1119 search.systemReqs.add(
new RequiredSystemTags(mode, tags));
1122 search.systemPrefs.add(
new RequiredSystemTags(mode, tags));
1125 search.systemReqs.add(
new SystemHasBaseReq(factionId));
1128 search.systemPrefs.add(
new SystemHasBaseReq(factionId));
1131 search.systemReqs.add(
new SystemHasColonyReq(factionId, minSize));
1134 search.systemPrefs.add(
new SystemHasColonyReq(factionId, minSize));
1138 search.systemReqs.add(
new SystemHasAtLeastJumpPointsReq(min));
1141 search.systemPrefs.add(
new SystemHasAtLeastJumpPointsReq(min));
1145 search.systemReqs.add(
new StarSystemUnexploredReq());
1148 search.systemPrefs.add(
new StarSystemUnexploredReq());
1153 search.systemReqs.add(
new StarSystemDaysSincePlayerVisitReq(days));
1156 search.systemPrefs.add(
new StarSystemDaysSincePlayerVisitReq(days));
1160 search.systemReqs.add(
new StarSystemUnexploredReq(
true));
1163 search.systemPrefs.add(
new StarSystemUnexploredReq(
true));
1166 search.systemReqs.add(
new StarSystemHasNumPlanetsReq(num));
1169 search.systemPrefs.add(
new StarSystemHasNumPlanetsReq(num));
1173 search.systemReqs.add(
new StarSystemHasNumTerrainReq(num));
1176 search.systemPrefs.add(
new StarSystemHasNumTerrainReq(num));
1180 search.systemReqs.add(
new StarSystemHasNumPlanetsAndTerrainReq(num));
1183 search.systemPrefs.add(
new StarSystemHasNumTerrainReq(num));
1198 search.systemReqs.add(
new SystemIsBlackHoleReq());
1201 search.systemReqs.add(
new SystemIsNebulaReq());
1204 search.systemReqs.add(
new SystemHasPulsarReq());
1207 search.systemPrefs.add(
new SystemIsBlackHoleReq());
1210 search.systemPrefs.add(
new SystemIsNebulaReq());
1213 search.systemPrefs.add(
new SystemHasPulsarReq());
1218 new SystemIsBlackHoleReq(),
new SystemHasPulsarReq(),
new SystemIsNebulaReq()));
1222 new SystemIsBlackHoleReq(),
new SystemHasPulsarReq(),
new SystemIsNebulaReq()));
1227 new SystemIsBlackHoleReq(),
new SystemIsNebulaReq()));
1231 new SystemIsBlackHoleReq(),
new SystemIsNebulaReq()));
1235 search.systemReqs.add(
new SystemIsBlackHoleReq(
true));
1238 search.systemReqs.add(
new SystemIsNebulaReq(
true));
1241 search.systemReqs.add(
new SystemHasPulsarReq(
true));
1258 search.systemPrefs.add(
new SystemIsBlackHoleReq(
true));
1261 search.systemPrefs.add(
new SystemIsNebulaReq(
true));
1264 search.systemPrefs.add(
new SystemHasPulsarReq(
true));
1275 search.systemReqs.add(
new SystemInInnerSectorReq());
1278 search.systemPrefs.add(
new SystemInInnerSectorReq());
1281 search.systemReqs.add(
new SystemOnFringeOfSectorReq());
1284 search.systemPrefs.add(
new SystemOnFringeOfSectorReq());
1288 search.systemReqs.add(
new SystemWithinRangeReq(location, 0, rangeLY));
1291 search.systemPrefs.add(
new SystemWithinRangeReq(location, 0, rangeLY));
1295 search.systemReqs.add(
new SystemWithinRangeReq(location, rangeLY, 1000000f));
1298 search.systemPrefs.add(
new SystemWithinRangeReq(location, rangeLY, 1000000));
1302 search.systemReqs.add(
new SystemWithinRangeReq(location, minRangeLY, maxRangeLY));
1305 search.systemPrefs.add(
new SystemWithinRangeReq(location, minRangeLY, maxRangeLY));
1316 search.planetReqs.add(
new PlanetIsGasGiantReq(
true));
1319 search.planetPrefs.add(
new PlanetIsGasGiantReq(
true));
1323 search.planetReqs.add(
new PlanetOrbitIsNotNearJumpPoint(minDist));
1326 search.planetPrefs.add(
new PlanetOrbitIsNotNearJumpPoint(minDist));
1330 search.planetReqs.add(
new PlanetIsGasGiantReq());
1333 search.planetPrefs.add(
new PlanetIsGasGiantReq());
1337 search.planetReqs.add(
new PlanetIsPopulatedReq());
1340 search.planetPrefs.add(
new PlanetIsPopulatedReq());
1343 search.planetReqs.add(
new PlanetIsPopulatedReq(
true));
1346 search.planetPrefs.add(
new PlanetIsPopulatedReq(
true));
1350 search.planetReqs.add(
new RequiredPlanetTags(mode, tags));
1353 search.planetPrefs.add(
new RequiredPlanetTags(mode, tags));
1357 search.planetReqs.add(
new RequiredPlanetConditions(mode, tags));
1360 search.planetPrefs.add(
new RequiredPlanetConditions(mode, conditions));
1364 search.planetReqs.add(
new PlanetFullySurveyedReq(
true));
1367 search.planetPrefs.add(
new PlanetFullySurveyedReq(
true));
1370 search.planetReqs.add(
new PlanetFullySurveyedReq());
1373 search.planetPrefs.add(
new PlanetFullySurveyedReq());
1376 search.planetPrefs.add(
new PlanetUnsurveyedReq());
1379 search.planetReqs.add(
new PlanetUnsurveyedReq());
1384 Conditions.RUINS_EXTENSIVE, Conditions.RUINS_VAST);
1388 Conditions.RUINS_EXTENSIVE, Conditions.RUINS_VAST);
1392 Conditions.RUINS_EXTENSIVE, Conditions.RUINS_VAST);
1396 Conditions.RUINS_EXTENSIVE, Conditions.RUINS_VAST);
1400 search.planetReqs.add(
new PlanetUnexploredRuinsReq());
1403 search.planetPrefs.add(
new PlanetUnexploredRuinsReq());
1408 search.entityReqs.add(
new RequiredEntityTags(mode, tags));
1411 search.entityPrefs.add(
new RequiredEntityTags(mode, tags));
1415 search.entityReqs.add(
new EntityTypeReq(types));
1418 search.entityPrefs.add(
new EntityTypeReq(types));
1422 search.entityReqs.add(
new EntityMemoryReq(
flags));
1425 search.entityPrefs.add(
new EntityMemoryReq(
flags));
1429 search.entityReqs.add(
new EntityUndiscoveredReq(
false));
1432 search.entityPrefs.add(
new EntityUndiscoveredReq(
false));
1436 search.entityReqs.add(
new EntityRequirement() {
1437 public boolean entityMatchesRequirement(SectorEntityToken param) {
1438 return entity != param;
1443 search.planetReqs.add(
new PlanetRequirement() {
1444 public boolean planetMatchesRequirement(PlanetAPI param) {
1445 return planet != param;
1450 if (system ==
null)
return;
1451 search.systemReqs.add(
new StarSystemRequirement() {
1452 public boolean systemMatchesRequirement(StarSystemAPI param) {
1453 return system != param;
1459 search.systemReqs.add(
new StarSystemRequirement() {
1460 public boolean systemMatchesRequirement(StarSystemAPI param) {
1461 return system == param;
1467 search.systemReqs.add(req);
1470 search.systemPrefs.add(req);
1474 @SuppressWarnings(
"unchecked")
1476 List matches, List preferred) {
1477 if (reqs.isEmpty() && prefs.isEmpty()) {
1478 matches.addAll(params);
1482 OUTER:
for (Object param : params) {
1483 for (Object req : reqs) {
1484 if (!
matchesReq((GenericRequirement) req, param))
continue OUTER;
1496 List matchingPrefs =
new ArrayList(matches);
1497 boolean foundAny =
false;
1498 for (Object req : prefs) {
1499 List retain =
new ArrayList();
1500 for (Object curr : matchingPrefs) {
1501 if (
matchesReq((GenericRequirement) req, curr)) {
1505 if (retain.isEmpty())
continue;
1507 matchingPrefs.retainAll(retain);
1510 preferred.addAll(matchingPrefs);
1520 @SuppressWarnings(
"unchecked")
1522 WeightedRandomPicker pref =
new WeightedRandomPicker(
genRandom);
1523 WeightedRandomPicker other =
new WeightedRandomPicker(
genRandom);
1524 pref.addAll(preferred);
1525 other.addAll(matches);
1527 if (!pref.isEmpty()) {
1531 return other.pick();
1536 search.matchingSystems =
new ArrayList<StarSystemAPI>();
1537 search.preferredSystems =
new ArrayList<StarSystemAPI>();
1563 List<PlanetAPI> inPreferredSystems =
new ArrayList<PlanetAPI>();
1564 List<PlanetAPI> inMatchingSystems =
new ArrayList<PlanetAPI>();
1565 for (StarSystemAPI system :
search.matchingSystems) {
1566 for (PlanetAPI planet : system.getPlanets()) {
1567 if (planet.hasTag(Tags.NOT_RANDOM_MISSION_TARGET))
continue;
1568 inMatchingSystems.add(planet);
1572 for (StarSystemAPI system :
search.preferredSystems) {
1573 for (PlanetAPI planet : system.getPlanets()) {
1574 if (planet.hasTag(Tags.NOT_RANDOM_MISSION_TARGET))
continue;
1575 inPreferredSystems.add(planet);
1580 List<PlanetAPI> matchesInPref =
new ArrayList<PlanetAPI>();
1581 List<PlanetAPI> preferredInPref =
new ArrayList<PlanetAPI>();
1583 if (!preferredInPref.isEmpty()) {
1587 List<PlanetAPI> matchesInMatches =
new ArrayList<PlanetAPI>();
1588 List<PlanetAPI> preferredInMatches =
new ArrayList<PlanetAPI>();
1591 if (!matchesInPref.isEmpty()) {
1595 if (!preferredInMatches.isEmpty()) {
1600 if (!preferredInMatches.isEmpty()) {
1604 if (!matchesInPref.isEmpty()) {
1683 List<SectorEntityToken> inPreferredSystems =
new ArrayList<SectorEntityToken>();
1684 List<SectorEntityToken> inMatchingSystems =
new ArrayList<SectorEntityToken>();
1685 for (StarSystemAPI system :
search.matchingSystems) {
1686 List<SectorEntityToken> entities =
new ArrayList<SectorEntityToken>(system.getAllEntities());
1687 for (SectorEntityToken entity : entities) {
1688 if (entity instanceof AsteroidAPI)
continue;
1689 if (entity.hasTag(Tags.EXPIRES))
continue;
1690 if (entity.hasTag(Tags.NOT_RANDOM_MISSION_TARGET))
continue;
1692 inMatchingSystems.add(entity);
1695 for (StarSystemAPI system :
search.preferredSystems) {
1696 List<SectorEntityToken> entities =
new ArrayList<SectorEntityToken>(system.getAllEntities());
1697 for (SectorEntityToken entity : entities) {
1698 if (entity instanceof AsteroidAPI)
continue;
1699 if (entity.hasTag(Tags.EXPIRES))
continue;
1700 if (entity.hasTag(Tags.NOT_RANDOM_MISSION_TARGET))
continue;
1701 inPreferredSystems.add(entity);
1705 List<SectorEntityToken> matchesInPref =
new ArrayList<SectorEntityToken>();
1706 List<SectorEntityToken> preferredInPref =
new ArrayList<SectorEntityToken>();
1708 if (!preferredInPref.isEmpty()) {
1712 List<SectorEntityToken> matchesInMatches =
new ArrayList<SectorEntityToken>();
1713 List<SectorEntityToken> preferredInMatches =
new ArrayList<SectorEntityToken>();
1716 if (!matchesInPref.isEmpty()) {
1720 if (!preferredInMatches.isEmpty()) {
1722 return (SectorEntityToken)
pickOneObject(preferredInMatches);
1725 if (!preferredInMatches.isEmpty()) {
1727 return (SectorEntityToken)
pickOneObject(preferredInMatches);
1729 if (!matchesInPref.isEmpty()) {
1802 List<MarketAPI> markets =
new ArrayList<MarketAPI>();;
1803 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
1804 if (market.hasTag(Tags.NOT_RANDOM_MISSION_TARGET)) {
1807 if (market.getPlanetEntity() !=
null && market.getPlanetEntity().hasTag(Tags.NOT_RANDOM_MISSION_TARGET)) {
1810 markets.add(market);
1829 search.matchingMarkets =
new ArrayList<MarketAPI>();
1830 search.preferredMarkets =
new ArrayList<MarketAPI>();
1855 WeightedRandomPicker<CommodityOnMarketAPI> pref =
new WeightedRandomPicker<CommodityOnMarketAPI>(
genRandom);
1856 WeightedRandomPicker<CommodityOnMarketAPI> other =
new WeightedRandomPicker<CommodityOnMarketAPI>(
genRandom);
1858 for (MarketAPI market :
search.matchingMarkets) {
1859 SKIP:
for (CommodityOnMarketAPI com : market.getAllCommodities()) {
1860 if (com.isMeta())
continue;
1861 if (com.isNonEcon())
continue;
1863 for (CommodityRequirement req :
search.commodityReqs) {
1864 if (!req.commodityMatchesRequirement(com))
continue SKIP;
1870 List<CommodityOnMarketAPI> matchingPrefs =
new ArrayList<CommodityOnMarketAPI>(other.getItems());
1871 boolean foundAny =
false;
1872 for (CommodityRequirement req :
search.commodityPrefs) {
1873 List<CommodityOnMarketAPI> retain =
new ArrayList<CommodityOnMarketAPI>();
1874 for (CommodityOnMarketAPI com : matchingPrefs) {
1875 if (req.commodityMatchesRequirement(com)) {
1879 if (retain.isEmpty())
continue;
1881 matchingPrefs.retainAll(retain);
1884 pref.addAll(matchingPrefs);
1888 CommodityOnMarketAPI
result = pref.pick();
1910 search.marketReqs.add(
new MarketTacticalBombardableReq(
false));
1913 search.marketReqs.add(
new MarketTacticalBombardableReq(
true));
1916 search.marketPrefs.add(
new MarketTacticalBombardableReq(
false));
1919 search.marketPrefs.add(
new MarketTacticalBombardableReq(
true));
1922 search.marketReqs.add(
new MarketMilitaryReq());
1925 search.marketPrefs.add(
new MarketMilitaryReq());
1928 search.marketReqs.add(
new MarketNotMilitaryReq());
1931 search.marketPrefs.add(
new MarketNotMilitaryReq());
1935 search.marketReqs.add(
new MarketMemoryFlagReq(key, value));
1938 search.marketPrefs.add(
new MarketMemoryFlagReq(key, value));
1942 search.marketReqs.add(
new MarketHiddenReq());
1945 search.marketPrefs.add(
new MarketHiddenReq());
1948 search.marketReqs.add(
new MarketNotHiddenReq());
1951 search.marketPrefs.add(
new MarketNotHiddenReq());
1954 search.marketReqs.add(
new MarketNotInHyperReq());
1957 search.marketPrefs.add(
new MarketNotInHyperReq());
1965 search.marketReqs.add(
new MarketIsReq(param,
false));
1968 search.marketPrefs.add(
new MarketIsReq(param,
false));
1971 search.marketReqs.add(
new MarketIsReq(param,
true));
1974 search.marketPrefs.add(
new MarketIsReq(param,
true));
1978 search.marketReqs.add(
new MarketFactionReq(
false, factions));
1981 search.marketPrefs.add(
new MarketFactionReq(
false, factions));
1984 search.marketReqs.add(
new MarketFactionReq(
true, factions));
1987 search.marketPrefs.add(
new MarketFactionReq(
true, factions));
1995 search.marketReqs.add(
new MarketFactionHostileReq(
false, faction));
1998 search.marketPrefs.add(
new MarketFactionHostileReq(
false, faction));
2001 search.marketReqs.add(
new MarketFactionHostileReq(
true, faction));
2004 search.marketPrefs.add(
new MarketFactionHostileReq(
true, faction));
2008 List<LocationAPI>
result =
new ArrayList<LocationAPI>();
2009 for (String s : locations) {
2010 if (
"hyperspace".equals(s)) {
2017 if (system !=
null) {
2022 return result.toArray(
new LocationAPI[0]);
2037 search.marketReqs.add(
new MarketLocationReq(
false, locations));
2040 search.marketPrefs.add(
new MarketLocationReq(
false, locations));
2043 search.marketReqs.add(
new MarketLocationReq(
true, locations));
2046 search.marketPrefs.add(
new MarketLocationReq(
true, locations));
2050 search.marketReqs.add(
new MarketFactionCustomReq(mode, custom));
2053 search.marketPrefs.add(
new MarketFactionCustomReq(mode, custom));
2057 search.marketReqs.add(
new MarketRequirement() {
2058 public boolean marketMatchesRequirement(MarketAPI market) {
2059 return market.getSize() >= size;
2064 search.marketPrefs.add(
new MarketRequirement() {
2065 public boolean marketMatchesRequirement(MarketAPI market) {
2066 return market.getSize() >= size;
2072 search.marketReqs.add(
new MarketRequirement() {
2073 public boolean marketMatchesRequirement(MarketAPI market) {
2074 return market.getSize() <= size;
2079 search.marketPrefs.add(
new MarketRequirement() {
2080 public boolean marketMatchesRequirement(MarketAPI market) {
2081 return market.getSize() <= size;
2087 search.marketReqs.add(
new MarketRequirement() {
2088 public boolean marketMatchesRequirement(MarketAPI market) {
2089 return market.getStabilityValue() >= stability;
2094 search.marketPrefs.add(
new MarketRequirement() {
2095 public boolean marketMatchesRequirement(MarketAPI market) {
2096 return market.getStabilityValue() >= stability;
2101 search.marketReqs.add(
new MarketRequirement() {
2102 public boolean marketMatchesRequirement(MarketAPI market) {
2103 return market.getStabilityValue() <= stability;
2108 search.marketPrefs.add(
new MarketRequirement() {
2109 public boolean marketMatchesRequirement(MarketAPI market) {
2110 return market.getStabilityValue() <= stability;
2116 search.marketReqs.add(
new RequiredMarketConditions(mode, conditions));
2119 search.marketPrefs.add(
new RequiredMarketConditions(mode, conditions));
2123 search.marketReqs.add(
new RequiredMarketIndustries(mode, industries));
2126 search.marketPrefs.add(
new RequiredMarketIndustries(mode, industries));
2130 search.marketReqs.add(
new MarketRequirement() {
2131 public boolean marketMatchesRequirement(MarketAPI market) {
2132 return Misc.isMilitary(market);
2137 search.marketPrefs.add(
new MarketRequirement() {
2138 public boolean marketMatchesRequirement(MarketAPI market) {
2139 return Misc.isMilitary(market);
2145 search.marketReqs.add(
new MarketRequirement() {
2146 public boolean marketMatchesRequirement(MarketAPI market) {
2147 return market.hasSpaceport();
2152 search.marketPrefs.add(
new MarketRequirement() {
2153 public boolean marketMatchesRequirement(MarketAPI market) {
2154 return market.hasSpaceport();
2160 search.marketReqs.add(
new MarketRequirement() {
2161 public boolean marketMatchesRequirement(MarketAPI market) {
2162 return !market.hasSpaceport();
2167 search.marketPrefs.add(
new MarketRequirement() {
2168 public boolean marketMatchesRequirement(MarketAPI market) {
2169 return !market.hasSpaceport();
2175 search.commodityReqs.add(
new CommodityRequirement() {
2176 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2177 return !com.isPersonnel();
2182 search.commodityPrefs.add(
new CommodityRequirement() {
2183 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2184 return !com.isPersonnel();
2190 search.commodityReqs.add(
new CommodityRequirement() {
2191 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2192 return !com.isIllegal();
2197 search.commodityPrefs.add(
new CommodityRequirement() {
2198 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2199 return !com.isIllegal();
2204 search.commodityReqs.add(
new CommodityRequirement() {
2205 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2206 return com.isIllegal();
2211 search.commodityPrefs.add(
new CommodityRequirement() {
2212 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2213 return com.isIllegal();
2219 search.commodityReqs.add(
new CommodityRequirement() {
2220 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2221 return com.getId().equals(
id);
2226 search.commodityPrefs.add(
new CommodityRequirement() {
2227 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2228 return com.getId().equals(
id);
2234 search.commodityReqs.add(
new RequiredCommodityTags(mode, tags));
2237 search.commodityPrefs.add(
new RequiredCommodityTags(mode, tags));
2241 search.commodityReqs.add(
new CommodityRequirement() {
2242 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2243 return com.getAvailable() >= qty;
2248 search.commodityPrefs.add(
new CommodityRequirement() {
2249 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2250 return com.getAvailable() >= qty;
2255 search.commodityReqs.add(
new CommodityRequirement() {
2256 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2257 return com.getAvailable() <= qty;
2262 search.commodityPrefs.add(
new CommodityRequirement() {
2263 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2264 return com.getAvailable() <= qty;
2270 search.commodityReqs.add(
new CommodityRequirement() {
2271 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2272 return com.getMaxDemand() >= qty;
2277 search.commodityPrefs.add(
new CommodityRequirement() {
2278 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2279 return com.getMaxDemand() >= qty;
2284 search.commodityReqs.add(
new CommodityRequirement() {
2285 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2286 return com.getMaxDemand() <= qty;
2291 search.commodityPrefs.add(
new CommodityRequirement() {
2292 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2293 return com.getMaxDemand() <= qty;
2299 search.commodityReqs.add(
new CommodityRequirement() {
2300 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2301 return com.getMaxSupply() >= qty;
2306 search.commodityPrefs.add(
new CommodityRequirement() {
2307 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2308 return com.getMaxSupply() >= qty;
2313 search.commodityReqs.add(
new CommodityRequirement() {
2314 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2315 return com.getMaxSupply() <= qty;
2320 search.commodityPrefs.add(
new CommodityRequirement() {
2321 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2322 return com.getMaxSupply() <= qty;
2328 search.commodityReqs.add(
new CommodityRequirement() {
2329 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2330 CommodityIconCounts counts =
new CommodityIconCounts(com);
2331 return counts.extra >= qty;
2336 search.commodityPrefs.add(
new CommodityRequirement() {
2337 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2338 CommodityIconCounts counts =
new CommodityIconCounts(com);
2339 return counts.extra >= qty;
2344 search.commodityReqs.add(
new CommodityRequirement() {
2345 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2346 CommodityIconCounts counts =
new CommodityIconCounts(com);
2347 return counts.extra <= qty;
2352 search.commodityPrefs.add(
new CommodityRequirement() {
2353 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2354 CommodityIconCounts counts =
new CommodityIconCounts(com);
2355 return counts.extra <= qty;
2361 search.commodityReqs.add(
new CommodityRequirement() {
2362 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2363 CommodityIconCounts counts =
new CommodityIconCounts(com);
2364 return counts.deficit >= qty;
2369 search.commodityPrefs.add(
new CommodityRequirement() {
2370 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2371 CommodityIconCounts counts =
new CommodityIconCounts(com);
2372 return counts.deficit >= qty;
2377 search.commodityReqs.add(
new CommodityRequirement() {
2378 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2379 CommodityIconCounts counts =
new CommodityIconCounts(com);
2380 return counts.deficit <= qty;
2385 search.commodityPrefs.add(
new CommodityRequirement() {
2386 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2387 CommodityIconCounts counts =
new CommodityIconCounts(com);
2388 return counts.deficit <= qty;
2394 search.commodityReqs.add(
new CommodityRequirement() {
2395 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2396 return com.getCommodity().getBasePrice() >= price;
2401 search.commodityPrefs.add(
new CommodityRequirement() {
2402 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2403 return com.getCommodity().getBasePrice() >= price;
2408 search.commodityReqs.add(
new CommodityRequirement() {
2409 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2410 return com.getCommodity().getBasePrice() <= price;
2415 search.commodityPrefs.add(
new CommodityRequirement() {
2416 public boolean commodityMatchesRequirement(CommodityOnMarketAPI com) {
2417 return com.getCommodity().getBasePrice() <= price;
2423 search.terrainReqs.add(
new TerrainTypeReq(mode, types));
2426 search.terrainPrefs.add(
new TerrainTypeReq(mode, types));
2430 search.terrainReqs.add(
new RequiredTerrainTags(mode, tags));
2433 search.terrainPrefs.add(
new RequiredTerrainTags(mode, tags));
2436 search.terrainReqs.add(
new TerrainHasSpecialNameReq());
2439 search.terrainPrefs.add(
new TerrainHasSpecialNameReq());
2448 List<CampaignTerrainAPI> inPreferredSystems =
new ArrayList<CampaignTerrainAPI>();
2449 List<CampaignTerrainAPI> inMatchingSystems =
new ArrayList<CampaignTerrainAPI>();
2450 for (StarSystemAPI system :
search.matchingSystems) {
2451 List<CampaignTerrainAPI> terrainList =
new ArrayList<CampaignTerrainAPI>(system.getTerrainCopy());
2452 for (CampaignTerrainAPI terrain : terrainList) {
2453 if (terrain.hasTag(Tags.EXPIRES))
continue;
2456 if (terrain.getPlugin() instanceof BaseTiledTerrain) {
2457 BaseTiledTerrain btt = (BaseTiledTerrain) terrain.getPlugin();
2458 if (btt.getTiles() !=
null && btt.getTiles().length > 50)
continue;
2461 if (terrain.getPlugin() instanceof BaseRingTerrain) {
2462 BaseRingTerrain rtp = (BaseRingTerrain) terrain.getPlugin();
2463 if (rtp.getRingParams() !=
null && rtp.getRingParams().middleRadius > 5000f)
continue;
2465 inMatchingSystems.add(terrain);
2468 for (StarSystemAPI system :
search.preferredSystems) {
2469 List<CampaignTerrainAPI> terrainList =
new ArrayList<CampaignTerrainAPI>(system.getTerrainCopy());
2470 for (CampaignTerrainAPI terrain : terrainList) {
2471 if (terrain.hasTag(Tags.EXPIRES))
continue;
2474 if (terrain.getPlugin() instanceof BaseTiledTerrain) {
2475 BaseTiledTerrain btt = (BaseTiledTerrain) terrain.getPlugin();
2476 if (btt.getTiles() !=
null && btt.getTiles().length > 50)
continue;
2479 if (terrain.getPlugin() instanceof BaseRingTerrain) {
2480 BaseRingTerrain rtp = (BaseRingTerrain) terrain.getPlugin();
2481 if (rtp.getRingParams() !=
null && rtp.getRingParams().middleRadius > 5000f)
continue;
2483 inMatchingSystems.add(terrain);
2487 List<CampaignTerrainAPI> matchesInPref =
new ArrayList<CampaignTerrainAPI>();
2488 List<CampaignTerrainAPI> preferredInPref =
new ArrayList<CampaignTerrainAPI>();
2490 if (!preferredInPref.isEmpty()) {
2494 List<CampaignTerrainAPI> matchesInMatches =
new ArrayList<CampaignTerrainAPI>();
2495 List<CampaignTerrainAPI> preferredInMatches =
new ArrayList<CampaignTerrainAPI>();
2498 if (!matchesInPref.isEmpty()) {
2502 if (!preferredInMatches.isEmpty()) {
2504 return (CampaignTerrainAPI)
pickOneObject(preferredInMatches);
2507 if (!preferredInMatches.isEmpty()) {
2509 return (CampaignTerrainAPI)
pickOneObject(preferredInMatches);
2511 if (!matchesInPref.isEmpty()) {
2518 return (CampaignTerrainAPI)
pickOneObject(matchesInMatches);