1package com.fs.starfarer.api.util;
4import java.awt.image.BufferedImage;
5import java.awt.image.Raster;
6import java.io.IOException;
7import java.lang.reflect.Method;
9import java.text.DecimalFormat;
10import java.text.DecimalFormatSymbols;
11import java.util.ArrayList;
12import java.util.Arrays;
13import java.util.Collection;
14import java.util.Collections;
15import java.util.Comparator;
16import java.util.HashMap;
17import java.util.HashSet;
18import java.util.LinkedHashSet;
20import java.util.Locale;
22import java.util.Random;
25import java.util.concurrent.atomic.AtomicLong;
26import java.util.regex.Matcher;
27import java.util.regex.Pattern;
29import javax.imageio.ImageIO;
31import org.json.JSONArray;
32import org.json.JSONException;
33import org.json.JSONObject;
34import org.lwjgl.opengl.ATIMeminfo;
35import org.lwjgl.opengl.GL11;
36import org.lwjgl.opengl.NVXGpuMemoryInfo;
37import org.lwjgl.util.vector.Vector2f;
38import org.lwjgl.util.vector.Vector3f;
40import com.fs.starfarer.api.EveryFrameScript;
41import com.fs.starfarer.api.Global;
42import com.fs.starfarer.api.MusicPlayerPlugin;
43import com.fs.starfarer.api.campaign.AICoreAdminPlugin;
44import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
45import com.fs.starfarer.api.campaign.BattleAPI;
46import com.fs.starfarer.api.campaign.CampaignClockAPI;
47import com.fs.starfarer.api.campaign.CampaignFleetAPI;
48import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
49import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
50import com.fs.starfarer.api.campaign.CargoAPI;
51import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
52import com.fs.starfarer.api.campaign.CargoStackAPI;
53import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI;
54import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI.EntryType;
55import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
56import com.fs.starfarer.api.campaign.FactionAPI;
57import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
58import com.fs.starfarer.api.campaign.FleetAssignment;
59import com.fs.starfarer.api.campaign.FleetInflater;
60import com.fs.starfarer.api.campaign.InteractionDialogAPI;
61import com.fs.starfarer.api.campaign.JumpPointAPI;
62import com.fs.starfarer.api.campaign.JumpPointAPI.JumpDestination;
63import com.fs.starfarer.api.campaign.LocationAPI;
64import com.fs.starfarer.api.campaign.ParticleControllerAPI;
65import com.fs.starfarer.api.campaign.PlanetAPI;
66import com.fs.starfarer.api.campaign.RepLevel;
67import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
68import com.fs.starfarer.api.campaign.ResourceCostPanelAPI;
69import com.fs.starfarer.api.campaign.SectorEntityToken;
70import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
71import com.fs.starfarer.api.campaign.StarSystemAPI;
72import com.fs.starfarer.api.campaign.SubmarketPlugin;
73import com.fs.starfarer.api.campaign.SubmarketPlugin.OnClickAction;
74import com.fs.starfarer.api.campaign.TextPanelAPI;
75import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
76import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
77import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
78import com.fs.starfarer.api.campaign.comm.CommMessageAPI.MessageClickAction;
79import com.fs.starfarer.api.campaign.econ.AbandonMarketPlugin;
80import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
81import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
82import com.fs.starfarer.api.campaign.econ.ImmigrationPlugin;
83import com.fs.starfarer.api.campaign.econ.Industry;
84import com.fs.starfarer.api.campaign.econ.MarketAPI;
85import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
86import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
87import com.fs.starfarer.api.campaign.econ.StabilizeMarketPlugin;
88import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
89import com.fs.starfarer.api.campaign.events.CampaignEventManagerAPI;
90import com.fs.starfarer.api.campaign.events.CampaignEventPlugin;
91import com.fs.starfarer.api.campaign.events.CampaignEventTarget;
92import com.fs.starfarer.api.campaign.rules.MemKeys;
93import com.fs.starfarer.api.campaign.rules.MemoryAPI;
94import com.fs.starfarer.api.characters.AbilityPlugin;
95import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
96import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
97import com.fs.starfarer.api.characters.OfficerDataAPI;
98import com.fs.starfarer.api.characters.PersonAPI;
99import com.fs.starfarer.api.combat.CombatEngineAPI;
100import com.fs.starfarer.api.combat.CombatEntityAPI;
101import com.fs.starfarer.api.combat.DamageType;
102import com.fs.starfarer.api.combat.MissileAPI;
103import com.fs.starfarer.api.combat.MutableShipStatsAPI;
104import com.fs.starfarer.api.combat.ShipAPI;
105import com.fs.starfarer.api.combat.ShipAPI.HullSize;
106import com.fs.starfarer.api.combat.ShipCommand;
107import com.fs.starfarer.api.combat.ShipHullSpecAPI;
108import com.fs.starfarer.api.combat.ShipHullSpecAPI.ShipTypeHints;
109import com.fs.starfarer.api.combat.ShipVariantAPI;
110import com.fs.starfarer.api.combat.WeaponAPI;
111import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
112import com.fs.starfarer.api.combat.listeners.CombatListenerUtil;
113import com.fs.starfarer.api.fleet.FleetMemberAPI;
114import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
115import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
116import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
117import com.fs.starfarer.api.impl.campaign.DModManager;
118import com.fs.starfarer.api.impl.campaign.JumpPointInteractionDialogPluginImpl;
119import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
120import com.fs.starfarer.api.impl.campaign.WarningBeaconEntityPlugin;
121import com.fs.starfarer.api.impl.campaign.abilities.ReversePolarityToggle;
122import com.fs.starfarer.api.impl.campaign.econ.impl.ConstructionQueue.ConstructionQueueItem;
123import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
124import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality.QualityData;
125import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin.MarketFilter;
126import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
127import com.fs.starfarer.api.impl.campaign.ids.Conditions;
128import com.fs.starfarer.api.impl.campaign.ids.Difficulties;
129import com.fs.starfarer.api.impl.campaign.ids.Drops;
130import com.fs.starfarer.api.impl.campaign.ids.Entities;
131import com.fs.starfarer.api.impl.campaign.ids.Factions;
132import com.fs.starfarer.api.impl.campaign.ids.HullMods;
133import com.fs.starfarer.api.impl.campaign.ids.Industries;
134import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
135import com.fs.starfarer.api.impl.campaign.ids.Personalities;
136import com.fs.starfarer.api.impl.campaign.ids.Stats;
137import com.fs.starfarer.api.impl.campaign.ids.Strings;
138import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
139import com.fs.starfarer.api.impl.campaign.ids.Tags;
140import com.fs.starfarer.api.impl.campaign.ids.Terrain;
141import com.fs.starfarer.api.impl.campaign.intel.FactionCommissionIntel;
142import com.fs.starfarer.api.impl.campaign.intel.MessageIntel;
143import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
144import com.fs.starfarer.api.impl.campaign.plog.PlaythroughLog;
145import com.fs.starfarer.api.impl.campaign.plog.SModRecord;
146import com.fs.starfarer.api.impl.campaign.population.CoreImmigrationPluginImpl;
147import com.fs.starfarer.api.impl.campaign.procgen.DefenderDataOverride;
148import com.fs.starfarer.api.impl.campaign.procgen.PlanetConditionGenerator;
149import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
150import com.fs.starfarer.api.impl.campaign.procgen.StarAge;
151import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
152import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.OrbitGap;
153import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
154import com.fs.starfarer.api.impl.campaign.rulecmd.unsetAll;
155import com.fs.starfarer.api.impl.campaign.submarkets.BaseSubmarketPlugin;
156import com.fs.starfarer.api.impl.campaign.submarkets.StoragePlugin;
157import com.fs.starfarer.api.impl.campaign.terrain.AsteroidSource;
158import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain.TileParams;
159import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
160import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
161import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
162import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin;
163import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
164import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
165import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
166import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
167import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
168import com.fs.starfarer.api.loading.HullModSpecAPI;
169import com.fs.starfarer.api.loading.IndustrySpecAPI;
170import com.fs.starfarer.api.plugins.FactionPersonalityPickerPlugin;
171import com.fs.starfarer.api.plugins.SurveyPlugin;
172import com.fs.starfarer.api.ui.Alignment;
173import com.fs.starfarer.api.ui.LabelAPI;
174import com.fs.starfarer.api.ui.TooltipMakerAPI;
176import sun.misc.Cleaner;
177import sun.nio.ch.DirectBuffer;
236 public static enum TokenType {
244 public static class VarAndMemory {
246 public MemoryAPI memory;
248 public static class Token {
250 public TokenType type;
251 public String varNameWithoutMemoryKeyIfKeyIsValid =
null;
252 public String varMemoryKey =
null;
253 public Token(
String string, TokenType type) {
254 this.string = string;
258 int index =
string.indexOf(
".");
259 if (index > 0 && index <
string.length() - 1) {
260 varMemoryKey =
string.substring(1, index);
261 varNameWithoutMemoryKeyIfKeyIsValid =
"$" +
string.substring(index + 1);
266 public VarAndMemory getVarNameAndMemory(Map<String, MemoryAPI> memoryMap) {
267 String varName = varNameWithoutMemoryKeyIfKeyIsValid;
268 MemoryAPI memory = memoryMap.get(varMemoryKey);
269 if (memory ==
null) {
271 memory = memoryMap.get(MemKeys.LOCAL);
273 if (memory ==
null) {
274 throw new RuleException(
"No memory found for keys: " + varMemoryKey +
", " + MemKeys.LOCAL);
277 VarAndMemory result =
new VarAndMemory();
278 result.name = varName;
279 result.memory = memory;
283 public String getStringWithTokenReplacement(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
284 String text = getString(memoryMap);
285 if (text ==
null)
return null;
286 text = Global.getSector().getRules().performTokenReplacement(ruleId, text, dialog.getInteractionTarget(), memoryMap);
295 public String getString(Map<String, MemoryAPI> memoryMap) {
296 String
string =
null;
298 VarAndMemory var = getVarNameAndMemory(memoryMap);
299 string = var.memory.getString(var.name);
301 string = this.string;
306 public Object getObject(Map<String, MemoryAPI> memoryMap) {
309 VarAndMemory var = getVarNameAndMemory(memoryMap);
310 o = var.memory.get(var.name);
315 public boolean getBoolean(Map<String, MemoryAPI> memoryMap) {
316 String str = getString(memoryMap);
317 return Boolean.parseBoolean(str);
320 public boolean isBoolean(Map<String, MemoryAPI> memoryMap) {
321 String str = getString(memoryMap);
322 return str.toLowerCase().equals(
"true") || str.toLowerCase().equals(
"false");
325 public boolean isFloat(Map<String, MemoryAPI> memoryMap) {
328 VarAndMemory var = getVarNameAndMemory(memoryMap);
329 str = var.memory.getString(var.name);
334 Float.parseFloat(str);
336 }
catch (NumberFormatException e) {
341 public float getFloat(Map<String, MemoryAPI> memoryMap) {
344 VarAndMemory var = getVarNameAndMemory(memoryMap);
345 result = var.memory.getFloat(var.name);
347 result = Float.parseFloat(
string);
352 public int getInt(Map<String, MemoryAPI> memoryMap) {
353 return (
int) Math.round(getFloat(memoryMap));
356 public Color getColor(Map<String, MemoryAPI> memoryMap) {
357 Object
object =
null;
359 VarAndMemory var = getVarNameAndMemory(memoryMap);
360 object = var.memory.get(var.name);
362 if (
object instanceof Color) {
363 return (Color) object;
366 String
string = getString(memoryMap);
368 String [] parts =
string.split(Pattern.quote(
","));
369 return new Color(Integer.parseInt(parts[0]),
370 Integer.parseInt(parts[1]),
371 Integer.parseInt(parts[2]),
372 Integer.parseInt(parts[3]));
373 }
catch (Exception e) {
374 if (
"bad".equals(
string)) {
375 string =
"textEnemyColor";
376 }
else if (
"good".equals(
string)) {
377 string =
"textFriendColor";
378 }
else if (
"highlight".equals(
string)) {
379 string =
"buttonShortcut";
380 }
else if (
"h".equals(
string)) {
381 string =
"buttonShortcut";
382 }
else if (
"story".equals(
string)) {
383 return Misc.getStoryOptionColor();
384 }
else if (
"gray".equals(
string)) {
385 return Misc.getGrayColor();
386 }
else if (
"grey".equals(
string)) {
387 return Misc.getGrayColor();
389 FactionAPI faction = Global.getSector().getFaction(
string);
390 if (faction !=
null) {
391 return faction.getBaseUIColor();
395 return Global.getSettings().getColor(
string);
399 public boolean isLiteral() {
400 return type == TokenType.LITERAL;
402 public boolean isVariable() {
403 return type == TokenType.VARIABLE;
405 public boolean isOperator() {
406 return type == TokenType.OPERATOR;
409 public String toString() {
411 return string +
" (" + type.name() +
", memkey: " + varMemoryKey +
", name: " + varNameWithoutMemoryKeyIfKeyIsValid +
")";
413 return string +
" (" + type.name() +
")";
424 for (
int i = 0; i <
string.length(); i++) {
425 char curr =
string.charAt(i);
427 if (i + 1 <
string.length()) next =
string.charAt(i + 1);
431 if (i >=
string.length()) {
432 throw new RuleException(
"Escape character at end of string in: [" +
string +
"]");
434 curr =
string.charAt(i);
435 if (i + 1 <
string.length()) next =
string.charAt(i + 1);
445 result.
add(
new Token(
"", TokenType.LITERAL));
449 result.
add(
new Token(
str, TokenType.LITERAL));
451 if (
str.startsWith(
"$")) {
452 result.
add(
new Token(
str, TokenType.VARIABLE));
454 result.
add(
new Token(
str, TokenType.OPERATOR));
456 result.
add(
new Token(
str, TokenType.LITERAL));
465 if (!
inQuote && (curr ==
' ' || curr ==
'\t')) {
468 if (
str.startsWith(
"$")) {
469 result.
add(
new Token(
str, TokenType.VARIABLE));
471 result.
add(
new Token(
str, TokenType.OPERATOR));
473 result.
add(
new Token(
str, TokenType.LITERAL));
481 if (!
inQuote && !
inOperator && isOperatorChar(curr) && (curr !=
'-' || !isDigit(next))) {
484 if (
str.startsWith(
"$")) {
485 result.
add(
new Token(
str, TokenType.VARIABLE));
487 result.
add(
new Token(
str, TokenType.LITERAL));
503 result.
add(
new Token(
str, TokenType.OPERATOR));
523 throw new RuleException(
"Unmatched quotes in string: " +
string +
"]");
528 if (
str.startsWith(
"$")) {
529 result.
add(
new Token(
str, TokenType.VARIABLE));
531 result.
add(
new Token(
str, TokenType.OPERATOR));
533 result.
add(
new Token(
str, TokenType.LITERAL));
541 private static boolean isDigit(
char c) {
542 if (c == 0)
return false;
546 private static boolean isOperatorChar(
char c) {
547 String operatorChars =
"=<>!+-";
548 return operatorChars.
contains(
"" + c);
553 if (
str ==
null)
return "Null";
554 if (
str.isEmpty())
return "";
555 return (
"" +
str.charAt(0)).toUpperCase() +
str.substring(1);
559 if (
str ==
null)
return "Null";
560 if (
str.isEmpty())
return "";
561 return (
"" +
str.charAt(0)).toLowerCase() +
str.substring(1);
572 MemoryAPI memory = memoryMap.get(key);
576 return o2.length() -
o1.length();
580 Object value = memory.get(token);
581 if (value ==
null) value =
"null";
583 text = text.replaceAll(
"(?s)\\$" +
Pattern.quote(key) +
"\\." +
Pattern.quote(token.substring(1)), value.toString());
584 text = text.replaceAll(
"(?s)\\$" +
Pattern.quote(token.substring(1)), value.toString());
592 public static float getDistance(SectorEntityToken from, SectorEntityToken to) {
593 return getDistance(from.getLocation(), to.getLocation());
595 public static float getDistanceLY(SectorEntityToken from, SectorEntityToken to) {
596 return getDistanceLY(from.getLocationInHyperspace(), to.getLocationInHyperspace());
608 return (
v1.x -
v2.x) * (v1.x -
v2.x) + (
v1.y -
v2.y) * (v1.y -
v2.y);
633 if (
in <= 10)
return Math.max(1, (
int)
in);
641 if (
Math.abs((
float)
Math.round(value) - value) < 0.0001f) {
643 return String.format(
"%d", (
int)
Math.round(value));
647 }
else if ((
int)
Math.round((value * 100f)) == (
int)
Math.round((value * 10f)) * 10) {
648 return (value > 10 || value < -10) ?
"" + (
int)
Math.round(value) :
String.format(
"%.1f", value);
650 return (value > 10 || value < -10) ?
"" + (
int)
Math.round(value) :
String.format(
"%.2f", value);
655 if (
Math.abs((
float)
Math.round(value) - value) < 0.0001f) {
656 return (
int)
Math.round(value);
657 }
else if ((
int)
Math.round((value * 100f)) == (
int)
Math.round((value * 10f)) * 10) {
658 return (value > 10 || value < -10) ? (
int)
Math.round(value) :
659 (
Math.round(value * 10f) / 10f);
661 return (value > 10 || value < -10) ? (
int)
Math.round(value) :
662 (
Math.round(value * 100f) / 100f);
667 if (
Math.abs((
float)
Math.round(value) - value) < 0.0001f) {
668 return String.format(
"%d", (
int)
Math.round(value));
669 }
else if ((
int)
Math.round((value * 100f)) == (
int)
Math.round((value * 10f)) * 10) {
670 return (value >= 10 || value <= -10) ?
"" + (
int)
Math.round(value) :
String.format(
"%.1f", value);
672 return (value >= 10 || value <= -10) ?
"" + (
int)
Math.round(value) :
String.format(
"%.1f", value);
677 if (
Math.abs((
float)
Math.round(value) - value) < 0.0001f) {
678 return String.format(
"%d", (
int)
Math.round(value));
680 return String.format(
"%.1f", value);
687 return (
float) (
Math.log(num) /
Math.log(base));
691 float angle = (
float) ((
float)
Math.random() * Math.PI * 2f);
692 float x = (
float) (
Math.cos(angle) * r) + from.x;
693 float y = (
float) (
Math.sin(angle) * r) + from.y;
698 float angle = (
float) (
random.nextFloat() * Math.PI * 2f);
699 float x = (
float) (
Math.cos(angle) * r) + from.x;
700 float y = (
float) (
Math.sin(angle) * r) + from.y;
708 r = r *
random.nextFloat();
709 float angle = (
float) (
random.nextFloat() * Math.PI * 2f);
710 float x = (
float) (
Math.cos(angle) * r) + from.x;
711 float y = (
float) (
Math.sin(angle) * r) + from.y;
717 float angle = (
float) (
random.nextFloat() * Math.PI * 2f);
718 float x = (
float) (
Math.cos(angle) * r) + from.x;
719 float y = (
float) (
Math.sin(angle) * r) + from.y;
725 float angle = (
float) (
random.nextFloat() * Math.PI * 2f);
726 float x = (
float) (
Math.cos(angle) * r) + from.x;
727 float y = (
float) (
Math.sin(angle) * r) + from.y;
732 float fp = fleet.getFleetPoints();
734 for (FleetMemberAPI member : fleet.getFleetData().getSnapshot()) {
735 before += member.getFleetPointCost();
744 for (FleetMemberAPI member : fleet.getFleetData().getSnapshot()) {
755 CampaignEventManagerAPI manager =
Global.
getSector().getEventManager();
756 CampaignEventPlugin
event = manager.getOngoingEvent(eventTarget,
eventId);
758 event = manager.startEvent(eventTarget,
eventId, params);
797 return new Color(0, 100, 255);
810 return new Color(155,155,155,255);
861 return new IntervalUtil(interval * 0.75f, interval * 1.25f);
879 for (
int i = 0; i < strings.length - 1; i++) {
882 if (!result.isEmpty()) {
883 result = result.substring(0, result.length() - 2);
887 result +=
", " +
strings[strings.length - 1];
891 }
else if (
strings.length == 2) {
893 result +=
", " +
strings[strings.length - 1];
901 public static interface FleetFilter {
902 boolean accept(CampaignFleetAPI curr);
907 for (CampaignFleetAPI fleet : from.getContainingLocation().getFleets()) {
908 if (fleet == from)
continue;
909 float dist =
Misc.
getDistance(fleet.getLocation(), from.getLocation());
910 if (dist > maxRange)
continue;
921 for (CampaignFleetAPI fleet :
Global.
getSector().getHyperspace().getFleets()) {
922 if (!fleet.isInOrNearSystem(system))
continue;
932 if (curr.getFactionId().equals(factionId)) {
941 MarketAPI
best =
null;
943 int size = curr.getSize();
944 if (size > max || (size == max && curr.getFaction().isPlayerFaction())) {
966 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsInGroup(econGroup)) {
967 if (market.getFaction() == faction) {
976 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
977 if (market.getFaction() == player) {
992 for (MarketAPI market : markets) {
993 StarSystemAPI system = market.getStarSystem();
994 if (system !=
null && !systems.
contains(system)) {
1007 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
1008 if (market.getFaction() == faction) {
1017 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
1018 float dist =
getDistanceLY(market.getLocationInHyperspace(), locInHyper);
1019 if (dist > distLY)
continue;
1028 SectorEntityToken primary = market.getPrimaryEntity();
1029 float dist =
getDistance(primary.getLocation(), from.getLocation());
1030 if (dist > maxDist)
continue;
1031 if (market.getFaction() !=
null && market.getFaction().isHostileTo(faction)) {
1042 float dist =
Misc.
getDistanceLY(token.getLocationInHyperspace(), system.getLocation());
1043 if (dist > maxRangeLY)
continue;
1050 if (token.getContainingLocation()
instanceof StarSystemAPI) {
1051 return (StarSystemAPI) token.getContainingLocation();
1055 float minDist =
Float.MAX_VALUE;
1057 float dist =
Misc.
getDistanceLY(token.getLocationInHyperspace(), system.getLocation());
1058 if (dist > maxRangeLY)
continue;
1059 if (dist < minDist) {
1069 if (token.getContainingLocation()
instanceof StarSystemAPI) {
1070 return (StarSystemAPI) token.getContainingLocation();
1073 float minDist =
Float.MAX_VALUE;
1076 float dist =
Misc.
getDistanceLY(token.getLocationInHyperspace(), system.getLocation());
1077 if (dist < minDist) {
1086 if (token.getContainingLocation()
instanceof StarSystemAPI) {
1087 return (StarSystemAPI) token.getContainingLocation();
1090 if (token.isInOrNearSystem(system))
return system;
1097 RuleBasedInteractionDialogPluginImpl plugin;
1098 if (initialTrigger !=
null) {
1099 plugin =
new RuleBasedInteractionDialogPluginImpl(initialTrigger);
1101 plugin =
new RuleBasedInteractionDialogPluginImpl();
1103 return Global.
getSector().getCampaignUI().showInteractionDialog(plugin, entity);
1114 float dx = to.x - from.x;
1115 float dy = to.y - from.y;
1128 if (v.lengthSquared() >
Float.MIN_VALUE) {
1136 return (
angleDeg % 360f + 360f) % 360f;
1144 if (
filter !=
null && !
filter.acceptMarket(market))
continue;
1146 if (market.getPrimaryEntity() ==
null)
continue;
1147 if (market.getPrimaryEntity().getContainingLocation() != token.getContainingLocation())
continue;
1163 if (
filter !=
null && !
filter.acceptMarket(market))
continue;
1164 if (market.getPrimaryEntity() ==
null)
continue;
1165 if (market.getPrimaryEntity().getContainingLocation() != token.getContainingLocation())
continue;
1178 public boolean acceptMarket(MarketAPI curr) {
1179 return curr.getFaction() == token.getFaction();
1202 r.x = v.x *
cos - v.y *
sin;
1203 r.y = v.x *
sin + v.y *
cos;
1212 r2.x = r.x *
cos - r.y *
sin;
1213 r2.y = r.x *
sin + r.y *
cos;
1225 public static boolean isBetween(
float one,
float two,
float check) {
1231 if (check >= one && check <= two)
return true;
1234 if (check <= two)
return true;
1235 if (check >= one)
return true;
1242 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
1243 if (member.isMothballed())
continue;
1244 if (member.getVariant().hasHullMod(HullMods.SHIELDED_CARGO_HOLDS)) {
1245 shielded += member.getCargoCapacity();
1248 float max = fleet.getCargo().getMaxCapacity();
1249 if (max < 1)
return 0f;
1255 float red = (
float)from.getRed() + ((
float)to.getRed() - (
float)from.getRed()) * progress;
1256 float green = (
float)from.getGreen() + ((
float)to.getGreen() - (
float)from.getGreen()) * progress;
1257 float blue = (
float)from.getBlue() + ((
float)to.getBlue() - (
float)from.getBlue()) * progress;
1258 float alpha = (
float)from.getAlpha() + ((
float)to.getAlpha() - (
float)from.getAlpha()) * progress;
1262 alpha =
Math.round(alpha);
1267 Color color =
new Color((
int) (min.getRed() + (max.getRed() - min.getRed()) *
random.nextDouble()),
1268 (
int) (min.getGreen() + (max.getGreen() - min.getGreen()) *
random.nextDouble()),
1269 (
int) (min.getBlue() + (max.getBlue() - min.getBlue()) *
random.nextDouble()),
1278 v.x += (to.x - from.x) * progress;
1279 v.y += (to.y - from.y) * progress;
1284 public static float interpolate(
float from,
float to,
float progress) {
1285 to = from + (to - from) * progress;
1290 return new Color((
int) (color.getRed() * factor),
1291 (
int) (color.getGreen() * factor),
1292 (
int) (color.getBlue() * factor),
1293 (
int) (color.getAlpha() * factor));
1296 return new Color((
int) (color.getRed() * factor),
1297 (
int) (color.getGreen() * factor),
1298 (
int) (color.getBlue() * factor),
1299 (
int) (color.getAlpha()));
1303 return new Color((
int) (color.getRed() * 1f),
1304 (
int) (color.getGreen() * 1f),
1305 (
int) (color.getBlue() * 1f),
1306 (
int) (color.getAlpha() * factor));
1310 if (alpha < 0) alpha = 0;
1311 if (alpha > 255) alpha = 255;
1312 return new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha);
1336 memoryMap.put(
memKey, memory);
1384 return getFormat().format((
int)num) + Strings.C;
1390 float dist =
getDistance(from.getLocation(), to.getLocation()) - from.getRadius() - to.getRadius();
1391 if (dist <= 0)
return new Vector2f(to.getLocation());
1400 if (
dot < 0)
return new Vector2f(to.getLocation());
1459 setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_LOW_REP_IMPACT, reason,
true, -1);
1462 setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_LOW_REP_IMPACT, reason,
true, -1);
1463 setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_NO_REP_IMPACT, reason,
true, -1);
1467 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_HOSTILE,
true);
1471 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_HOSTILE_TO_PLAYER_TRADE_FLEETS,
true);
1475 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_HOSTILE_TO_ALL_TRADE_FLEETS,
true);
1482 String flag = MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE +
"_" + factionId;
1484 fleet.getMemoryWithoutUpdate().unset(flag);
1486 fleet.getMemoryWithoutUpdate().set(flag,
true, dur);
1493 String flag = MemFlags.MEMORY_KEY_MAKE_HOSTILE +
"_" + factionId;
1495 fleet.getMemoryWithoutUpdate().unset(flag);
1497 fleet.getMemoryWithoutUpdate().set(flag,
true, dur);
1505 if (Factions.PLAYER.equals(factionId) &&
1506 fleet.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_MAKE_HOSTILE)) {
1509 String flag = MemFlags.MEMORY_KEY_MAKE_HOSTILE +
"_" + factionId;
1510 return fleet.getMemoryWithoutUpdate().getBoolean(flag);
1514 setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_LOW_REP_IMPACT, reason,
false, -1);
1515 setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.MEMORY_KEY_NO_REP_IMPACT, reason,
false, -1);
1521 float days =
clock.getElapsedDaysSince(timestamp);
1525 }
else if (days <= 6f) {
1526 return (
int)
Math.ceil(days) +
" days ago";
1527 }
else if (days <= 7) {
1528 return "1 week ago";
1529 }
else if (days <= 14) {
1530 return "2 weeks ago";
1531 }
else if (days <= 21) {
1532 return "3 weeks ago";
1533 }
else if (days <= 30 + 14) {
1534 return "1 month ago";
1535 }
else if (days < 30 * 2 + 14) {
1536 return "2 months ago";
1537 }
else if (days < 30 * 3 + 14) {
1538 return "3 months ago";
1540 return "Over 3 months ago";
1546 int days = (
int)
clock.getElapsedDaysSince(timestamp);
1549 return "0 days ago";
1550 }
else if (days == 1) {
1552 }
else if (days <= 6) {
1553 return (
int)
Math.ceil(days) +
" days ago";
1554 }
else if (days <= 7) {
1555 return "1 week ago";
1556 }
else if (days <= 14) {
1557 return "2 weeks ago";
1558 }
else if (days <= 21) {
1559 return "3 weeks ago";
1564 return "1 month ago";
1566 return "" +
months +
" months ago";
1571 return "1 cycle ago";
1573 return "" +
years +
" cycles ago";
1581 return "at least a day";
1582 }
else if (days <= 6f) {
1583 return "at least a few days";
1584 }
else if (days <= 7 + 6) {
1585 return "at least a week";
1586 }
else if (days <= 14 + 6) {
1587 return "at least two weeks";
1588 }
else if (days <= 21 + 8) {
1589 return "at least three weeks";
1590 }
else if (days <= 30 + 29) {
1591 return "at least a month";
1592 }
else if (days < 30 * 2 + 29) {
1593 return "at least two months";
1594 }
else if (days < 30 * 3 + 29) {
1595 return "at least three months";
1597 return "many months";
1604 }
else if (days <= 6f) {
1605 return "a few days";
1606 }
else if (days <= 7 + 6) {
1608 }
else if (days <= 14 + 6) {
1610 }
else if (days <= 21 + 8) {
1611 return "three weeks";
1612 }
else if (days <= 30 + 29) {
1614 }
else if (days < 30 * 2 + 29) {
1615 return "two months";
1616 }
else if (days < 30 * 3 + 29) {
1617 return "three months";
1619 return "many months";
1675 float perLY = fleet.getLogistics().getFuelCostPerLightYear();
1685 return speed *
perLY;
1717 if (arc >= 360)
return true;
1718 if (direction < 0) direction = 360 + direction;
1720 if (
towardsTo.lengthSquared() == 0)
return false;
1722 if (dir < 0) dir = 360 + dir;
1723 float arcFrom = direction - arc/2f;
1724 if (arcFrom < 0) arcFrom = 360 + arcFrom;
1725 if (arcFrom > 360) arcFrom -= 360;
1726 float arcTo = direction + arc/2f;
1730 if (dir >= arcFrom && dir <=
arcTo)
return true;
1731 if (dir >= arcFrom && arcFrom >
arcTo)
return true;
1736 public static boolean isInArc(
float direction,
float arc,
float test) {
1739 if (arc >= 360)
return true;
1740 if (direction < 0) direction = 360 + direction;
1742 if (dir < 0) dir = 360 + dir;
1743 float arcFrom = direction - arc/2f;
1744 if (arcFrom < 0) arcFrom = 360 + arcFrom;
1745 if (arcFrom > 360) arcFrom -= 360;
1746 float arcTo = direction + arc/2f;
1750 if (dir >= arcFrom && dir <=
arcTo)
return true;
1751 if (dir >= arcFrom && arcFrom >
arcTo)
return true;
1772 int w =
img.getWidth();
1773 int h =
img.getHeight();
1775 for (
int i = 0; i < w; i +=
chunkSize) {
1776 for (
int j = 0; j < h; j +=
chunkSize) {
1799 int []
pixel = data.getPixel(x, h - y - 1, (
int [])
null);
1809 float tileSize = NebulaTerrainPlugin.TILE_SIZE;
1813 SectorEntityToken curr = location.addTerrain(
terrainType,
new TileParams(
string.toString(),
1816 curr.getLocation().set(x, y);
1819 StarSystemAPI system = (StarSystemAPI) location;
1822 system.setHasSystemwideNebula(
true);
1830 throw new RuntimeException(
e);
1835 public static void renderQuad(
float x,
float y,
float width,
float height,
Color color,
float alphaMult) {
1836 GL11.glColor4ub((
byte)color.getRed(),
1837 (
byte)color.getGreen(),
1838 (
byte)color.getBlue(),
1839 (
byte)((
float)color.getAlpha() * alphaMult));
1843 GL11.glVertex2f(x, y);
1844 GL11.glVertex2f(x, y + height);
1845 GL11.glVertex2f(x + width, y + height);
1846 GL11.glVertex2f(x + width, y);
1859 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1865 i.x = p1.x +
u * (p2.x - p1.x);
1866 i.y = p1.y +
u * (p2.y - p1.y);
1871 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1877 i.x = p1.x +
u * (p2.x - p1.x);
1878 i.y = p1.y +
u * (p2.y - p1.y);
1883 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1894 i.x = p1.x +
u * (p2.x - p1.x);
1895 i.y = p1.y +
u * (p2.y - p1.y);
1903 for (
int i = 0; i < 2; i++) {
1904 for (
int j = 0; j < bounds.size() - 1; j++) {
1909 if (
Math.abs(p.x -
s1.x) < 0.001f &&
1910 Math.abs(p.y -
s1.y) < 0.001f) {
1919 if (i == 0 && count % 2 == 1) {
1926 return count % 2 == 1;
1939 float minX, minY, maxX, maxY;
1956 if (
b1.x >= minX &&
b1.x <= maxX &&
b1.y >= minY &&
b1.y <= maxY) {
1958 }
else if (
b2.x >= minX &&
b2.x <= maxX &&
b2.y >= minY &&
b2.y <= maxY) {
1976 result.x = a1.x +
Ua * (a2.x -
a1.x);
1977 result.y = a1.y +
Ua * (a2.y -
a1.y);
2003 result.x = a1.x +
Ua * (a2.x -
a1.x);
2004 result.y = a1.y +
Ua * (a2.y -
a1.y);
2021 float uNom = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
2022 float uDenom = (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
2029 closest.x = p1.x +
u * (p2.x - p1.x);
2030 closest.y = p1.y +
u * (p2.y - p1.y);
2033 float distSq = (closest.x - p3.x) * (
closest.x - p3.x) + (closest.y - p3.y) * (
closest.y - p3.y);
2037 }
else if (
uDenom == 0) {
2041 float a = (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
2042 float b = 2f * ( (p2.x - p1.x) * (p1.x - p3.x) + (p2.y - p1.y) *
2044 float c = p3.x * p3.x + p3.y * p3.y + p1.x * p1.x + p1.y * p1.y - 2f
2045 * (p3.x * p1.x + p3.y * p1.y) - r * r;
2049 if (
bb4ac < 0)
return null;
2058 float p2DistSq = (p2.x - p3.x) * (p2.x - p3.x) + (p2.y - p3.y) * (p2.y - p3.y);
2065 result.x = p1.x +
minMu * (p2.x - p1.x);
2066 result.y = p1.y +
minMu * (p2.y - p1.y);
2101 }
else if (
diff > 180) {
2127 }
else if (
diff > 180) {
2156 String id = fleet.getMemoryWithoutUpdate().getString(MemFlags.MEMORY_KEY_SOURCE_MARKET);
2157 if (
id ==
null)
return null;
2163 String id = fleet.getMemoryWithoutUpdate().getString(MemFlags.MEMORY_KEY_SOURCE_MARKET);
2164 if (
id ==
null)
return null;
2166 if (market !=
null && market.getPrimaryEntity() !=
null) {
2167 return market.getPrimaryEntity();
2182 float f = (1f -
Math.min(1f, distLY/range));
2183 return min + (1f - min) * f * f;
2189 if (player ==
null || !player.isInHyperspace()) {
2193 if (dist > minDist + r) {
2198 v.scale(minDist + 2000 - dist);
2206 if (player ==
null || player.getContainingLocation() != where) {
2210 if (dist > minDist + r) {
2215 v.scale(minDist + 2000 - dist);
2225 v.x += (max * 2f * ((
float)
Math.random() - 0.5f));
2226 v.y += (max * 2f * ((
float)
Math.random() - 0.5f));
2227 if (v.length() == 0 || v.lengthSquared() == 0) {
2234 if (fleet.isPlayerFleet())
return true;
2236 if (fleet.getBattle() !=
null && fleet.getBattle().isOnPlayerSide(fleet) &&
2237 fleet.getBattle().isPlayerPrimary()) {
2244 if (fleet.isPlayerFleet())
return true;
2246 if (fleet.getBattle() !=
null && fleet.getBattle().isOnPlayerSide(fleet)) {
2256 return (AsteroidSource) asteroid.getCustomData().get(
ASTEROID_SOURCE);
2268 return Global.
getSector().getMemoryWithoutUpdate().getBoolean(
"$fastStart");
2271 return Global.
getSector().getMemoryWithoutUpdate().getBoolean(
"$fastStartExplorer");
2274 return Global.
getSector().getMemoryWithoutUpdate().getBoolean(
"$fastStartMerc");
2282 return Difficulties.NORMAL.equals(
Global.
getSector().getDifficulty());
2302 for (CampaignTerrainAPI curr :
Global.
getSector().getHyperspace().getTerrainCopy()) {
2303 if (curr.getPlugin()
instanceof HyperspaceTerrainPlugin) {
2311 if (hyper !=
null) {
2312 return (HyperspaceTerrainPlugin) hyper.getPlugin();
2325 if (plugin ==
null)
return 0f;
2326 return plugin.getAbyssalDepth(loc);
2332 return plugin.getAbyssalSystems();
2339 if (entity ==
null || !entity.isInHyperspace())
return 0f;
2344 for (PlanetAPI planet : fleet.getContainingLocation().getPlanets()) {
2345 if (planet.isStar() && planet.getSpec() !=
null && planet.getSpec().isBlackHole()) {
2347 if (dist < planet.getRadius() + fleet.getRadius()) {
2351 if (corona !=
null && corona.containsEntity(fleet)) {
2362 if (star ==
null)
return null;
2364 for (CampaignTerrainAPI curr : star.getContainingLocation().getTerrainCopy()) {
2365 if (curr.getPlugin()
instanceof StarCoronaTerrainPlugin) {
2366 StarCoronaTerrainPlugin corona = (StarCoronaTerrainPlugin) curr.getPlugin();
2367 if (corona.getRelatedEntity() == star)
return corona;
2374 if (planet ==
null || planet.getContainingLocation() ==
null)
return null;
2376 for (CampaignTerrainAPI curr : planet.getContainingLocation().getTerrainCopy()) {
2377 if (curr.getPlugin()
instanceof MagneticFieldTerrainPlugin) {
2378 MagneticFieldTerrainPlugin field = (MagneticFieldTerrainPlugin) curr.getPlugin();
2379 if (field.getRelatedEntity() == planet)
return field;
2386 for (CampaignTerrainAPI curr : star.getContainingLocation().getTerrainCopy()) {
2387 if (curr.getPlugin()
instanceof PulsarBeamTerrainPlugin) {
2388 PulsarBeamTerrainPlugin corona = (PulsarBeamTerrainPlugin) curr.getPlugin();
2389 if (corona.getRelatedEntity() == star)
return corona;
2396 return system !=
null && system.hasPulsar();
2419 return (FactionCommissionIntel)
obj;
2429 if (fleet.getFaction().isPlayerFaction())
return false;
2432 if (fleet.getFaction().getCustomBoolean(Factions.CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE)) {
2436 if (source !=
null && source.hasCondition(Conditions.FREE_PORT)) {
2440 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_PATROL_ALLOW_TOFF)) {
2445 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE)) {
2451 if (player ==
null || player.isInHyperspace()) {
2454 caresAboutTransponder = source.getPrimaryEntity().getContainingLocation() == player.getContainingLocation();
2477 public static interface FindShipFilter {
2478 public boolean matches(ShipAPI ship);
2487 float minDist =
Float.MAX_VALUE;
2489 for (ShipAPI other : ships) {
2490 if (other.getHullSize().ordinal() <
smallestToNote.ordinal())
continue;
2491 if (other.isShuttlePod())
continue;
2492 if (other.isHulk())
continue;
2493 if (ship.getOwner() != other.getOwner() && other.getOwner() != 100) {
2494 if (
filter !=
null && !
filter.matches(other))
continue;
2496 float dist =
getDistance(ship.getLocation(), other.getLocation());
2498 float radSum = ship.getCollisionRadius() + other.getCollisionRadius();
2500 if (dist > maxRange +
radSum)
continue;
2516 if (
val ==
null ||
val.equals(
"")) {
2518 throw new RuntimeException(
"Key [" + key +
"] is required");
2525 throw new RuntimeException(
"Key [" + key +
"] has invalid value [" +
val +
"] in [" +
json.toString() +
"]");
2548 v.set((
float)
arr.getDouble(0), (
float)
arr.getDouble(1));
2555 v.set((
float)
arr.getDouble(0), (
float)
arr.getDouble(1), (
float)
arr.getDouble(1));
2562 if (
arr ==
null)
return null;
2563 v.set((
float)
arr.optDouble(0), (
float)
arr.optDouble(1));
2571 v.set((
float)
arr.getDouble(0), (
float)
arr.getDouble(1), (
float)
arr.getDouble(2));
2578 v.set((
float)
arr.getDouble(index * 2 + 0), (
float)
arr.getDouble(index * 2 + 1));
2585 for (
int i = 0; i < noise.length; i++) {
2586 for (
int j = 0; j < noise[0].length; j++) {
2587 if (noise[i][j] != -1) {
2600 for (
int i = 0; i < noise.length; i++) {
2601 for (
int j = 0; j < noise[0].length; j++) {
2602 if (noise[i][j] != -1) {
2607 noise[i][j] = noise[i - 1][j];
2608 else if (i < noise.length - 1)
2609 noise[i][j] = noise[i + 1][j];
2619 float [][] noise =
new float [w][h];
2620 for (
int i = 0; i < noise.length; i++) {
2621 for (
int j = 0; j < noise[0].length; j++) {
2626 noise[0][noise[0].length - 1] =
random.nextFloat() *
spikes;
2627 noise[noise.length - 1][0] =
random.nextFloat() *
spikes;
2628 noise[noise.length - 1][noise[0].length - 1] =
random.nextFloat() *
spikes;
2634 if (
x1 + 1 >=
x2 ||
y1 + 1 >=
y2)
return;
2657 private static void fill(
Random random,
float[][] noise,
int x,
int y,
int x1,
int y1,
2659 if (noise[x][y] == -1) {
2660 float avg = (noise[
x1][
y1] + noise[
x2][
y2]) / 2f;
2667 if (range <= 1)
return 180f;
2668 return (2f * radius) / (2f * (
float)
Math.PI * range) * 360f;
2677 float diff = dest - curr;
2681 return curr + delta;
2714 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
2715 if (member.isMothballed())
continue;
2726 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
2727 if (member.isMothballed())
continue;
2728 if (ship !=
null && ship.getFleetMember() == member) {
2738 String starId = planet.getContainingLocation().getId();
2739 if (planet.getContainingLocation()
instanceof StarSystemAPI) {
2740 StarSystemAPI system = (StarSystemAPI) planet.getContainingLocation();
2741 if (system.getStar() !=
null) {
2742 starId = system.getStar().getId();
2745 if (planet.getOrbitFocus()
instanceof PlanetAPI) {
2746 PlanetAPI parent = (PlanetAPI) planet.getOrbitFocus();
2747 if (parent.isStar()) {
2750 if (parent.getOrbitFocus()
instanceof PlanetAPI) {
2751 parent = (PlanetAPI) parent.getOrbitFocus();
2752 if (parent.isStar()) {
2772 SurveyLevel
minLevel = SurveyLevel.FULL;
2773 boolean empty =
true;
2774 for (PlanetAPI planet : system.getPlanets()) {
2775 if (planet.isStar())
continue;
2776 MarketAPI market = planet.getMarket();
2777 if (market ==
null)
continue;
2780 SurveyLevel level = market.getSurveyLevel();
2781 if (level.ordinal() <
minLevel.ordinal()) {
2786 if (!system.isEnteredByPlayer() &&
empty)
minLevel = SurveyLevel.NONE;
2787 if (system.isEnteredByPlayer() &&
empty)
minLevel = SurveyLevel.FULL;
2798 for (PlanetAPI planet : system.getPlanets()) {
2799 if (planet.isStar())
continue;
2800 MarketAPI market = planet.getMarket();
2801 if (market ==
null)
continue;
2803 SurveyLevel level = market.getSurveyLevel();
2804 if (level != SurveyLevel.NONE)
return true;
2813 if (system !=
null) {
2816 throw new RuntimeException(
"Star system [" +
systemName +
"] not found");
2821 for (PlanetAPI planet : system.getPlanets()) {
2822 if (planet.isStar())
continue;
2824 MarketAPI market = planet.getMarket();
2825 if (market ==
null)
continue;
2826 if (!market.isPlanetConditionMarketOnly()) {
2827 market.setSurveyLevel(SurveyLevel.FULL);
2828 }
else if (market.getSurveyLevel() == SurveyLevel.NONE) {
2829 market.setSurveyLevel(SurveyLevel.SEEN);
2835 for (PlanetAPI planet : system.getPlanets()) {
2836 if (planet.isStar())
continue;
2838 MarketAPI market = planet.getMarket();
2839 if (market ==
null)
continue;
2841 market.setSurveyLevel(SurveyLevel.FULL);
2842 for (MarketConditionAPI
mc : market.getConditions()) {
2843 mc.setSurveyed(
true);
2847 market.getMemoryWithoutUpdate().set(
"$ruinsExplored",
true);
2854 if (system !=
null) {
2857 throw new RuntimeException(
"Star system [" +
systemName +
"] not found");
2862 for (PlanetAPI planet : system.getPlanets()) {
2863 if (planet.isStar())
continue;
2865 if (planet.getMarket() !=
null && !planet.getMarket().getConditions().isEmpty())
continue;
2867 PlanetConditionGenerator.generateConditionsForPlanet(planet, age);
2874 float centerRadius = 0;
2881 PlanetAPI parent =
null;
2883 if (planet.getOrbitFocus()
instanceof PlanetAPI) {
2884 parent = (PlanetAPI) planet.getOrbitFocus();
2885 if (parent.getOrbitFocus()
instanceof PlanetAPI) {
2888 if (parent.isStar()) {
2890 centerRadius = parent.getRadius();
2902 StarSystemGenerator.STARTING_RADIUS_STAR_BASE - StarSystemGenerator.STARTING_RADIUS_STAR_RANGE * 0.5f) /
2904 if (orbitIndex == 0) {
2906 StarSystemGenerator.STARTING_RADIUS_STAR_BASE - StarSystemGenerator.STARTING_RADIUS_STAR_RANGE * 0.5f) /
2907 (StarSystemGenerator.BASE_INCR * 1.25f));
2909 if (orbitIndex < 0) orbitIndex = 0;
2916 if (seed == 0)
return random;
2919 for (
int i = 0; i < level; i++) {
2922 return new Random(r.nextLong());
2934 AddRemoveCommodity.addCommodityGainText(
dataType, 1, text);
2942 for (MarketConditionAPI
mc : market.getConditions()) {
2943 mc.setSurveyed(
true);
2945 market.setSurveyLevel(SurveyLevel.FULL);
2948 PlanetAPI planet = (PlanetAPI) market.getPrimaryEntity();
2949 String string =
"Acquired full survey data for " + planet.getName() +
", " + planet.getTypeNameWithWorld().toLowerCase();
2951 text.setFontSmallInsignia();
2952 text.addParagraph(
string, planet.getSpec().getIconColor());
2953 text.setFontInsignia();
2957 MessageIntel intel =
new MessageIntel(
"Full survey data: " + planet.getName() +
", " + planet.getTypeNameWithWorld(),
2960 Global.
getSector().getCampaignUI().addMessage(intel, MessageClickAction.INTEL_TAB, planet);
2975 market.setSurveyLevel(SurveyLevel.PRELIMINARY);
2978 PlanetAPI planet = (PlanetAPI) market.getPrimaryEntity();
2979 String string =
"Acquired preliminary survey data for " + planet.getName() +
", " + planet.getTypeNameWithWorld().toLowerCase();
2981 text.setFontSmallInsignia();
2982 text.addParagraph(
string, planet.getSpec().getIconColor());
2983 text.setFontInsignia();
2987 MessageIntel intel =
new MessageIntel(
"Preliminary survey data: " + planet.getName() +
", " + planet.getTypeNameWithWorld(),
2990 Global.
getSector().getCampaignUI().addMessage(intel, MessageClickAction.INTEL_TAB, planet);
3006 market.setSurveyLevel(SurveyLevel.SEEN);
3009 PlanetAPI planet = (PlanetAPI) market.getPrimaryEntity();
3011 String type = planet.getSpec().getName();
3012 if (!planet.isGasGiant()) type +=
" World";
3013 String string =
"New planet data: " + planet.getName() +
", " + type;
3015 text.setFontSmallInsignia();
3016 text.addParagraph(
string, planet.getSpec().getIconColor());
3017 text.setFontInsignia();
3020 MessageIntel intel =
new MessageIntel(
string,
3023 Global.
getSector().getCampaignUI().addMessage(intel, MessageClickAction.INTEL_TAB, planet);
3049 GL11.glDisable(
GL11.GL_TEXTURE_2D);
3053 GL11.glColor4ub((
byte)color.getRed(),
3054 (
byte)color.getGreen(),
3055 (
byte)color.getBlue(),
3056 (
byte)(color.getAlpha() * alphaMult));
3060 GL11.glVertex2f(x, y);
3061 GL11.glVertex2f(x, y + height);
3062 GL11.glVertex2f(x + width, y + height);
3063 GL11.glVertex2f(x + width, y);
3073 if (entity.hasTag(Tags.FADING_OUT_AND_EXPIRING))
return;
3075 entity.addTag(Tags.NON_CLICKABLE);
3076 entity.addTag(Tags.FADING_OUT_AND_EXPIRING);
3080 public boolean runWhilePaused() {
3083 public boolean isDone() {
3084 return entity.isExpired();
3086 public void advance(
float amount) {
3089 entity.setExpired(
true);
3094 entity.forceSensorFaderBrightness(
Math.min(entity.getSensorFaderBrightness(),
b));
3095 entity.setAlwaysUseSensorFaderBrightness(
true);
3100 entity.addTag(Tags.NON_CLICKABLE);
3101 entity.forceSensorFaderBrightness(0f);
3102 entity.setAlwaysUseSensorFaderBrightness(
true);
3106 public boolean runWhilePaused() {
3109 public boolean isDone() {
3110 return entity.isExpired();
3112 public void advance(
float amount) {
3114 if (elapsed >
in + dur +
out) {
3115 entity.setExpired(
true);
3120 }
else if (elapsed >
in + dur) {
3121 b = 1f - (elapsed -
in - dur) /
out;
3125 entity.forceSensorFaderBrightness(
Math.min(entity.getSensorFaderBrightness(),
b));
3126 entity.setAlwaysUseSensorFaderBrightness(
true);
3131 public static void fadeIn(
final SectorEntityToken entity,
final float in) {
3132 entity.forceSensorFaderBrightness(0f);
3133 entity.setAlwaysUseSensorFaderBrightness(
true);
3136 public boolean runWhilePaused() {
3139 public boolean isDone() {
3140 return elapsed >
in;
3142 public void advance(
float amount) {
3145 entity.setAlwaysUseSensorFaderBrightness(
false);
3148 float b = elapsed /
in;
3151 entity.forceSensorFaderBrightness(
Math.min(entity.getSensorFaderBrightness(),
b));
3152 entity.setAlwaysUseSensorFaderBrightness(
true);
3182 CustomCampaignEntityAPI pods = where.addCustomEntity(
null,
null, Entities.CARGO_PODS, Factions.NEUTRAL);
3183 pods.getLocation().x = loc.x;
3184 pods.getLocation().y = loc.y;
3187 vel.scale(5f + 10f * (
float)
Math.random());
3188 pods.getVelocity().set(vel);
3190 pods.setDiscoverable(
null);
3191 pods.setDiscoveryXP(
null);
3192 pods.setSensorProfile(1f);
3200 SectorEntityToken debris = loc.addTerrain(Terrain.DEBRIS_FIELD, params);
3201 debris.setSensorProfile(1f);
3202 debris.setDiscoverable(
true);
3203 debris.setName(((CampaignTerrainAPI)debris).getPlugin().getTerrainName());
3209 float range = DebrisFieldTerrainPlugin.computeDetectionRange(params.bandWidthInEngine);
3210 debris.getDetectedRangeMod().modifyFlat(
"gen", range);
3212 debris.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED,
random.nextLong());
3216 DropData data =
new DropData();
3217 data.group = Drops.BASIC;
3218 data.value = (
int) ((1000 + params.bandWidthInEngine) * 5);
3219 debris.addDropValue(data);
3221 debris.setDiscoveryXP((
float)((
int)(params.bandWidthInEngine * 0.2f)));
3222 if (params.baseSalvageXP <= 0) {
3223 debris.setSalvageXP((
float)((
int)(params.bandWidthInEngine * 0.6f)));
3230 if (member.getVariant() !=
null && member.getVariant().hasTag(Tags.VARIANT_UNBOARDABLE)) {
3239 if (
hullSpec.hasTag(tag))
return false;
3242 ShipHullSpecAPI parent =
hullSpec.getDParentHull();
3244 if (parent.hasTag(tag))
return false;
3257 if (!member.getVariant().getSMods().isEmpty()) {
3260 if (!member.getVariant().getSModdedBuiltIns().isEmpty()) {
3263 if (member.getCaptain() !=
null && !member.getCaptain().isDefault()) {
3267 if (member.getVariant().hasTag(Tags.VARIANT_ALWAYS_RECOVERABLE)) {
3276 chance = member.getStats().getDynamic().getMod(Stats.INDIVIDUAL_SHIP_RECOVERY_MOD).computeEffective(chance);
3277 if (recoverer !=
null) {
3278 chance = recoverer.getStats().getDynamic().getMod(Stats.SHIP_RECOVERY_MOD).computeEffective(chance);
3280 chance = recoverer.getStats().getDynamic().getMod(Stats.OFFICER_SHIP_RECOVERY_MOD).computeEffective(chance);
3285 if (chance < 0) chance = 0;
3286 if (chance > 1f) chance = 1f;
3306 float min =
Float.MAX_VALUE;
3307 JumpPointAPI result =
null;
3308 List<JumpPointAPI> points = entity.getContainingLocation().getEntities(JumpPointAPI.class);
3310 for (JumpPointAPI curr : points) {
3312 if (curr.getMemoryWithoutUpdate().getBoolean(JumpPointInteractionDialogPluginImpl.UNSTABLE_KEY)) {
3315 float dist =
Misc.
getDistance(entity.getLocation(), curr.getLocation());
3325 float min =
Float.MAX_VALUE;
3326 JumpPointAPI result =
null;
3327 List<JumpPointAPI> points = entity.getContainingLocation().getEntities(JumpPointAPI.class);
3329 for (JumpPointAPI curr : points) {
3330 if (curr.isGasGiantAnchor() || curr.isStarAnchor())
continue;
3331 float dist =
Misc.
getDistance(entity.getLocation(), curr.getLocation());
3341 float min =
Float.MAX_VALUE;
3342 SectorEntityToken result =
null;
3343 List<PlanetAPI> planets = entity.getContainingLocation().getPlanets();
3345 for (PlanetAPI curr : planets) {
3348 float dist =
Misc.
getDistance(entity.getLocation(), curr.getLocation());
3367 if (containingLocation ==
null || containingLocation.isHyperspace()) {
3375 boolean sameLoc = containingLocation !=
null &&
3376 Global.
getSector().getPlayerFleet().getContainingLocation() == containingLocation;
3378 float maxDist = 6000;
3382 return dist < maxDist;
3418 return seedUniquifier() ^
System.nanoTime();
3424 long current = seedUniquifier.get();
3425 long next = current * 181783497276652981
L;
3427 if (seedUniquifier.compareAndSet(current, next)) {
3439 return UUID.randomUUID().toString();
3445 for (
Color c : colors) {
3446 result +=
Integer.toHexString(c.getRGB()) +
"|";
3448 if (result.length() > 0) {
3449 result = result.substring(0, result.length() - 1);
3465 JumpPointAPI
jp = (JumpPointAPI) entity;
3466 if (
jp.getDestinationVisualEntity() == star)
return jp;
3473 float min =
Float.MAX_VALUE;
3474 JumpPointAPI result =
null;
3475 LocationAPI location = from.getContainingLocation();
3477 for (JumpPointAPI curr : points) {
3478 float dist =
Misc.
getDistance(from.getLocation(), curr.getLocation());
3490 String base = spec.getHullId();
3504 float dist1 =
Math.abs(angle - direction) - arc/2f;
3505 float dist2 =
Math.abs(360 -
Math.abs(angle - direction)) - arc/2f;
3513 if (planet.getMarket() !=
null) {
3518 market.setPlanetConditionMarketOnly(
true);
3519 market.setPrimaryEntity(planet);
3520 market.setFactionId(Factions.NEUTRAL);
3521 planet.setMarket(market);
3523 long seed = StarSystemGenerator.random.nextLong();
3524 planet.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, seed);
3528 if (planet.getMarket() !=
null) {
3534 market.setPrimaryEntity(planet);
3535 market.setFactionId(Factions.NEUTRAL);
3536 planet.setMarket(market);
3542 if (level == SurveyLevel.NONE)
str =
UNKNOWN;
3545 else if (level == SurveyLevel.FULL)
str =
FULL;
3555 entity.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_DEFENDER_OVERRIDE,
override);
3559 entity.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SPECIAL_DATA, data);
3566 entity.getMemoryWithoutUpdate().set(MemFlags.PREV_SALVAGE_SPECIAL_DATA, data);
3570 return entity.getMemoryWithoutUpdate().get(MemFlags.SALVAGE_SPECIAL_DATA);
3573 return entity.getMemoryWithoutUpdate().get(MemFlags.PREV_SALVAGE_SPECIAL_DATA);
3585 float dist =
Misc.
getDistance(from.getLocationInHyperspace(), system.getLocation());
3586 if (dist > maxRange)
continue;
3589 systems.
add(system);
3603 if (system.getStar() !=
null && system.getStar().getSpec().isPulsar()) {
3604 return system.getStar();
3606 if (system.getSecondary() !=
null && system.getSecondary().getSpec().isPulsar()) {
3607 return system.getSecondary();
3609 if (system.getTertiary() !=
null && system.getTertiary().getSpec().isPulsar()) {
3610 return system.getTertiary();
3615 for (PlanetAPI p : system.getPlanets()) {
3616 if (!p.isStar())
return true;
3645 for (
int i = 0; i < params.length; i += 2) {
3649 weight = (
Float) params[i+1];
3651 weight = (
Integer) params[i+1];
3659 beacon.getMemoryWithoutUpdate().set(WarningBeaconEntityPlugin.GLOW_COLOR_KEY, color);
3663 beacon.getMemoryWithoutUpdate().set(WarningBeaconEntityPlugin.PING_COLOR_KEY, color);
3674 for (CampaignFleetAPI other : from.getContainingLocation().getFleets()) {
3675 if (from == other)
continue;
3676 float dist =
getDistance(from.getLocation(), other.getLocation());
3677 if (dist <= maxDist) {
3686 for (CampaignFleetAPI other : from.getContainingLocation().getFleets()) {
3687 if (from == other)
continue;
3688 VisibilityLevel level = other.getVisibilityLevelTo(from);
3689 if (level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS || level == VisibilityLevel.COMPOSITION_DETAILS) {
3708 if (one.getStacksCopy().size() != two.getStacksCopy().size())
return false;
3712 for (
int i = 0; i <
stacks1.size(); i++) {
3716 if ((
s1 ==
null ||
s2 ==
null) &&
s1 !=
s2)
return false;
3717 if (
s1.getSize() !=
s2.getSize())
return false;
3718 if (
s1.getType() !=
s2.getType())
return false;
3719 if ((
s1.getData() ==
null ||
s2.getData() ==
null) &&
s1.getData() !=
s2.getData())
return false;
3720 if (!
s1.getData().equals(
s2.getData()))
return false;
3729 SectorEntityToken jumpPoint =
null;
3730 float minDist =
Float.MAX_VALUE;
3731 for (SectorEntityToken curr : system.getJumpPoints()) {
3732 float dist =
Misc.
getDistance(system.getCenter().getLocation(), curr.getLocation());
3733 if (dist < minDist) {
3739 return (JumpPointAPI) jumpPoint;
3746 fleet.setInteractionTarget(
null);
3747 if (fleet.getAI()
instanceof ModularFleetAIAPI) {
3748 ModularFleetAIAPI ai = (ModularFleetAIAPI) fleet.getAI();
3749 ai.getTacticalModule().setTarget(
null);
3750 ai.getTacticalModule().setPriorityTarget(
null, 0f,
false);
3769 fleet.clearAssignments();
3773 if (source !=
null) {
3774 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, source.getPrimaryEntity(), 1000f,
"returning to " + source.getName());
3775 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, source.getPrimaryEntity(), 1f + 1f * (
float)
Math.random());
3776 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, source.getPrimaryEntity(), 1000f);
3779 if (entity !=
null) {
3780 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, entity, 1000f,
"returning to " + entity.getName());
3781 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, entity, 1f + 1f * (
float)
Math.random());
3782 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, entity, 1000f);
3784 SectorEntityToken token =
Global.
getSector().getHyperspace().createToken(0, 0);
3785 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, token, 1000f);
3792 fleet.clearAssignments();
3796 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, where, 1000f,
"returning to " + where.getName());
3798 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, where, 1000f, text +
" " + where.getName());
3800 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, where, 5f + 5f * (
float)
Math.random());
3801 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, where, 1000f);
3807 TextPanelAPI text) {
3809 CustomRepImpact impact =
new CustomRepImpact();
3811 impact.limit = limit;
3813 new RepActionEnvelope(RepActions.CUSTOM, impact,
3817 if (person !=
null) {
3821 new RepActionEnvelope(RepActions.CUSTOM, impact,
3822 null, text,
true), person);
3829 for (AbilityPlugin curr : fleet.getAbilities().values()) {
3830 if (curr.isActive()) {
3831 for (
String t : curr.getSpec().getTags()) {
3832 if (
t.equals(tag)) {
3849 float s1 = from.getTravelSpeed();
3850 float s2 =
v2.length();
3852 if (
s1 < 10)
s1 = 10;
3853 if (
s2 < 10)
s2 = 10;
3883 float s2 =
v2.length();
3885 if (
s1 < 10)
s1 = 10;
3886 if (
s2 < 10)
s2 = 10;
3910 if (player !=
null) {
3911 player.setVelocity(0, 0);
3920 list.
add(
"" + qty +
" " + spec.getName().toLowerCase());
3928 GL11.glColor4ub((
byte)color.getRed(),
3929 (
byte)color.getGreen(),
3930 (
byte)color.getBlue(),
3931 (
byte)color.getAlpha());
3935 GL11.glColor4ub((
byte)color.getRed(),
3936 (
byte)color.getGreen(),
3937 (
byte)color.getBlue(),
3938 (
byte)((
float)color.getAlpha() * alphaMult));
3943 GL11.glColor4ub((
byte)color.getRed(),
3944 (
byte)color.getGreen(),
3945 (
byte)color.getBlue(),
3951 MarketAPI market = entity.getMarket();
3952 if (market ==
null)
return false;
3953 if (market.getPrimaryEntity() != entity)
return false;
3955 if (market.getMemoryWithoutUpdate().getBoolean(MemFlags.ENTITY_MISSION_IMPORTANT))
return true;
3957 if (market !=
null && market.getCommDirectory() !=
null) {
3958 for (CommDirectoryEntryAPI
entry : market.getCommDirectory().getEntriesCopy()) {
3960 PersonAPI person = (PersonAPI)
entry.getEntryData();
3961 if (person.getMemoryWithoutUpdate().getBoolean(MemFlags.ENTITY_MISSION_IMPORTANT)) {
3976 makeImportant(entity.getMemoryWithoutUpdate(), reason, dur);
3982 makeImportant(person.getMemoryWithoutUpdate(), reason, dur);
4011 for (
String key : memory.getKeys()) {
4012 if (key.startsWith(
"$" +
prefix)) {
4016 for (
String key : unset) {
4020 if (
prefix.endsWith(
"_")) {
4031 if (player ==
null)
return;
4033 for (CampaignFleetAPI other : player.getContainingLocation().getFleets()) {
4034 if (player == other)
continue;
4035 if (other.getBattle() !=
null)
continue;
4036 if (other.getOrbit() !=
null)
continue;
4037 if (!other.isHostileTo(player))
continue;
4039 float dist =
Misc.
getDistance(player.getLocation(), other.getLocation());
4040 if (dist < minDist) {
4045 other.setLocation(v.x, v.y);
4054 long seed = entity.getMemoryWithoutUpdate().getLong(MemFlags.SALVAGE_SEED);
4057 String id = entity.getId();
4058 if (
id ==
null)
id =
genUID();
4060 seed = (entity.getId().hashCode() * 17000) * 1181783497276652981
L;
4062 seed = seedUniquifier() ^ (entity.getId().hashCode() * 17000);
4065 for (
int i = 0; i < 5; i++) {
4068 long result = r.nextLong();
4069 entity.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, result);
4076 String id = entity.getName();
4077 if (
id ==
null)
id =
genUID();
4079 long seed = (entity.getId().hashCode() * 17000);
4081 for (
int i = 0; i < 53; i++) {
4084 long result = r.nextLong();
4089 MemoryAPI
mem = fleet.getMemoryWithoutUpdate();
4090 if (
mem.getBoolean(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF)) {
4091 mem.removeAllRequired(MemFlags.MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF);
4093 mem.unset(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_OFF);
4094 mem.unset(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_ON);
4098 station.getMemoryWithoutUpdate().set(
"$abandonedStation",
true);
4100 market.setSurveyLevel(SurveyLevel.FULL);
4101 market.setPrimaryEntity(station);
4102 market.setFactionId(station.getFaction().getId());
4103 market.addCondition(Conditions.ABANDONED_STATION);
4104 market.addSubmarket(Submarkets.SUBMARKET_STORAGE);
4105 market.setPlanetConditionMarketOnly(
false);
4106 ((StoragePlugin)market.getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin()).setPlayerPaidToUnlock(
true);
4107 station.setMarket(market);
4108 station.getMemoryWithoutUpdate().unset(
"$tradeMode");
4112 if (fleet.getMoveDestination() ==
null)
return 0f;
4114 if (fleet.wasSlowMoving()) {
4115 Vector2f vel = fleet.getVelocity();
4125 MemoryAPI
mem = fleet.getMemoryWithoutUpdate();
4126 if (
mem.
contains(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_ON) &&
4127 mem.getExpire(MemFlags.MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_ON) < 0) {
4135 ImmigrationPlugin plugin =
Global.
getSector().getPluginPicker().pickImmigrationPlugin(market);
4136 if (plugin ==
null) {
4137 plugin =
new CoreImmigrationPluginImpl(market);
4143 AICoreAdminPlugin plugin =
Global.
getSector().getPluginPicker().pickAICoreAdminPlugin(commodityId);
4148 AICoreOfficerPlugin plugin =
Global.
getSector().getPluginPicker().pickAICoreOfficerPlugin(commodityId);
4153 AbandonMarketPlugin plugin =
Global.
getSector().getGenericPlugins().pickPlugin(AbandonMarketPlugin.class, market);
4158 StabilizeMarketPlugin plugin =
Global.
getSector().getGenericPlugins().pickPlugin(StabilizeMarketPlugin.class, market);
4164 FleetInflater plugin =
Global.
getSector().getPluginPicker().pickFleetInflater(fleet, params);
4180 SubmarketAPI
storage = market.getSubmarket(Submarkets.SUBMARKET_STORAGE);
4181 if (
storage !=
null &&
storage.getPlugin().getOnClickAction(
null) == OnClickAction.OPEN_SUBMARKET) {
4189 float min = plugin.getWeightForMarketSize(market.getSize());
4190 float max = plugin.getWeightForMarketSize(market.getSize() + 1);
4192 float curr = market.getPopulation().getWeightValue();
4194 if (max <= min)
return 0f;
4196 float f = (curr - min) / (max - min);
4213 if (market ==
null)
return null;
4214 SubmarketAPI submarket = market.getSubmarket(Submarkets.SUBMARKET_STORAGE);
4215 if (submarket ==
null)
return null;
4216 return (StoragePlugin) submarket.getPlugin();
4220 SubmarketAPI submarket = market.getSubmarket(Submarkets.LOCAL_RESOURCES);
4221 if (submarket ==
null)
return null;
4222 return submarket.getPlugin();
4225 if (market ==
null)
return null;
4226 SubmarketAPI submarket = market.getSubmarket(Submarkets.SUBMARKET_STORAGE);
4227 if (submarket ==
null)
return null;
4228 return submarket.getCargo();
4232 SubmarketAPI submarket = market.getSubmarket(Submarkets.LOCAL_RESOURCES);
4233 if (submarket ==
null)
return null;
4234 return submarket.getCargo();
4242 if (plugin ==
null)
return 0f;
4244 for (CargoStackAPI stack : plugin.getCargo().getStacksCopy()) {
4245 value += stack.getSize() * stack.getBaseValuePerUnit();
4252 if (plugin ==
null)
return 0f;
4255 for (FleetMemberAPI member : plugin.getCargo().getMothballedShips().getMembersListCopy()) {
4256 value += member.getBaseValue();
4275 cargo.addAll(
storage.getCargo());
4276 ships.addAll(
storage.getCargo().getMothballedShips().getMembersListCopy());
4279 cargo.addAll(
local.getCargo());
4280 ships.addAll(
local.getCargo().getMothballedShips().getMembersListCopy());
4285 String title =
"Cargo in storage";
4287 title =
"Cargo in storage and resource stockpiles";
4289 tooltip.addSectionHeading(title, color, dark, Alignment.MID,
opad);
4291 tooltip.showCargo(cargo, 10,
true,
opad);
4295 String title =
"Ships in storage";
4297 title =
"Ships in storage";
4299 tooltip.addSectionHeading(title, color, dark, Alignment.MID,
opad);
4301 tooltip.showShips(ships, 10,
true,
opad);
4304 if (!market.isPlayerOwned()) {
4313 return !cargo.isEmpty() || !ships.isEmpty();
4327 int tier = (
int)
admin.getMemoryWithoutUpdate().getFloat(
"$ome_adminTier");
4364 hull = variant.getHullSpec().getHullId();
4386 if (fp !=
null)
return fp;
4389 fp = variant.getHullSpec().getFleetPoints();
4403 if (market !=
null) {
4404 float numShipsMult = market.getStats().getDynamic().getMod(Stats.COMBAT_FLEET_SIZE_MULT).computeEffective(0f);
4409 float pts = market.getFaction().getDoctrine().getOfficerQuality();
4410 fp *= 1f + (
pts - 1f) / 4f;
4415 if (market !=
null) {
4416 float numShipsMult = market.getStats().getDynamic().getMod(Stats.COMBAT_FLEET_SIZE_MULT).computeEffective(0f);
4426 return ShipQuality.getShipQuality(market, factionId);
4463 QualityData d = ShipQuality.getInstance().getQualityData(market);
4464 if (d.market !=
null) {
4465 if (factionId ==
null && d.market.getFaction() != market.getFaction()) {
4466 return ShipPickMode.IMPORTED;
4467 }
else if (factionId !=
null && !factionId.equals(d.market.getFactionId())) {
4468 return ShipPickMode.IMPORTED;
4470 return ShipPickMode.PRIORITY_THEN_ALL;
4472 return ShipPickMode.IMPORTED;
4475 public static boolean isBusy(CampaignFleetAPI fleet) {
4476 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_BUSY);
4480 for (SectorEntityToken entity : market.getConnectedEntities()) {
4481 if (entity.hasTag(Tags.STATION)) {
4483 if (curr !=
null && curr == fleet)
return entity;
4489 for (SectorEntityToken entity : market.getConnectedEntities()) {
4490 if (entity.hasTag(Tags.STATION)) {
4492 if (fleet !=
null)
return fleet;
4498 if (station.hasTag(Tags.STATION)) {
4499 Object test = station.getMemoryWithoutUpdate().get(MemFlags.STATION_FLEET);
4501 return (CampaignFleetAPI)
test;
4508 for (SectorEntityToken entity : market.getConnectedEntities()) {
4509 if (entity.hasTag(Tags.STATION)) {
4511 if (fleet !=
null)
return fleet;
4517 if (station.hasTag(Tags.STATION)) {
4518 Object test = station.getMemoryWithoutUpdate().get(MemFlags.STATION_BASE_FLEET);
4520 return (CampaignFleetAPI)
test;
4527 Object test = station.getMemoryWithoutUpdate().get(MemFlags.STATION_MARKET);
4529 return (MarketAPI)
test;
4535 for (Industry ind : market.getIndustries()) {
4536 if (ind.getSpec().hasTag(Industries.TAG_STATION)) {
4544 boolean notActiveModule = variant.getHullSpec().getOrdnancePoints(
null) <= 0 &&
4545 variant.getWeaponGroups().isEmpty() &&
4546 variant.getHullSpec().getFighterBays() <= 0;
4550 boolean notActiveModule = ship.getVariant().getHullSpec().getOrdnancePoints(
null) <= 0 &&
4551 ship.getVariant().getWeaponGroups().isEmpty() &&
4552 ship.getMutableStats().getNumFighterBays().getModifiedValue() <= 0;
4563 for (JumpDestination d :
jp.getDestinations()) {
4564 if (d.getDestination() !=
null && d.getDestination().getContainingLocation() !=
null &&
4565 d.getDestination().getContainingLocation().isHyperspace()) {
4566 return d.getDestination().getLocation();
4569 return jp.getLocationInHyperspace();
4576 if (dist > maxRange)
return false;
4593 return entity !=
null && entity.hasTag(Tags.SYSTEM_ANCHOR);
4597 return (StarSystemAPI) anchor.getMemoryWithoutUpdate().get(MemFlags.STAR_SYSTEM_IN_ANCHOR_MEMORY);
4615 for (
int i = 0; i <
res.length; i++) {
4618 if (quantity > cargo.getQuantity(CargoItemType.RESOURCES, commodityId)) {
4621 all.
add(commodityId);
4625 ResourceCostPanelAPI cost = text.addCostPanel(title,
costHeight,
4627 cost.setNumberOnlyMode(
true);
4628 cost.setWithBorder(
false);
4629 cost.setAlignment(Alignment.LMID);
4636 for (
int i = 0; i <
res.length; i++) {
4639 int available = (
int) cargo.getCommodityQuantity(commodityId);
4650 if (consumed !=
null && consumed[i]) {
4651 cost.setLastCostConsumed(
true);
4655 cost.addCost(commodityId,
"" +
required +
" (" + available +
")", curr);
4657 cost.addCost(commodityId,
"" +
required, curr);
4659 if (consumed !=
null && consumed[i]) {
4660 cost.setLastCostConsumed(
true);
4668 String key =
"$shownFactionConfigDialog";
4675 public static boolean isPatrol(CampaignFleetAPI fleet) {
4676 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_PATROL_FLEET);
4679 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_SMUGGLER);
4681 public static boolean isTrader(CampaignFleetAPI fleet) {
4682 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_TRADE_FLEET);
4684 public static boolean isPirate(CampaignFleetAPI fleet) {
4685 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_PIRATE);
4688 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_SCAVENGER);
4690 public static boolean isRaider(CampaignFleetAPI fleet) {
4691 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_RAIDER);
4694 return fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_WAR_FLEET);
4705 CampaignFleetAPI
closest =
null;
4706 float minDist =
Float.MAX_VALUE;
4707 for (SectorEntityToken station : from.getContainingLocation().getCustomEntitiesWithTag(Tags.STATION)) {
4709 if (fleet ==
null || fleet.isEmpty())
continue;
4712 float dist =
Misc.
getDistance(from.getLocation(), station.getLocation());
4714 if (dist < minDist) {
4722 for (CampaignFleetAPI fleet : from.getContainingLocation().getFleets()) {
4723 if (!fleet.isStationMode())
continue;
4724 if (fleet.isHidden())
continue;
4727 float dist =
Misc.
getDistance(from.getLocation(), fleet.getLocation());
4729 if (dist < minDist) {
4736 if (
closest ==
null)
return null;
4745 if (market !=
null) {
4763 float str = member.getMemberStrength();
4765 if (
str < min)
str = min;
4767 float quality = 0.5f;
4769 if (member.getFleetData() !=
null && member.getFleetData().getFleet() !=
null) {
4770 CampaignFleetAPI fleet = member.getFleetData().getFleet();
4771 if (fleet.getInflater() !=
null && !fleet.isInflated()) {
4772 quality = fleet.getInflater().getQuality();
4773 sMods = fleet.getInflater().getAverageNumSMods();
4775 BattleAPI battle = fleet.getBattle();
4776 CampaignFleetAPI source = battle ==
null ?
null : battle.getSourceFleet(member);
4777 if (source !=
null && source.getInflater() !=
null &&
4778 !source.isInflated()) {
4779 quality = source.getInflater().getQuality();
4780 sMods = source.getInflater().getAverageNumSMods();
4782 float dmods = DModManager.getNumDMods(member.getVariant());
4784 if (quality < 0) quality = 0f;
4786 sMods = member.getVariant().getSMods().size();
4791 if (member.isStation()) {
4800 if (member.getCaptain() !=
null) {
4801 float captainLevel = (member.getCaptain().getStats().getLevel() - 1f);
4802 if (member.isStation()) {
4811 str *=
Math.max(0.25f, 0.8f + quality * 0.4f);
4814 str *= 0.5f + 0.5f * member.getStatus().getHullFraction();
4826 MemoryAPI
mem = market.getMemoryWithoutUpdate();
4827 float expire = days;
4828 if (
mem.
contains(MemFlags.MEMORY_KEY_PLAYER_HOSTILE_ACTIVITY_NEAR_MARKET)) {
4829 expire +=
mem.getExpire(MemFlags.MEMORY_KEY_PLAYER_HOSTILE_ACTIVITY_NEAR_MARKET);
4831 if (expire > 180) expire = 180;
4833 mem.set(MemFlags.MEMORY_KEY_PLAYER_HOSTILE_ACTIVITY_NEAR_MARKET,
true, expire);
4838 if (market.getContainingLocation() ==
null)
return;
4839 for (CampaignTerrainAPI terrain : market.getContainingLocation().getTerrainCopy()) {
4840 if (Terrain.RADIO_CHATTER.equals(terrain.getType())) {
4843 market.getContainingLocation().removeEntity(terrain);
4870 float radius = fleet.getRadius();
4874 float mult = (radius - min) / (max - min);
4875 if (mult > 1) mult = 1;
4880 float skillMod = fleet.getCommanderStats().getDynamic().getValue(Stats.NAVIGATION_PENALTY_MULT);
4883 mult =
Math.round(mult * 100f) / 100f;
4893 mult =
Math.round(mult * 100f) / 100f;
4894 if (mult < 0.1f) mult = 0.1f;
4902 addHitGlow(location, loc, vel, size, dur, color);
4905 location.addHitParticle(loc, vel,
4906 size, 0.4f, dur, color);
4907 location.addHitParticle(loc, vel,
4908 size * 0.25f, 0.4f, dur, color);
4909 location.addHitParticle(loc, vel,
4910 size * 0.15f, 1f, dur,
Color.white);
4917 ParticleControllerAPI [] result =
new ParticleControllerAPI[3];
4919 result[0] = location.addParticle(loc, vel,
4920 size, 0.4f,
rampUp, dur, color);
4921 result[1] = location.addParticle(loc, vel,
4922 size * 0.25f, 0.4f,
rampUp, dur, color);
4923 result[2] = location.addParticle(loc, vel,
4934 float a =
Math.round(market.getAccessibilityMod().computeEffective(0f) * 100f) / 100f;
4960 return market !=
null && market.getMemoryWithoutUpdate().getBoolean(MemFlags.MARKET_MILITARY);
4965 for (Industry curr : market.getIndustries()) {
4966 if (curr.getSpec().hasTag(Industries.TAG_HEAVYINDUSTRY)) {
4974 for (Industry curr : market.getIndustries()) {
4975 if (curr.getSpec().hasTag(Industries.TAG_STATION)) {
4983 if (planet.getStarSystem() !=
null) {
4984 String claimedBy = planet.getStarSystem().getMemoryWithoutUpdate().getString(MemFlags.CLAIMING_FACTION);
4991 MarketAPI result =
null;
4993 for (MarketAPI curr : markets) {
4994 if (curr.isHidden())
continue;
4995 if (curr.getFaction().isPlayerFaction())
continue;
4997 int score = curr.getSize();
4998 for (MarketAPI other : markets) {
4999 if (other != curr && other.getFaction() == curr.getFaction()) score++;
5003 JSONObject json = curr.getFaction().getCustom().optJSONObject(Factions.CUSTOM_PUNITIVE_EXPEDITION_DATA);
5004 if (
json ==
null)
continue;
5012 if (result ==
null)
return null;
5014 return result.getFaction();
5020 for (Industry industry : market.getIndustries()) {
5035 Industry
upInd =
null;
5036 if (industry.isUpgrading()) {
5037 String up = industry.getSpec().getUpgrade();
5039 upInd = market.instantiateIndustry(
up);
5042 if (industry.isUpgrading() &&
upInd !=
null) {
5047 Industry curr = industry;
5048 while (curr !=
null) {
5049 if (curr.isBuilding() && !curr.isUpgrading()) {
5050 refund += curr.getBuildCost();
5056 curr = market.instantiateIndustry(
down);
5067 CustomCampaignEntityAPI beacon = center.getContainingLocation().addCustomEntity(
null,
null, Entities.WARNING_BEACON, Factions.NEUTRAL);
5070 float radius = (gap.start +
gap.end) / 2f;
5071 float orbitDays = radius / (10f + StarSystemGenerator.random.nextFloat() * 5f);
5072 beacon.setCircularOrbitPointingDown(center, StarSystemGenerator.random.nextFloat() * 360f, radius, orbitDays);
5076 if (
beaconTag.equals(Tags.BEACON_MEDIUM)) {
5077 glowColor =
new Color(250,155,0,255);
5079 }
else if (
beaconTag.equals(Tags.BEACON_HIGH)) {
5080 glowColor =
new Color(250,55,0,255);
5089 CoreUITradeMode mode = CoreUITradeMode.OPEN;
5090 String val = memory.getString(
"$tradeMode");
5091 if (
val !=
null && !
val.isEmpty()) {
5092 mode = CoreUITradeMode.valueOf(
val);
5098 return Global.
getSector().getMemoryWithoutUpdate().getBoolean(
"$spacerStart");
5102 for (Industry ind : market.getIndustries()) {
5103 if (ind.getSpec().hasTag(Industries.TAG_SPACEPORT)) {
5111 float max = color.getRed();
5112 if (color.getGreen() > max) max = color.getGreen();
5113 if (color.getBlue() > max) max = color.getBlue();
5114 float f = brightness / max;
5120 int red = (
int) (color.getRed() * factor);
5121 int green = (
int) (color.getGreen() * factor);
5122 int blue = (
int) (color.getBlue() * factor);
5123 int alpha = (
int) (color.getAlpha() * factor);
5125 if (
red > 255)
red = 255;
5128 if (alpha > 255) alpha = 255;
5134 int max = (
int) fleet.getCommander().getStats().getOfficerNumber().getModifiedValue();
5139 for (OfficerDataAPI
od : fleet.getFleetData().getOfficersCopy()) {
5149 for (OfficerDataAPI
od : fleet.getFleetData().getOfficersCopy()) {
5159 return (
int)
Math.round(market.getStats().getDynamic().getMod(Stats.MAX_INDUSTRIES).computeEffective(0));
5164 for (Industry curr : market.getIndustries()) {
5165 if (curr.isIndustry()) {
5167 }
else if (curr.isUpgrading()) {
5168 String up = curr.getSpec().getUpgrade();
5170 Industry
upInd = market.instantiateIndustry(
up);
5171 if (
upInd.isIndustry()) count++;
5175 for (ConstructionQueueItem item : market.getConstructionQueue().getItems()) {
5177 if (spec.hasTag(Industries.TAG_INDUSTRY)) count++;
5184 for (Industry curr : market.getIndustries()) {
5185 if (curr.isImproved()) {
5193 int count = system.getEntitiesWithTag(Tags.STABLE_LOCATION).size();
5194 count += system.getEntitiesWithTag(Tags.OBJECTIVE).size();
5195 for (SectorEntityToken
e : system.getJumpPoints()) {
5197 JumpPointAPI
jp = (JumpPointAPI)
e;
5198 if (
jp.isWormhole()) count++;
5205 for (Industry curr : market.getIndustries()) {
5206 if (curr.getSpec().hasTag(Industries.TAG_POPULATION))
continue;
5208 if (curr.isBuilding() && !curr.isUpgrading()) {
5222 }
else if (
rel < 0) {
5248 for (FleetMemberAPI member :
pf.getFleetData().getMembersListCopy()) {
5253 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
5267 if (result ==
null ||
baseDamage <= 0)
return baseSize;
5269 float sd = result.getDamageToShields() + result.getOverMaxDamageToShields();
5270 float ad = result.getTotalDamageToArmor();
5271 float hd = result.getDamageToHull();
5272 float ed = result.getEmpDamage();
5273 DamageType type = result.getType();
5281 if (type == DamageType.KINETIC) {
5284 }
else if (type == DamageType.HIGH_EXPLOSIVE) {
5287 }
else if (type == DamageType.FRAGMENTATION) {
5307 float minSize = 15f;
5308 float minMult = minSize / baseSize;
5320 return baseSize * mult;
5325 for (SkillLevelAPI
sl : person.getStats().getSkillsCopy()) {
5326 if (
sl.getLevel() >= 2) count++;
5359 return person.getMemoryWithoutUpdate().is(
MENTORED,
true);
5368 return person !=
null && person.getMemoryWithoutUpdate().is(
IS_MERCENARY,
true);
5396 if (stats ==
null)
return false;
5401 return member !=
null && member.getVariant() !=
null &&
isAutomated(member.getVariant());
5404 return variant !=
null && variant.hasHullMod(HullMods.AUTOMATED);
5407 if (ship ==
null)
return false;
5426 if (ship ==
null)
return 0;
5427 return (
int)
Math.round(ship.getMutableStats().getDynamic().getMod(Stats.MAX_PERMANENT_HULLMODS_MOD).computeEffective(
MAX_PERMA_MODS));
5431 if (member ==
null)
return 0;
5432 PersonAPI prev = member.getFleetCommanderForStats();
5434 fake.setStats(stats);
5435 member.setFleetCommanderForStats(
fake,
null);
5436 int num = (
int)
Math.round(member.getStats().getDynamic().getMod(Stats.MAX_PERMANENT_HULLMODS_MOD).computeEffective(
MAX_PERMA_MODS));
5437 member.setFleetCommanderForStats(prev,
null);
5445 float fraction = 0f;
5477 if (fraction < 0f) fraction = 0f;
5478 if (fraction > 1f) fraction = 1f;
5485 return mod.getCapitalCost();
5487 return mod.getCruiserCost();
5489 return mod.getDestroyerCost();
5491 return mod.getFrigateCost();
5493 return mod.getFrigateCost();
5496 public static boolean isSpecialMod(ShipVariantAPI variant, HullModSpecAPI spec) {
5500 if (spec.isHidden())
return false;
5501 if (spec.isHiddenEverywhere())
return false;
5502 if (spec.hasTag(Tags.HULLMOD_DMOD))
return false;
5503 if (!variant.getPermaMods().contains(spec.getId()))
return false;
5504 if (variant.getHullSpec().getBuiltInMods().contains(spec.getId()))
return false;
5505 if (!variant.getSMods().contains(spec.getId()))
return false;
5513 for (
String id : variant.getHullMods()) {
5515 if (spec.isHidden())
continue;
5516 if (spec.isHiddenEverywhere())
continue;
5517 if (spec.hasTag(Tags.HULLMOD_DMOD))
continue;
5518 if (variant.getHullSpec().isBuiltInMod(
id) &&
5519 spec.getEffect().hasSModEffect() && !spec.getEffect().isSModEffectAPenalty() &&
5520 !variant.getSModdedBuiltIns().contains(
id)) {
5527 if (variant ==
null)
return 0;
5529 for (
String id : variant.getHullMods()) {
5543 if (variant ==
null)
return result;
5545 for (
String id : variant.getHullMods()) {
5566 float bonus = fleet.getStats().getDynamic().getMod(Stats.MOVE_SLOW_SPEED_BONUS_MOD).computeEffective(0);
5576 public static enum FleetMemberDamageLevel {
5584 boolean withMessage, TextPanelAPI textPanel,
5604 boolean withMessage, TextPanelAPI textPanel,
5615 float hitStrength = member.getHullSpec().getArmorRating() * 2f;
5618 float max = 0.5f +
random.nextFloat() * 0.1f;
5619 float min = 0.01f +
random.nextFloat() * 0.04f;
5625 for (
int i = 0; i <
numHits; i++) {
5628 if (member.getStatus().getHullFraction() < 0.01f) {
5629 member.getStatus().setHullFraction(0.01f);
5632 boolean isPF = member !=
null && member.getFleetData() !=
null &&
5633 member.getFleetData().getFleet() !=
null && member.getFleetData().getFleet().isPlayerFleet();
5636 float crPerDep = member.getDeployCost();
5637 float currCR = member.getRepairTracker().getBaseCR();
5643 member.getRepairTracker().applyCREvent(-
crDamage,
null,
null);
5648 if (withMessage &&
isPF) {
5649 MessageIntel intel =
new MessageIntel(
messageText,
5653 if (textPanel !=
null) {
5654 Global.
getSector().getIntelManager().addIntelToTextPanel(intel, textPanel);
5656 Global.
getSector().getCampaignUI().addMessage(intel, MessageClickAction.REFIT_TAB, member);
5666 if (member.getOwner() == 0) {
5670 float f = 1f - member.getDeploymentPointsCost() / threshold;
5680 for (SModRecord
record : PlaythroughLog.getInstance().getSModsInstalled()) {
5682 if (member ==
record.getMember() &&
record.getMember() !=
null) {
5683 points +=
record.getSPSpent();
5684 xp +=
record.getBonusXPFractionGained() *
record.getSPSpent();
5688 return new float[] {points, 1f - xp/points};
5690 return new float[] {0f, 0f};
5694 float mult = fleet.getMemoryWithoutUpdate().getFloat(FleetFactoryV3.KEY_SPAWN_FP_MULT);
5695 if (mult == 0) mult = 1f;
5700 fleet.getMemoryWithoutUpdate().set(FleetFactoryV3.KEY_SPAWN_FP_MULT, mult);
5704 return faction !=
null && faction.getCustomBoolean(Factions.CUSTOM_DECENTRALIZED);
5709 if (person.isAICore()) {
5710 if (Personalities.RECKLESS.equals(person.getPersonalityAPI().getId())) {
5724 if (ts ==
null)
return Float.MAX_VALUE;
5729 float currQty = com.getCombinedTradeModQuantity();
5732 float quantityWithTX = com.getTradeMod().getModifiedValue() + quantity +
5733 Math.max(com.getTradeModPlus().getModifiedValue(), 0) +
5734 Math.min(com.getTradeModMinus().getModifiedValue(), 0);
5745 int maxUnits =
Math.min(3,
Math.max(com.getMaxDemand(), com.getMaxSupply()));
5747 int sign = (
int)
Math.signum(quantity);
5751 com.addTradeMod(
"mod_" +
Misc.
genUID(), quantity, BaseSubmarketPlugin.TRADE_IMPACT_DAYS);
5757 if (!market.isHidden())
return true;
5764 for (
String tag : other) {
5765 if (tags.
contains(tag))
return true;
5782 return market !=
null && market.isPlanetConditionMarketOnly() &&
5783 hasRuins(market) && !market.getMemoryWithoutUpdate().getBoolean(
"$ruinsExplored");
5786 return market !=
null &&
5787 (market.hasCondition(Conditions.RUINS_SCATTERED) ||
5788 market.hasCondition(Conditions.RUINS_WIDESPREAD) ||
5789 market.hasCondition(Conditions.RUINS_EXTENSIVE) ||
5790 market.hasCondition(Conditions.RUINS_VAST));
5794 return market !=
null &&
5795 (market.hasCondition(Conditions.FARMLAND_POOR) ||
5796 market.hasCondition(Conditions.FARMLAND_ADEQUATE) ||
5797 market.hasCondition(Conditions.FARMLAND_RICH) ||
5798 market.hasCondition(Conditions.FARMLAND_BOUNTIFUL));
5805 triggers.
add(trigger);
5810 if (triggers !=
null) {
5811 triggers.
remove(trigger);
5818 MemoryAPI
mem = fleet.getMemoryWithoutUpdate();
5832 if (triggers !=
null && triggers.isEmpty()) {
5833 MemoryAPI
mem = fleet.getMemoryWithoutUpdate();
5844 source.getWing().getSourceShip() ==
playerShip;
5846 CombatEntityAPI
followedEntity = engine.getCombatUI().getEntityToFollowV2();
5852 engine.hasAttachedFloaty(target);
5853 showFloaty = showFloaty && !target.isFighter();
5920 float shieldDam = result.getDamageToShields();
5921 float armorDam = result.getTotalDamageToArmor();
5922 float hullDam = result.getDamageToHull();
5923 float fluxDam = result.getEmpDamage();
5946 if (soundId !=
null) {
5968 if (soundId !=
null) {
5980 if (ship.isDrone())
return 0.1f;
5981 boolean nonCombat = ship.isNonCombat(
false);
5983 switch (ship.getHullSize()) {
5984 case CAPITAL_SHIP: weight += 8;
break;
5985 case CRUISER: weight += 4;
break;
5986 case DESTROYER: weight += 2;
break;
5987 case FRIGATE: weight += 1;
break;
5988 case FIGHTER: weight += 1;
break;
5991 if (ship.isDrone()) weight *= 0.1f;
5997 if (ship.getFluxTracker().isVenting()){
5998 incapTime = ship.getFluxTracker().getTimeToVent();
5999 }
else if (ship.getFluxTracker().isOverloaded()) {
6000 incapTime = ship.getFluxTracker().getOverloadTimeRemaining();
6006 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_NEVER_AVOID_PLAYER_SLOWLY)) {
6010 boolean avoidingPlayer = fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_AVOID_PLAYER_SLOWLY);
6013 CampaignFleetAPI
fleeingFrom = fleet.getMemoryWithoutUpdate().getFleet(FleetAIFlags.NEAREST_FLEEING_FROM);
6028 return faction !=
null &&
6029 faction.getCustomBoolean(Factions.CUSTOM_PIRATE_BEHAVIOR);
6039 for (
String other :
new String[] {
"euler",
"heir",
"honest",
"hono"}) {
6040 if (
word.startsWith(other)) {
6045 if (
word.startsWith(
"hour") && !
word.startsWith(
"houri")) {
6052 for (
String regex :
new String[] {
"^e[uw]",
"^onc?e\b",
"^uni([^nmd]|mo)",
"^u[bcfhjkqrst][aeiou]"}) {
6054 m = p.matcher(
word);
6060 p =
Pattern.compile(
"(?is)" +
"^U[NK][AIEO]");
6061 m = p.matcher(
word);
6072 p =
Pattern.compile(
"(?is)" +
"^y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)" +
".*");
6073 m = p.matcher(
word);
6083 ContactIntel intel = ContactIntel.getContactIntel(person);
6084 if (intel !=
null) {
6085 intel.relocateToMarket(destination,
false);
6088 boolean hidden =
false;
6089 if (person.getMarket() !=
null) {
6090 MarketAPI market = person.getMarket();
6091 CommDirectoryEntryAPI
entry = market.getCommDirectory().getEntryForPerson(person);
6092 if (
entry !=
null) {
6094 hidden =
entry.isHidden();
6096 market.removePerson(person);
6097 market.getCommDirectory().removePerson(person);
6100 if (!destination.getPeopleCopy().contains(person)) {
6101 destination.addPerson(person);
6103 person.setMarket(destination);
6106 if (destination.getCommDirectory() !=
null &&
6107 destination.getCommDirectory().getEntryForPerson(person) ==
null) {
6108 destination.getCommDirectory().addPerson(person);
6110 CommDirectoryEntryAPI
entry = destination.getCommDirectory().getEntryForPerson(person);
6111 if (
entry !=
null) {
6112 entry.setHidden(
true);
6139 return memory.getBoolean(MemFlags.STORY_CRITICAL);
6150 boolean recentlyBeaten = fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER);
6154 if (
pf ==
null)
return true;
6155 if (fleet.getAI() !=
null) {
6156 EncounterOption
opt = fleet.getAI().pickEncounterOption(
null,
pf);
6157 if (
opt == EncounterOption.DISENGAGE ||
opt == EncounterOption.HOLD_VS_STRONGER) {
6160 if (
opt == EncounterOption.ENGAGE) {
6177 boolean recentlyBeaten = fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER);
6179 if (fleet.getFleetData() ==
null)
return false;
6182 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
6183 if (!member.isCivilian() && member.getHullSpec() !=
null) {
6184 switch (member.getHullSpec().getHullSize()) {
6185 case CAPITAL_SHIP: count += 4;
break;
6186 case CRUISER: count += 3;
break;
6187 case DESTROYER: count += 2;
break;
6188 case FRIGATE: count += 1;
break;
6195 for (FleetMemberAPI member :
pf.getFleetData().getMembersListCopy()) {
6196 if (!member.isCivilian() && member.getHullSpec() !=
null) {
6197 switch (member.getHullSpec().getHullSize()) {
6198 case CAPITAL_SHIP:
pfCount += 4;
break;
6199 case CRUISER:
pfCount += 3;
break;
6200 case DESTROYER:
pfCount += 2;
break;
6201 case FRIGATE:
pfCount += 1;
break;
6206 if (count >
pfCount * 0.67f) {
6216 if (
arr ==
null ||
arr.length <= k || k < 0) {
6221 int to = arr.length - 1;
6226 float mid =
arr[(r + w) / 2];
6252 if (ship ==
null || weapon ==
null)
return base;
6253 float flat = CombatListenerUtil.getWeaponBaseRangeFlatMod(ship, weapon);
6254 float percent = CombatListenerUtil.getWeaponBaseRangePercentMod(ship, weapon);
6255 float mult = CombatListenerUtil.getWeaponBaseRangeMultMod(ship, weapon);
6256 return (base * (1f + percent/100f) +
flat) * mult;
6264 r.x = (1f -
t) * (1f -
t) * p0.x + 2f * (1f -
t) *
t * p1.x +
t *
t * p2.x;
6265 r.y = (1f -
t) * (1f -
t) * p0.y + 2f * (1f -
t) *
t * p1.y +
t *
t * p2.y;
6274 r.x = (1f -
t) * (1f -
t) * (1f -
t) *
p0.x +
6275 3f * (1f -
t) * (1f -
t) *
t * p1.x +
6276 3f * (1f -
t) *
t *
t * p2.x +
6278 r.y = (1f -
t) * (1f -
t) * (1f -
t) *
p0.y +
6279 3f * (1f -
t) * (1f -
t) *
t * p1.y +
6280 3f * (1f -
t) *
t *
t * p2.y +
6289 if (location ==
null)
return false;
6290 for (CampaignTerrainAPI
ter : location.getTerrainCopy()) {
6292 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2)
ter.getPlugin();
6293 if (plugin.containsPoint(loc, radius)) {
6301 if (entity ==
null || entity.getContainingLocation() ==
null)
return false;
6302 for (CampaignTerrainAPI
ter : entity.getContainingLocation().getTerrainCopy()) {
6304 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2)
ter.getPlugin();
6305 if (plugin.containsEntity(entity)) {
6316 return loc.x < -
sw/2f || loc.x >
sw/2f || loc.y < -
sh/2f || loc.y >
sh/2f;
6320 for (CampaignTerrainAPI
ter : location.getTerrainCopy()) {
6322 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2)
ter.getPlugin();
6324 int skip =
Math.max(20, segments.size() / 10);
6325 for (
int i = 0; i < segments.size(); i += skip) {
6327 if (
i2 > segments.size() - skip/2)
i2 = segments.size() - 1;
6328 if (
i2 >= segments.size())
i2 = segments.size() - 1;
6333 if (p !=
null)
return true;
6344 if (curr.hasTag(Tags.THEME_CORE)) {
6346 min.x =
Math.min(min.x, loc.x);
6347 min.y =
Math.min(min.y, loc.y);
6348 max.x =
Math.max(max.x, loc.x);
6349 max.y =
Math.max(max.y, loc.y);
6356 Global.
getSector().getMemoryWithoutUpdate().set(
"$coreWorldsMin", min);
6357 Global.
getSector().getMemoryWithoutUpdate().set(
"$coreWorldsMax", max);
6358 Global.
getSector().getMemoryWithoutUpdate().set(
"$coreWorldsCenter", core);
6433 float turnDecel = missile.getEngineController().getTurnDeceleration();
6451 missile.giveCommand(ShipCommand.TURN_RIGHT);
6452 }
else if (turnDir >= 0) {
6453 missile.giveCommand(ShipCommand.TURN_LEFT);
6462 int count =
Global.
getSector().getPlayerMemoryWithoutUpdate().getInt(MemFlags.PLAYER_UNTRUSTWORTHY);
6468 Global.
getSector().getPlayerMemoryWithoutUpdate().set(MemFlags.PLAYER_UNTRUSTWORTHY, count + 1);
6471 public static ReputationAdjustmentResult
adjustRep(PersonAPI person,
float delta, TextPanelAPI text) {
6472 return adjustRep(person, delta,
null, text);
6474 public static ReputationAdjustmentResult
adjustRep(PersonAPI person,
float delta, RepLevel limit, TextPanelAPI text) {
6475 return adjustRep(person, delta, limit, text,
true,
true);
6477 public static ReputationAdjustmentResult
adjustRep(PersonAPI person,
float delta, RepLevel limit, TextPanelAPI text,
6478 boolean addMessageOnNoChange,
boolean withMessage) {
6479 CustomRepImpact impact =
new CustomRepImpact();
6480 impact.delta = delta;
6481 if (limit !=
null) {
6482 impact.limit = limit;
6485 new RepActionEnvelope(RepActions.CUSTOM,
6486 impact,
null, text, addMessageOnNoChange, withMessage),
6490 public static ReputationAdjustmentResult
adjustRep(
String factionId,
float delta, TextPanelAPI text) {
6491 return adjustRep(factionId, delta,
null, text);
6493 public static ReputationAdjustmentResult
adjustRep(
String factionId,
float delta, RepLevel limit, TextPanelAPI text) {
6494 return adjustRep(factionId, delta, limit, text,
true,
true);
6496 public static ReputationAdjustmentResult
adjustRep(
String factionId,
float delta, RepLevel limit, TextPanelAPI text,
6497 boolean addMessageOnNoChange,
boolean withMessage) {
6498 CustomRepImpact impact =
new CustomRepImpact();
6499 impact.delta = delta;
6500 if (limit !=
null) {
6501 impact.limit = limit;
6504 new RepActionEnvelope(RepActions.CUSTOM,
6505 impact,
null, text, addMessageOnNoChange, withMessage),
6511 case CAPITAL_SHIP:
return "Capital";
6512 case CRUISER:
return "Cruiser";
6513 case DESTROYER:
return "Destroyer";
6514 case FIGHTER:
return "Fighter";
6515 case FRIGATE:
return "Frigate";
6521 float r =
Math.abs(one.getRed() - two.getRed());
6522 float g =
Math.abs(one.getGreen() - two.getGreen());
6523 float b =
Math.abs(one.getBlue() - two.getBlue());
6524 float a =
Math.abs(one.getAlpha() - two.getAlpha());
6526 return (
float)
Math.sqrt(r * r +
g *
g +
b *
b +
a *
a);
6532 public static boolean isFringe(SectorEntityToken entity) {
6533 return isFringe(entity.getLocationInHyperspace());
6536 return isFringe(system.getLocation());
6546 float a =
sw * 0.5f * mult;
6547 float b =
sh * 0.5f * mult;
6551 float f = (x * x) / (
a *
a) + (y * y)/ (
b *
b);
6558 return market.getMemoryWithoutUpdate().getBoolean(MemFlags.HIDDEN_BASE_MEM_FLAG);
6563 return entity.getMemoryWithoutUpdate().getBoolean(ReversePolarityToggle.REVERSED_POLARITY);
6568 public static enum CatalogEntryType {
6575 private CatalogEntryType(
String suffix) {
6576 this.suffix = suffix;
6601 Random r = StarSystemGenerator.random;
6612 while (
s1.length() < 3)
s1 =
"0" +
s1;
6613 while (
s3.length() < 2)
s3 =
"0" +
s3;
6615 return base +
" " +
s0 +
s1 +
"-" +
s2 +
s3 + type.suffix;
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static FactoryAPI getFactory()
static Logger getLogger(Class c)
static CombatEngineAPI getCombatEngine()
static SectorAPI getSector()
static float getFleetwideTotalStat(CampaignFleetAPI fleet, String dynamicMemberStatId)
static void setDefenderOverride(SectorEntityToken entity, DefenderDataOverride override)
static void setWarningBeaconColors(SectorEntityToken beacon, Color glow, Color ping)
static long getNameBasedSeed(SectorEntityToken entity)
static boolean isStoryCritical(MarketAPI market)
static String getJoined(String joiner, String ... strings)
static Color getStoryOptionColor()
static float getBonusXPForRecovering(FleetMemberAPI member)
static float getBurnMultForTerrain(CampaignFleetAPI fleet)
static void setUnremovable(PersonAPI person, boolean unremovable)
static float getDistanceSq(Vector2f v1, Vector2f v2)
static Color getRelColor(float rel)
static Color getTextColor()
static float getGenericRollingAverageFactor()
static ShipAPI findClosestShipEnemyOf(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius)
static float getBuildInBonusXP(HullModSpecAPI mod, HullSize size)
static SectorEntityToken addWarningBeacon(SectorEntityToken center, OrbitGap gap, String beaconTag)
static String getStringWithTokenReplacement(String format, SectorEntityToken entity, Map< String, MemoryAPI > memoryMap)
static List< StarSystemAPI > getSystemsInRange(SectorEntityToken from, Set< StarSystemAPI > exclude, boolean nonEmpty, float maxRange)
static boolean isHiddenBase(MarketAPI market)
static int getMaxOfficers(CampaignFleetAPI fleet)
static String getDGSCredits(float num)
static int getNumStableLocations(StarSystemAPI system)
static String genEntityCatalogId(int cycleOverride, int monthOverride, int dayOverride, CatalogEntryType type)
static void applyDamage(FleetMemberAPI member, Random random, float damageMult, boolean withCRDamage, String crDamageId, String crDamageReason, boolean withMessage, TextPanelAPI textPanel, String messageText)
static void cleanBuffer(Buffer toBeDestroyed)
static MarketAPI getSourceMarket(CampaignFleetAPI fleet)
static String getWithDGS(float num)
static SectorEntityToken addNebulaFromPNG(String image, float centerX, float centerY, LocationAPI location, String category, String key, int tilesWide, int tilesHigh, String terrainType, StarAge age)
static DecimalFormat format
static boolean isPatrol(CampaignFleetAPI fleet)
static int getShippingCapacity(MarketAPI market, boolean inFaction)
static boolean turnTowardsPointV2(MissileAPI missile, Vector2f point, float angVel)
static JumpPointAPI findNearestJumpPointThatCouldBeExitedFrom(SectorEntityToken entity)
static Color getButtonTextColor()
static Color genColor(Color min, Color max, Random random)
static float getSpawnChanceMult(Vector2f locInHyper)
static int getNumImprovedIndustries(MarketAPI market)
static boolean hasHeavyIndustry(MarketAPI market)
static void makeNonHostileToFaction(CampaignFleetAPI fleet, String factionId, float dur)
static void playSound(ApplyDamageResultAPI result, Vector2f loc, Vector2f vel, String lightShields, String solidShields, String heavyShields, String lightHull, String solidHull, String heavyHull)
static void renderQuad(float x, float y, float width, float height, Color color, float alphaMult)
static void removeDefeatTrigger(CampaignFleetAPI fleet, String trigger)
static Color MOUNT_MISSILE
static void makeImportant(MemoryAPI memory, String reason, float dur)
static List< StarSystemAPI > getSystemsWithPlayerColonies(boolean includeNonPlayerFaction)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
static float getShipWeight(ShipAPI ship)
static PlanetAPI getPulsarInSystem(StarSystemAPI system)
static float GATE_FUEL_COST_MULT
static float getMercDaysSinceHired(PersonAPI person)
static Vector2f getPointAtRadius(Vector2f from, float r, Random random)
static FleetInflater getInflater(CampaignFleetAPI fleet, Object params)
static int getDangerLevel(CampaignFleetAPI fleet)
static SectorEntityToken addNebulaFromPNG(String image, float centerX, float centerY, LocationAPI location, String category, String key, int tilesWide, int tilesHigh, StarAge age)
static CampaignEventPlugin startEvent(CampaignEventTarget eventTarget, String eventId, Object params)
static float getDistanceFromArc(float direction, float arc, float angle)
static Map< String, Integer > variantToFPCache
static AICoreOfficerPlugin getAICoreOfficerPlugin(String commodityId)
static List< MarketAPI > getFactionMarkets(String factionId)
static float getStorageShipValue(MarketAPI market)
static int getNumEliteSkills(PersonAPI person)
static Vector2f getInterceptPoint(SectorEntityToken from, SectorEntityToken to, float maxSpeedFrom)
static Vector2f closestPointOnSegmentToPoint(Vector2f p1, Vector2f p2, Vector2f p3)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static String lcFirst(String str)
static void setMentored(PersonAPI person, boolean mentored)
static long getSalvageSeed(SectorEntityToken entity, boolean nonRandom)
static Color getStoryDarkColor()
static float getStorageFeeFraction()
static float getColorDist(Color one, Color two)
static List< CampaignFleetAPI > getNearbyFleets(SectorEntityToken from, float maxDist)
static boolean isInAbyss(Vector2f loc)
static WeightedRandomPicker< String > createStringPicker(Random random, Object ... params)
static float getFleetwideTotalMod(CampaignFleetAPI fleet, String dynamicMemberStatId, float base, ShipAPI ship)
static List< String > getDefeatTriggers(CampaignFleetAPI fleet, boolean createIfNecessary)
static int computeTotalShutdownRefund(MarketAPI market)
static boolean isWarFleet(CampaignFleetAPI fleet)
static boolean isRaider(CampaignFleetAPI fleet)
static ReputationAdjustmentResult adjustRep(String factionId, float delta, RepLevel limit, TextPanelAPI text)
static void unsetAll(String prefix, String memKey, MemoryAPI memory)
static List< StarSystemAPI > getAbyssalSystems()
static boolean isInsideSlipstream(Vector2f loc, float radius)
static String LAST_RAIDED_AT
static void setAsteroidSource(SectorEntityToken asteroid, AsteroidSource source)
static SectorEntityToken addDebrisField(LocationAPI loc, DebrisFieldParams params, Random random)
static float FP_TO_GROUND_RAID_STR_APPROX_MULT
static boolean isSameCargo(CargoAPI baseOne, CargoAPI baseTwo)
static float getEconomyInterval()
static List< FleetMemberAPI > getSnapshotMembersLost(CampaignFleetAPI fleet)
static List< MarketAPI > getMarketsInLocation(LocationAPI location, String factionId)
static float approach(float curr, float dest, float minSpeed, float diffSpeedMult, float amount)
static float getClosestTurnDirection(Vector2f one, Vector2f two)
static Color getMissileMountColor()
static String ucFirst(String str)
static float getMemberStrength(FleetMemberAPI member)
static boolean isMercenary(PersonAPI person)
static boolean isFastStartExplorer()
static float getDesiredMoveDir(CampaignFleetAPI fleet)
static Color getNegativeHighlightColor()
static Object getSalvageSpecial(SectorEntityToken entity)
static float BURN_PENALTY_MULT
static float getSizeNum(HullSize size)
static Map< String, String > variantToHullCache
static Vector2f bezier(Vector2f p0, Vector2f p1, Vector2f p2, float t)
static void addHitGlow(LocationAPI location, Vector2f loc, Vector2f vel, float size, float dur, Color color)
static Color MOUNT_BALLISTIC
static CargoAPI getStorageCargo(MarketAPI market)
static float getAngleInDegreesStrict(Vector2f from, Vector2f to)
static String getHullSizeStr(HullSize size)
static void moveToMarket(PersonAPI person, MarketAPI destination, boolean alwaysAddToCommDirectory)
static float getStorageCargoValue(MarketAPI market)
static void setColor(Color color, float alphaMult)
static void makeImportant(PersonAPI person, String reason)
static float getIncapacitatedTime(ShipAPI ship)
static String getHullIdForVariantId(String variantId)
static boolean shouldShowDamageFloaty(ShipAPI source, ShipAPI target)
static float getRoundedValueFloat(float value)
static int computeShutdownRefund(MarketAPI market, Industry industry)
static void setColor(Color color)
static void setAbandonedStationMarket(String marketId, SectorEntityToken station)
static String getStringForDays(int days)
static Vector2f getSystemJumpPointHyperExitLocation(JumpPointAPI jp)
static float getDistance(Vector3f v1, Vector3f v2)
static boolean doesMarketHaveMissionImportantPeopleOrIsMarketMissionImportant(SectorEntityToken entity)
static boolean areSegmentsCoincident(Vector2f a1, Vector2f a2, Vector2f b1, Vector2f b2)
static float getHitGlowSize(float baseSize, float baseDamage, DamageType type, float sd, float ad, float hd, float ed)
static boolean hasOrbitalStation(MarketAPI market)
static void makeHostileToFaction(CampaignFleetAPI fleet, String factionId, float dur)
static SurveyLevel getMinSystemSurveyLevel(StarSystemAPI system)
static void genFractalNoise(Random random, float[][] noise, int x1, int y1, int x2, int y2, int iter, float spikes)
static List< MarketAPI > getFactionMarkets(FactionAPI faction, String econGroup)
static Random getRandom(long seed, int level)
static Color setAlpha(Color color, int alpha)
static String getJoined(String joiner, List< String > strings)
static void giveStandardReturnToSourceAssignments(CampaignFleetAPI fleet, boolean withClear)
static void removeRadioChatter(MarketAPI market)
static void setPrevSalvageSpecial(SectorEntityToken entity, Object data)
static String DEFEAT_TRIGGERS
static Color FLOATY_ARMOR_DAMAGE_COLOR
static boolean isAutomated(MutableShipStatsAPI stats)
static Vector2f pickLocationNotNearPlayer(LocationAPI where, Vector2f from, float minDist)
static void makeStoryCritical(MemoryAPI memory, String reason)
static String getTokenReplaced(String in, SectorEntityToken entity)
static List< HullModSpecAPI > getCurrSpecialModsList(ShipVariantAPI variant)
static int getVramMaximumKB()
static float getDistance(float x1, float y1, float x2, float y2)
static void makeImportant(SectorEntityToken entity, String reason)
static void fadeInOutAndExpire(final SectorEntityToken entity, final float in, final float dur, final float out)
static CampaignFleetAPI getStationBaseFleet(SectorEntityToken station)
static Pair< SectorEntityToken, CampaignFleetAPI > getNearestStationInSupportRange(CampaignFleetAPI from)
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
static CustomCampaignEntityAPI addCargoPods(LocationAPI where, Vector2f loc)
static Vector2f closestPointOnLineToPoint(Vector2f p1, Vector2f p2, Vector2f p3)
static String genEntityCatalogId(String firstChar, int cycleOverride, int monthOverride, int dayOverride, CatalogEntryType type)
static void increaseMarketHostileTimeout(MarketAPI market, float days)
static boolean isAutomated(ShipAPI ship)
static float MAX_OFFICER_LEVEL
static String getStarId(PlanetAPI planet)
static boolean turnTowardsFacingV2(MissileAPI missile, float desiredFacing, float relativeAngVel)
static void setAllPlanetsSurveyed(StarSystemAPI system, boolean setRuinsExplored)
static int getVramUsedKB()
static float[] getBonusXPForScuttling(FleetMemberAPI member)
static Color getStoryBrightColor()
static float PER_UNIT_SHIPPING
static int getGoSlowBurnLevel(CampaignFleetAPI fleet)
static PulsarBeamTerrainPlugin getPulsarFor(PlanetAPI star)
static void addSurveyDataFor(PlanetAPI planet, TextPanelAPI text)
static Object getPrevSalvageSpecial(SectorEntityToken entity)
static float getShipWeight(ShipAPI ship, boolean adjustForNonCombat)
static boolean isActiveModule(ShipAPI ship)
static float getCampaignShipScaleMult(HullSize size)
static final Vector2f ZERO
static final String D_HULL_SUFFIX
static StabilizeMarketPlugin getStabilizeMarketPlugin(MarketAPI market)
static float getFleetwideTotalMod(CampaignFleetAPI fleet, String dynamicMemberStatId, float base)
static HullModSpecAPI getMod(String id)
static ReputationAdjustmentResult adjustRep(PersonAPI person, float delta, TextPanelAPI text)
static CampaignFleetAPI getStationBaseFleet(MarketAPI market)
static final boolean shouldConvertFromStub(LocationAPI containingLocation, Vector2f location)
static boolean isStoryCritical(MemoryAPI memory)
static String getAgoStringForTimestamp(long timestamp)
static float getMarketSizeProgress(MarketAPI market)
static String getAtLeastStringForDays(int days)
static boolean isFastStartMerc()
static float DISSIPATION_PER_VENT
static List< StarSystemAPI > getPlayerSystems(boolean includeNonPlayerFaction)
static boolean isAutomated(ShipVariantAPI variant)
static boolean isInsideBlackHole(CampaignFleetAPI fleet, boolean includeEventHorizon)
static void incrUntrustwortyCount()
static Industry getSpaceport(MarketAPI market)
static float computeAngleSpan(float radius, float range)
static boolean isFringe(SectorEntityToken entity)
static JumpPointAPI findNearestJumpPoint(SectorEntityToken from)
static Vector2f getVector(JSONObject json, String arrayKey, int index)
static float computeAngleRadius(float angle, float range)
static JumpPointAPI getDistressJumpPoint(StarSystemAPI system)
static int getVramFreeKB()
static List< StarSystemAPI > getNearbyStarSystems(SectorEntityToken token, float maxRangeLY)
static long seedUniquifier()
static void giveStandardReturnToSourceAssignments(CampaignFleetAPI fleet)
static Vector2f pickHyperLocationNotNearPlayer(Vector2f from, float minDist)
static boolean playerHasStorageAccess(MarketAPI market)
static CargoAPI getLocalResourcesCargo(MarketAPI market)
static boolean isBusy(CampaignFleetAPI fleet)
static void makeNonStoryCritical(MemoryAPI memory, String reason)
static SectorEntityToken findNearestPlanetTo(SectorEntityToken entity, boolean requireGasGiant, boolean allowStars)
static void makeNotLowRepImpact(CampaignFleetAPI fleet, String reason)
static void addCreditsMessage(String format, int credits)
static List< CampaignFleetAPI > getFleetsInOrNearSystem(StarSystemAPI system)
static final int OWNER_PLAYER
static void wiggle(Vector2f v, float max)
static Color getBasePlayerColor()
static FactionCommissionIntel getCommissionIntel()
static float getHitGlowSize(float baseSize, float baseDamage, ApplyDamageResultAPI result)
static void normalizeNoise(float[][] noise)
static boolean isDecentralized(FactionAPI faction)
static boolean isShipRecoverable(FleetMemberAPI member, CampaignFleetAPI recoverer, boolean own, boolean useOfficerRecovery, float chanceMult)
static List< CampaignFleetAPI > getVisibleFleets(SectorEntityToken from, boolean includeSensorContacts)
static Color MOUNT_UNIVERSAL
static Color getGrayColor()
static String DANGER_LEVEL_OVERRIDE
static void initConditionMarket(PlanetAPI planet)
static float FRINGE_THRESHOLD
static String colorsToString(List< Color > colors)
static void cleanUpMissionMemory(MemoryAPI memory, String prefix)
static DecimalFormat getFormat()
static boolean hasRuins(MarketAPI market)
static void fadeAndExpire(SectorEntityToken entity)
static Vector2f getVector(JSONObject json, String arrayKey)
static String getAOrAnFor(String word)
static void addDefeatTrigger(CampaignFleetAPI fleet, String trigger)
static String getAndJoined(String ... strings)
static AsteroidSource getAsteroidSource(SectorEntityToken asteroid)
static int getNumIndustries(MarketAPI market)
static List< OfficerDataAPI > getMercs(CampaignFleetAPI fleet)
static void setSeen(MarketAPI market, TextPanelAPI text, boolean withNotification)
static float getShieldedCargoFraction(CampaignFleetAPI fleet)
static void adjustRep(float repChangeFaction, RepLevel limit, String factionId, float repChangePerson, RepLevel personLimit, PersonAPI person, TextPanelAPI text)
static void addHitGlow(LocationAPI location, Vector2f loc, Vector2f vel, float size, Color color)
static List< MarketAPI > findNearbyLocalMarkets(SectorEntityToken token, float maxDist, MarketFilter filter)
static float getFuelPerDay(CampaignFleetAPI fleet, float burnLevel)
static int getVramDedicatedKB()
static boolean isBetween(float one, float two, float check)
static StarSystemAPI getNearestStarSystem(SectorEntityToken token)
static void makeStoryCritical(String marketId, String reason)
static String getStrengthDesc(float strAdjustedFP)
static boolean CAN_SMOD_BUILT_IN
static MarketAPI findNearestLocalMarketWithSameFaction(final SectorEntityToken token, float maxDist)
static boolean isSmuggler(CampaignFleetAPI fleet)
static float getDistance(Vector2f v1, Vector2f v2)
static void clearDefeatTriggersIfNeeded(CampaignFleetAPI fleet)
static void computeCoreWorldsExtent()
static Color MOUNT_HYBRID
static float findKth(float[] arr, int k)
static Color getDesignTypeColorDim(String designType)
static Vector2f intersectLines(Vector2f a1, Vector2f a2, Vector2f b1, Vector2f b2)
static void renderQuadAlpha(float x, float y, float width, float height, Color color, float alphaMult)
static boolean isFleetMadeHostileToFaction(CampaignFleetAPI fleet, FactionAPI faction)
static String getDHullId(ShipHullSpecAPI spec)
static Color getEnergyMountColor()
static WeightedRandomPicker< String > createStringPicker(Object ... params)
static void makeHostileToAllTradeFleets(CampaignFleetAPI fleet)
static Vector2f bezierCubic(Vector2f p0, Vector2f p1, Vector2f p2, Vector2f p3, float t)
static float getAdminSalary(PersonAPI admin)
static Vector2f getCoreMin()
static float getAngleDiff(float from, float to)
static boolean isOpenlyPopulated(StarSystemAPI system)
static StarSystemAPI getNearbyStarSystem(SectorEntityToken token)
static List< Color > colorsFromString(String in)
static Color setBrightness(Color color, int brightness)
static Color getBrightPlayerColor()
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getClosestTurnDirection(float facing, Vector2f from, Vector2f to)
static void applyDamage(FleetMemberAPI member, Random random, FleetMemberDamageLevel level, boolean withCRDamage, String crDamageId, String crDamageReason, boolean withMessage, TextPanelAPI textPanel, String messageText)
static void setAllPlanetsKnown(StarSystemAPI system)
static float getProfitMarginFlat()
static boolean hasPulsar(StarSystemAPI system)
static StarSystemAPI getNearbyStarSystem(SectorEntityToken token, float maxRangeLY)
static float getShipQuality(MarketAPI market, String factionId)
static boolean isFringe(Vector2f loc)
static float getDays(float amount)
static Vector2f getPointWithinRadius(Vector2f from, float r, Random random)
static long getSalvageSeed(SectorEntityToken entity)
static boolean isReversePolarity(SectorEntityToken entity)
static boolean isMentored(PersonAPI person)
static boolean isNear(SectorEntityToken entity, Vector2f hyperLoc)
static Vector2f getUnitVector(Vector2f from, Vector2f to)
static float getFleetRadiusTerrainEffectMult(CampaignFleetAPI fleet)
static void fadeAndExpire(final SectorEntityToken entity, final float seconds)
static long genRandomSeed()
static float getFringeFactor(Vector2f loc)
static float getStorageTotalValue(MarketAPI market)
static boolean isHyperspaceAnchor(SectorEntityToken entity)
static MusicPlayerPlugin musicPlugin
static List< Token > tokenize(String string)
static Color scaleAlpha(Color color, float factor)
static String getSurveyLevelString(SurveyLevel level, boolean withBrackets)
static void setFullySurveyed(MarketAPI market, TextPanelAPI text, boolean withNotification)
static boolean isOutsideSector(Vector2f loc)
static float getUnitsPerLightYear()
static boolean flagHasReason(MemoryAPI memory, String flagKey, String reason)
static AICoreAdminPlugin getAICoreAdminPlugin(String commodityId)
static float getOfficerSalary(PersonAPI officer, boolean mercenary)
static boolean hasSModdableBuiltIns(ShipVariantAPI variant)
static Vector2f intersectSegmentAndCircle(Vector2f p1, Vector2f p2, Vector2f p3, float r)
static List< MarketAPI > getNearbyMarkets(Vector2f locInHyper, float distLY)
static boolean hasUnexploredRuins(MarketAPI market)
static SubmarketPlugin getLocalResources(MarketAPI market)
static int MAX_COLONY_SIZE
static float getClosestTurnDirection(float facing, float desired)
static Color getHighlightedOptionColor()
static MusicPlayerPlugin getMusicPlayerPlugin()
static void setSalvageSpecial(SectorEntityToken entity, Object data)
static boolean hasAtLeastOneOfTags(Collection< String > tags, String ... other)
static FactionPersonalityPickerPlugin getFactionPersonalityPicker()
static int getMaxPermanentMods(FleetMemberAPI member, MutableCharacterStatsAPI stats)
static void makeNonStoryCritical(MarketAPI market, String reason)
static MarketAPI getStationMarket(CampaignFleetAPI station)
static void showCost(TextPanelAPI text, String title, boolean withAvailable, float widthOverride, Color color, Color dark, String[] res, int[] quantities, boolean[] consumed)
static boolean isInsideSlipstream(Vector2f loc, float radius, LocationAPI location)
static boolean isInAbyss(SectorEntityToken entity)
static float getDistanceToPlayerLY(Vector2f locInHyper)
static void affectAvailabilityWithinReason(CommodityOnMarketAPI com, int quantity)
static Vector2f getInterceptPoint(CampaignFleetAPI from, SectorEntityToken to)
static Vector2f intersectSegments(Vector2f a1, Vector2f a2, Vector2f b1, Vector2f b2)
static boolean isSpecialMod(ShipVariantAPI variant, HullModSpecAPI spec)
static boolean isTrader(CampaignFleetAPI fleet)
static CampaignTerrainAPI getHyperspaceTerrain()
static void makeImportant(SectorEntityToken entity, String reason, float dur)
static void forgetAboutTransponder(CampaignFleetAPI fleet)
static float distanceFromLineToPoint(Vector2f p1, Vector2f p2, Vector2f p3)
static void clearAreaAroundPlayer(float minDist)
static boolean isFleetMadeHostileToFaction(CampaignFleetAPI fleet, String factionId)
static void makeImportant(PersonAPI person, String reason, float dur)
static void makeUnimportant(SectorEntityToken entity, String reason)
static int getMaxPermanentMods(ShipAPI ship)
static Color FLOATY_HULL_DAMAGE_COLOR
static boolean isSpacerStart()
static Color getHighlightColor()
static boolean isInsignificant(CampaignFleetAPI fleet)
static String RECOVERY_TAGS_KEY
static Color getDesignTypeColor(String designType)
static Color optColor(JSONObject json, String key, Color defaultValue)
static int getEstimatedOrbitIndex(PlanetAPI planet)
static Color FLOATY_EMP_DAMAGE_COLOR
static boolean isPlayerOrCombinedContainingPlayer(CampaignFleetAPI fleet)
static float getShipQuality(MarketAPI market)
static Vector2f optVector(JSONObject json, String arrayKey)
static LabelAPI addDesignTypePara(TooltipMakerAPI tooltip, String design, float pad)
static void clearAsteroidSource(SectorEntityToken asteroid)
static boolean hasAnySurveyDataFor(StarSystemAPI system)
static AbandonMarketPlugin getAbandonMarketPlugin(MarketAPI market)
static void setColor(Color color, int alpha)
static< T extends Enum< T > T mapToEnum(JSONObject json, String key, Class< T > enumType, T defaultOption, boolean required)
static String PRELIMINARY
static String getDetailedAgoString(long timestamp)
static String getAndJoined(List< String > strings)
static void makeImportant(MemoryAPI memory, String reason)
static Color FLOATY_SHIELD_DAMAGE_COLOR
static Color getTooltipTitleAndLightHighlightColor()
static int getMaxIndustries(MarketAPI market)
static boolean addStorageInfo(TooltipMakerAPI tooltip, Color color, Color dark, MarketAPI market, boolean includeLocalResources, boolean addSectionIfEmpty)
static float getAdjustedFP(float fp, MarketAPI market)
static boolean isFastStart()
static CampaignFleetAPI getStationFleet(SectorEntityToken station)
static void setMercHiredNow(PersonAPI person)
static float getRounded(float in)
static boolean isInArc(float direction, float arc, float test)
static boolean isPermaKnowsWhoPlayerIs(CampaignFleetAPI fleet)
static List< MarketAPI > getFactionMarkets(FactionAPI faction)
static ImmigrationPlugin getImmigrationPlugin(MarketAPI market)
static HyperspaceTerrainPlugin getHyperspaceTerrainPlugin()
static SubmarketPlugin getStorage(MarketAPI market)
static boolean setFlagWithReason(MemoryAPI memory, String flagKey, String reason, boolean value, float expire)
static boolean isNormal()
static Color MOUNT_ENERGY
static void initEconomyMarket(PlanetAPI planet)
static float getClosingSpeed(Vector2f p1, Vector2f p2, Vector2f v1, Vector2f v2)
static void interruptAbilitiesWithTag(CampaignFleetAPI fleet, String tag)
static ShipAPI findClosestShipEnemyOf(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius, FindShipFilter filter)
static String getPersonalityName(PersonAPI person)
static float interpolate(float from, float to, float progress)
static CoreUITradeMode getTradeMode(MemoryAPI memory)
static int getFPForVariantId(String variantId)
static Color scaleColorSaturate(Color color, float factor)
static float getMemberStrength(FleetMemberAPI member, boolean withHull, boolean withQuality, boolean withCaptain)
static CampaignFleetAPI getStationFleet(MarketAPI market)
static void showCost(TextPanelAPI text, Color color, Color dark, String[] res, int[] quantities)
static boolean isPirateFaction(FactionAPI faction)
static float getSpawnFPMult(CampaignFleetAPI fleet)
static String getListOfResources(Map< String, Integer > res, List< String > quantities)
static Vector2f getPointWithinRadiusUniform(Vector2f from, float minR, float maxR, Random random)
static boolean isAvoidingPlayerHalfheartedly(CampaignFleetAPI fleet)
static float getSnapshotFPLost(CampaignFleetAPI fleet)
static void makeHostileToPlayerTradeFleets(CampaignFleetAPI fleet)
static final String ASTEROID_SOURCE
static Color scaleColorOnly(Color color, float factor)
static boolean isImportantForReason(MemoryAPI memory, String reason)
static int getCurrSpecialMods(ShipVariantAPI variant)
static boolean shouldNotWantRunFromPlayerEvenIfWeaker(CampaignFleetAPI fleet)
static Vector2f getPerp(Vector2f v)
static int OVER_MAX_INDUSTRIES_PENALTY
static SectorEntityToken getSourceEntity(CampaignFleetAPI fleet)
static Vector2f getInterceptPointBasic(SectorEntityToken from, SectorEntityToken to)
static float getFuelPerDayAtSpeed(CampaignFleetAPI fleet, float speed)
static boolean hasFarmland(MarketAPI market)
static Boolean canCheckVramNVIDIA
static float getBurnLevelForSpeed(float speed)
static boolean isUnremovable(PersonAPI person)
static final int OWNER_NEUTRAL
static float getAdjustedBaseRange(float base, ShipAPI ship, WeaponAPI weapon)
static float[][] initNoise(Random random, int w, int h, float spikes)
static float normalizeAngle(float angleDeg)
static Vector2f getPointAtRadius(Vector2f from, float r)
static ShipPickMode getShipPickMode(MarketAPI market, String factionId)
static void setPreliminarySurveyed(MarketAPI market, TextPanelAPI text, boolean withNotification)
static Industry getStationIndustry(MarketAPI market)
static float logOfBase(float base, float num)
static JumpPointAPI getJumpPointTo(PlanetAPI star)
static boolean isInsideSlipstream(SectorEntityToken entity)
static ReputationAdjustmentResult adjustRep(PersonAPI person, float delta, RepLevel limit, TextPanelAPI text)
static boolean isPlayerFactionSetUp()
static Vector2f getDiff(Vector2f v1, Vector2f v2)
static Industry getCurrentlyBeingConstructed(MarketAPI market)
static boolean isPirate(CampaignFleetAPI fleet)
static void makeHostileToFaction(CampaignFleetAPI fleet, String factionId, boolean hostile, float dur)
static Vector2f rotateAroundOrigin(Vector2f v, float angle, Vector2f origin)
static boolean isPointInBounds(Vector2f p1, List< Vector2f > bounds)
static String replaceTokensFromMemory(String text, Map< String, MemoryAPI > memoryMap)
static Vector2f interpolateVector(Vector2f from, Vector2f to, float progress)
static void setMercenary(PersonAPI person, boolean mercenary)
static JumpPointAPI findNearestJumpPointTo(SectorEntityToken entity, boolean allowWormhole)
static int getNumNonMercOfficers(CampaignFleetAPI fleet)
static Vector2f getVector(JSONObject json, String arrayKey, Vector2f def)
static void setWarningBeaconGlowColor(SectorEntityToken beacon, Color color)
static int getNumHostileMarkets(FactionAPI faction, SectorEntityToken from, float maxDist)
static boolean systemHasPlanets(StarSystemAPI system)
static void makeStoryCritical(MarketAPI market, String reason)
static boolean isFleetReturningToDespawn(CampaignFleetAPI fleet)
static float getAbyssalDepth(Vector2f loc)
static final String MERCENARY_HIRE_TIMESTAMP
static List< MarketAPI > getPlayerMarkets(boolean includeNonPlayerFaction)
static float getOfficerSalary(PersonAPI officer)
static void setWarningBeaconPingColor(SectorEntityToken beacon, Color color)
static float getDistanceLY(Vector2f v1, Vector2f v2)
static MarketAPI findNearestLocalMarket(SectorEntityToken token, float maxDist, MarketFilter filter)
static float getTargetingRadius(Vector2f from, CombatEntityAPI target, boolean considerShield)
static Color interpolateColor(Color from, Color to, float progress)
static boolean canCheckVram()
static float getSpeedForBurnLevel(float burnLevel)
static boolean isFringe(StarSystemAPI system)
static Color getDarkHighlightColor()
static String genEntityCatalogId(CatalogEntryType type)
static IntervalUtil createEconIntervalTracker()
static float MIN_TERRAIN_EFFECT_MULT
static boolean isAutomated(FleetMemberAPI member)
static Vector2f getCoreMax()
static void makeHostile(CampaignFleetAPI fleet)
static int getStorageCostPerMonth(MarketAPI market)
static boolean caresAboutPlayerTransponder(CampaignFleetAPI fleet)
static Vector2f getPointWithinRadius(Vector2f from, float r)
static FactionAPI getCommissionFaction()
static void clearTarget(CampaignFleetAPI fleet, boolean forgetTransponder)
static void giveStandardReturnAssignments(CampaignFleetAPI fleet, SectorEntityToken where, String text, boolean withClear)
static float getProfitMarginMult()
static final String CAPTAIN_UNREMOVABLE
static float FLUX_PER_CAPACITOR
static boolean isPlayerOrCombinedPlayerPrimary(CampaignFleetAPI fleet)
static float getBattleJoinRange()
static String FLEET_RETURNING_TO_DESPAWN
static int computeEconUnitChangeFromTradeModChange(CommodityOnMarketAPI com, int quantity)
static void setAllPlanetsKnown(String systemName)
static float getLYPerDayAtSpeed(CampaignFleetAPI fleet, float speed)
static MarketAPI getBiggestMarketInLocation(LocationAPI location)
static ParticleControllerAPI[] addGlowyParticle(LocationAPI location, Vector2f loc, Vector2f vel, float size, float rampUp, float dur, Color color)
static final String IS_MERCENARY
static StarSystemAPI getStarSystemForAnchor(SectorEntityToken anchor)
static boolean isSlowMoving(CampaignFleetAPI fleet)
static Color getDarkPlayerColor()
static float getLYPerDayAtBurn(CampaignFleetAPI fleet, float burnLevel)
static float getProbabilityMult(float desired, float current, float deviationMult)
static void showCost(TextPanelAPI text, String title, boolean withAvailable, Color color, Color dark, String[] res, int[] quantities)
static Color getColor(JSONObject json, String key)
static Color getStoryDarkBrighterColor()
static void makeUnimportant(PersonAPI person, String reason)
static Color MOUNT_SYNERGY
static void stopPlayerFleet()
static void generatePlanetConditions(String systemName, StarAge age)
static int getUntrustwortyCount()
static float FP_TO_BOMBARD_COST_APPROX_MULT
static void makeNoRepImpact(CampaignFleetAPI fleet, String reason)
static Set< String > getAllowedRecoveryTags()
static float getOutpostPenalty()
static float IMPACT_VOLUME_MULT
static void clearFlag(MemoryAPI memory, String flagKey)
static boolean crossesAnySlipstream(LocationAPI location, Vector2f from, Vector2f to)
static float getAngleInDegreesStrict(Vector2f v)
static void setRaidedTimestamp(MarketAPI market)
static float SAME_FACTION_BONUS
static boolean isActiveModule(ShipVariantAPI variant)
static JumpPointAPI findNearestJumpPointTo(SectorEntityToken entity)
static void setSpawnFPMult(CampaignFleetAPI fleet, float mult)
static float getDistanceToPlayerLY(SectorEntityToken other)
static void fadeIn(final SectorEntityToken entity, final float in)
static ShipPickMode getShipPickMode(MarketAPI market)
static Color getPositiveHighlightColor()
static MagneticFieldTerrainPlugin getMagneticFieldFor(PlanetAPI planet)
static float getDaysSinceLastRaided(MarketAPI market)
static String getRoundedValueMaxOneAfterDecimal(float value)
static float getAdjustedStrength(float fp, MarketAPI market)
static ReputationAdjustmentResult adjustRep(String factionId, float delta, TextPanelAPI text)
static List< MarketAPI > getMarketsInLocation(LocationAPI location)
static int getOPCost(HullModSpecAPI mod, HullSize size)
static void makeUnimportant(MemoryAPI memory, String reason)
static boolean showRuleDialog(SectorEntityToken entity, String initialTrigger)
static FactionAPI getClaimingFaction(SectorEntityToken planet)
static ReputationAdjustmentResult adjustRep(String factionId, float delta, RepLevel limit, TextPanelAPI text, boolean addMessageOnNoChange, boolean withMessage)
static Vector2f getCoreCenter()
static SectorEntityToken getStationEntity(MarketAPI market, CampaignFleetAPI fleet)
static boolean isMilitary(MarketAPI market)
static boolean isUnboardable(FleetMemberAPI member)
static float SNEAK_BURN_MULT
static float getAngleInDegrees(Vector2f from, Vector2f to)
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
static boolean isStationInSupportRange(CampaignFleetAPI fleet, CampaignFleetAPI station)
static List< CampaignFleetAPI > findNearbyFleets(SectorEntityToken from, float maxRange, FleetFilter filter)
static Vector2f getPointWithinRadiusUniform(Vector2f from, float r, Random random)
static float getFractionalBurnLevelForSpeed(float speed)
static String getRoundedValueOneAfterDecimalIfNotWhole(float value)
static Color MOUNT_COMPOSITE
static StarCoronaTerrainPlugin getCoronaFor(PlanetAPI star)
static< T extends Enum< T > T mapToEnum(JSONObject json, String key, Class< T > enumType, T defaultOption)
static boolean isScavenger(CampaignFleetAPI fleet)
static void makeNonHostileToFaction(CampaignFleetAPI fleet, String factionId, boolean nonHostile, float dur)
static String getCommissionFactionId()
static float getAngleInDegrees(Vector2f v)
static ReputationAdjustmentResult adjustRep(PersonAPI person, float delta, RepLevel limit, TextPanelAPI text, boolean addMessageOnNoChange, boolean withMessage)
static void generatePlanetConditions(StarSystemAPI system, StarAge age)
static Vector2f normalise(Vector2f v)
static int MAX_PERMA_MODS
static Vector3f optVector3f(JSONObject json, String arrayKey)
static Vector3f getVector3f(JSONObject json, String arrayKey)
static Color scaleColor(Color color, float factor)
static void makeLowRepImpact(CampaignFleetAPI fleet, String reason)
static float getAbyssalDepthOfPlayer()
static String getRoundedValue(float value)
static boolean isUnboardable(ShipHullSpecAPI hullSpec)
static float getAbyssalDepth(SectorEntityToken entity)
static Color getBallisticMountColor()
void add(T item, float time)
CargoAPI createCargo(boolean unlimitedStacks)
MarketAPI createMarket(String id, String name, int size)
float getSpeedPerBurnLevel()
float getBaseTravelSpeed()
float getTargetingRadius(Vector2f from, CombatEntityAPI target, boolean considerShield)
boolean isShowDamageFloaties()
String getSpriteName(String category, String id)
ShipVariantAPI getVariant(String variantId)
float getUnitsPerLightYear()
float getBaseFleetSelectionRadius()
HullModSpecAPI getHullModSpec(String modId)
Object getPlugin(String id)
IndustrySpecAPI getIndustrySpec(String industryId)
InputStream openStream(String filename)
Object getNewPluginInstance(String id)
boolean getBoolean(String key)
float getBonusXP(String key)
CommoditySpecAPI getCommoditySpec(String commodityId)
float getFleetSelectionRadiusPerUnitSize()
boolean isGeneratingNewGame()
float getFloat(String key)
boolean isInCampaignState()
float getMaxFleetSelectionRadius()
float getAngleInDegreesFast(Vector2f v)
Color getColor(String id)
Color getDesignTypeColor(String designType)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)