1package com.fs.starfarer.api.util;
3import java.io.IOException;
4import java.lang.reflect.Method;
6import java.text.DecimalFormat;
7import java.text.DecimalFormatSymbols;
8import java.util.ArrayList;
9import java.util.Arrays;
10import java.util.Collection;
11import java.util.Collections;
12import java.util.Comparator;
13import java.util.HashMap;
14import java.util.HashSet;
15import java.util.LinkedHashMap;
16import java.util.LinkedHashSet;
18import java.util.Locale;
20import java.util.Random;
23import java.util.concurrent.atomic.AtomicLong;
24import java.util.regex.Matcher;
25import java.util.regex.Pattern;
28import java.awt.image.BufferedImage;
29import java.awt.image.Raster;
31import javax.imageio.ImageIO;
33import org.json.JSONArray;
34import org.json.JSONException;
35import org.json.JSONObject;
36import org.lwjgl.opengl.ATIMeminfo;
37import org.lwjgl.opengl.GL11;
38import org.lwjgl.opengl.NVXGpuMemoryInfo;
39import org.lwjgl.util.vector.Vector2f;
40import org.lwjgl.util.vector.Vector3f;
42import com.fs.starfarer.api.EveryFrameScript;
43import com.fs.starfarer.api.Global;
44import com.fs.starfarer.api.MusicPlayerPlugin;
45import com.fs.starfarer.api.campaign.AICoreAdminPlugin;
46import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
47import com.fs.starfarer.api.campaign.BattleAPI;
48import com.fs.starfarer.api.campaign.CampaignClockAPI;
49import com.fs.starfarer.api.campaign.CampaignFleetAPI;
50import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
51import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
52import com.fs.starfarer.api.campaign.CargoAPI;
53import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
54import com.fs.starfarer.api.campaign.CargoStackAPI;
55import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI;
56import com.fs.starfarer.api.campaign.CommDirectoryEntryAPI.EntryType;
57import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
58import com.fs.starfarer.api.campaign.FactionAPI;
59import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
60import com.fs.starfarer.api.campaign.FleetAssignment;
61import com.fs.starfarer.api.campaign.FleetInflater;
62import com.fs.starfarer.api.campaign.InteractionDialogAPI;
63import com.fs.starfarer.api.campaign.JumpPointAPI;
64import com.fs.starfarer.api.campaign.JumpPointAPI.JumpDestination;
65import com.fs.starfarer.api.campaign.LocationAPI;
66import com.fs.starfarer.api.campaign.ParticleControllerAPI;
67import com.fs.starfarer.api.campaign.PlanetAPI;
68import com.fs.starfarer.api.campaign.PlanetSpecAPI;
69import com.fs.starfarer.api.campaign.RepLevel;
70import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
71import com.fs.starfarer.api.campaign.ResourceCostPanelAPI;
72import com.fs.starfarer.api.campaign.SectorEntityToken;
73import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
74import com.fs.starfarer.api.campaign.StarSystemAPI;
75import com.fs.starfarer.api.campaign.SubmarketPlugin;
76import com.fs.starfarer.api.campaign.SubmarketPlugin.OnClickAction;
77import com.fs.starfarer.api.campaign.TextPanelAPI;
78import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
79import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
80import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
81import com.fs.starfarer.api.campaign.comm.CommMessageAPI.MessageClickAction;
82import com.fs.starfarer.api.campaign.econ.AbandonMarketPlugin;
83import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
84import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
85import com.fs.starfarer.api.campaign.econ.ImmigrationPlugin;
86import com.fs.starfarer.api.campaign.econ.Industry;
87import com.fs.starfarer.api.campaign.econ.MarketAPI;
88import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
89import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
90import com.fs.starfarer.api.campaign.econ.StabilizeMarketPlugin;
91import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
92import com.fs.starfarer.api.campaign.events.CampaignEventManagerAPI;
93import com.fs.starfarer.api.campaign.events.CampaignEventPlugin;
94import com.fs.starfarer.api.campaign.events.CampaignEventTarget;
95import com.fs.starfarer.api.campaign.rules.MemKeys;
96import com.fs.starfarer.api.campaign.rules.MemoryAPI;
97import com.fs.starfarer.api.characters.AbilityPlugin;
98import com.fs.starfarer.api.characters.MarketConditionSpecAPI;
99import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
100import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
101import com.fs.starfarer.api.characters.OfficerDataAPI;
102import com.fs.starfarer.api.characters.PersonAPI;
103import com.fs.starfarer.api.combat.CombatEngineAPI;
104import com.fs.starfarer.api.combat.CombatEntityAPI;
105import com.fs.starfarer.api.combat.DamageType;
106import com.fs.starfarer.api.combat.MissileAPI;
107import com.fs.starfarer.api.combat.MutableShipStatsAPI;
108import com.fs.starfarer.api.combat.ShipAPI;
109import com.fs.starfarer.api.combat.ShipAPI.HullSize;
110import com.fs.starfarer.api.combat.ShipCommand;
111import com.fs.starfarer.api.combat.ShipHullSpecAPI;
112import com.fs.starfarer.api.combat.ShipHullSpecAPI.ShipTypeHints;
113import com.fs.starfarer.api.combat.ShipVariantAPI;
114import com.fs.starfarer.api.combat.WeaponAPI;
115import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
116import com.fs.starfarer.api.combat.listeners.CombatListenerUtil;
117import com.fs.starfarer.api.fleet.FleetMemberAPI;
118import com.fs.starfarer.api.graphics.SpriteAPI;
119import com.fs.starfarer.api.impl.SharedUnlockData;
120import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
121import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
122import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
123import com.fs.starfarer.api.impl.campaign.DModManager;
124import com.fs.starfarer.api.impl.campaign.JumpPointInteractionDialogPluginImpl;
125import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
126import com.fs.starfarer.api.impl.campaign.WarningBeaconEntityPlugin;
127import com.fs.starfarer.api.impl.campaign.abilities.ReversePolarityToggle;
128import com.fs.starfarer.api.impl.campaign.econ.impl.ConstructionQueue.ConstructionQueueItem;
129import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
130import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality.QualityData;
131import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin.MarketFilter;
132import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
133import com.fs.starfarer.api.impl.campaign.ids.Conditions;
134import com.fs.starfarer.api.impl.campaign.ids.Difficulties;
135import com.fs.starfarer.api.impl.campaign.ids.Drops;
136import com.fs.starfarer.api.impl.campaign.ids.Entities;
137import com.fs.starfarer.api.impl.campaign.ids.Factions;
138import com.fs.starfarer.api.impl.campaign.ids.HullMods;
139import com.fs.starfarer.api.impl.campaign.ids.Industries;
140import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
141import com.fs.starfarer.api.impl.campaign.ids.Personalities;
142import com.fs.starfarer.api.impl.campaign.ids.Stats;
143import com.fs.starfarer.api.impl.campaign.ids.Strings;
144import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
145import com.fs.starfarer.api.impl.campaign.ids.Tags;
146import com.fs.starfarer.api.impl.campaign.ids.Terrain;
147import com.fs.starfarer.api.impl.campaign.intel.FactionCommissionIntel;
148import com.fs.starfarer.api.impl.campaign.intel.MessageIntel;
149import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
150import com.fs.starfarer.api.impl.campaign.plog.PlaythroughLog;
151import com.fs.starfarer.api.impl.campaign.plog.SModRecord;
152import com.fs.starfarer.api.impl.campaign.population.CoreImmigrationPluginImpl;
153import com.fs.starfarer.api.impl.campaign.procgen.ConditionGenDataSpec;
154import com.fs.starfarer.api.impl.campaign.procgen.DefenderDataOverride;
155import com.fs.starfarer.api.impl.campaign.procgen.PlanetConditionGenerator;
156import com.fs.starfarer.api.impl.campaign.procgen.PlanetGenDataSpec;
157import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
158import com.fs.starfarer.api.impl.campaign.procgen.StarAge;
159import com.fs.starfarer.api.impl.campaign.procgen.StarGenDataSpec;
160import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
161import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.OrbitGap;
162import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
163import com.fs.starfarer.api.impl.campaign.rulecmd.unsetAll;
164import com.fs.starfarer.api.impl.campaign.submarkets.BaseSubmarketPlugin;
165import com.fs.starfarer.api.impl.campaign.submarkets.StoragePlugin;
166import com.fs.starfarer.api.impl.campaign.terrain.AsteroidSource;
167import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain.TileParams;
168import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
169import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
170import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
171import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin;
172import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
173import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
174import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
175import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
176import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
177import com.fs.starfarer.api.impl.codex.CodexUnlocker;
178import com.fs.starfarer.api.loading.HullModSpecAPI;
179import com.fs.starfarer.api.loading.IndustrySpecAPI;
180import com.fs.starfarer.api.plugins.FactionPersonalityPickerPlugin;
181import com.fs.starfarer.api.plugins.SimulatorPlugin;
182import com.fs.starfarer.api.plugins.SurveyPlugin;
183import com.fs.starfarer.api.ui.Alignment;
184import com.fs.starfarer.api.ui.LabelAPI;
185import com.fs.starfarer.api.ui.TooltipMakerAPI;
192 public static String
SIR =
"Sir";
193 public static String
MAAM =
"Ma'am";
232 public static String
FULL =
"X";
237 public static String
STORY =
"story";
241 public static Random
random =
new Random();
243 public static enum TokenType {
249 public static final Vector2f
ZERO =
new Vector2f(0, 0);
251 public static class VarAndMemory {
255 public static class Token {
256 public String string;
257 public TokenType type;
258 public String varNameWithoutMemoryKeyIfKeyIsValid =
null;
259 public String varMemoryKey =
null;
260 public Token(String
string, TokenType type) {
261 this.string = string;
265 int index =
string.indexOf(
".");
266 if (index > 0 && index <
string.length() - 1) {
267 varMemoryKey =
string.substring(1, index);
268 varNameWithoutMemoryKeyIfKeyIsValid =
"$" +
string.substring(index + 1);
273 public VarAndMemory getVarNameAndMemory(Map<String, MemoryAPI> memoryMap) {
274 String varName = varNameWithoutMemoryKeyIfKeyIsValid;
275 MemoryAPI memory = memoryMap.get(varMemoryKey);
276 if (memory ==
null) {
278 memory = memoryMap.get(MemKeys.LOCAL);
280 if (memory ==
null) {
281 throw new RuleException(
"No memory found for keys: " + varMemoryKey +
", " + MemKeys.LOCAL);
284 VarAndMemory result =
new VarAndMemory();
285 result.name = varName;
286 result.memory = memory;
290 public String getStringWithTokenReplacement(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
291 String text = getString(memoryMap);
292 if (text ==
null)
return null;
293 text = Global.getSector().getRules().performTokenReplacement(ruleId, text, dialog.getInteractionTarget(), memoryMap);
302 public String getString(Map<String, MemoryAPI> memoryMap) {
303 String
string =
null;
305 VarAndMemory var = getVarNameAndMemory(memoryMap);
306 string = var.memory.getString(var.name);
308 string = this.string;
313 public Object getObject(Map<String, MemoryAPI> memoryMap) {
316 VarAndMemory var = getVarNameAndMemory(memoryMap);
317 o = var.memory.get(var.name);
322 public boolean getBoolean(Map<String, MemoryAPI> memoryMap) {
323 String str = getString(memoryMap);
324 return Boolean.parseBoolean(str);
327 public boolean isBoolean(Map<String, MemoryAPI> memoryMap) {
328 String str = getString(memoryMap);
329 return str.toLowerCase().equals(
"true") || str.toLowerCase().equals(
"false");
332 public boolean isFloat(Map<String, MemoryAPI> memoryMap) {
335 VarAndMemory var = getVarNameAndMemory(memoryMap);
336 str = var.memory.getString(var.name);
341 Float.parseFloat(str);
343 }
catch (NumberFormatException e) {
348 public float getFloat(Map<String, MemoryAPI> memoryMap) {
351 VarAndMemory var = getVarNameAndMemory(memoryMap);
352 result = var.memory.getFloat(var.name);
354 result = Float.parseFloat(
string);
359 public int getInt(Map<String, MemoryAPI> memoryMap) {
360 return (
int) Math.round(getFloat(memoryMap));
363 public Color getColor(Map<String, MemoryAPI> memoryMap) {
364 Object
object =
null;
366 VarAndMemory var = getVarNameAndMemory(memoryMap);
367 object = var.memory.get(var.name);
369 if (
object instanceof Color) {
370 return (Color) object;
373 String
string = getString(memoryMap);
375 String [] parts =
string.split(Pattern.quote(
","));
376 return new Color(Integer.parseInt(parts[0]),
377 Integer.parseInt(parts[1]),
378 Integer.parseInt(parts[2]),
379 Integer.parseInt(parts[3]));
380 }
catch (Exception e) {
381 if (
"bad".equals(
string)) {
382 string =
"textEnemyColor";
383 }
else if (
"good".equals(
string)) {
384 string =
"textFriendColor";
385 }
else if (
"highlight".equals(
string)) {
386 string =
"buttonShortcut";
387 }
else if (
"h".equals(
string)) {
388 string =
"buttonShortcut";
389 }
else if (
"story".equals(
string)) {
390 return Misc.getStoryOptionColor();
391 }
else if (
"gray".equals(
string)) {
392 return Misc.getGrayColor();
393 }
else if (
"grey".equals(
string)) {
394 return Misc.getGrayColor();
396 FactionAPI faction = Global.getSector().getFaction(
string);
397 if (faction !=
null) {
398 return faction.getBaseUIColor();
402 return Global.getSettings().getColor(
string);
406 public boolean isLiteral() {
407 return type == TokenType.LITERAL;
409 public boolean isVariable() {
410 return type == TokenType.VARIABLE;
412 public boolean isOperator() {
413 return type == TokenType.OPERATOR;
416 public String toString() {
418 return string +
" (" + type.name() +
", memkey: " + varMemoryKey +
", name: " + varNameWithoutMemoryKeyIfKeyIsValid +
")";
420 return string +
" (" + type.name() +
")";
425 public static List<Token>
tokenize(String
string) {
426 List<Token> result =
new ArrayList<Token>();
427 boolean inQuote =
false;
428 boolean inOperator =
false;
430 StringBuffer currToken =
new StringBuffer();
431 for (
int i = 0; i <
string.length(); i++) {
432 char curr =
string.charAt(i);
434 if (i + 1 <
string.length()) next =
string.charAt(i + 1);
435 boolean charEscaped =
false;
438 if (i >=
string.length()) {
439 throw new RuleException(
"Escape character at end of string in: [" +
string +
"]");
441 curr =
string.charAt(i);
442 if (i + 1 <
string.length()) next =
string.charAt(i + 1);
449 if (curr ==
'"' && !charEscaped) {
451 if (!inQuote && currToken.length() <= 0) {
452 result.add(
new Token(
"", TokenType.LITERAL));
453 }
else if (currToken.length() > 0) {
454 String str = currToken.toString();
456 result.add(
new Token(str, TokenType.LITERAL));
458 if (str.startsWith(
"$")) {
459 result.add(
new Token(str, TokenType.VARIABLE));
460 }
else if (inOperator) {
461 result.add(
new Token(str, TokenType.OPERATOR));
463 result.add(
new Token(str, TokenType.LITERAL));
468 currToken.delete(0, 1000000);
472 if (!inQuote && (curr ==
' ' || curr ==
'\t')) {
473 if (currToken.length() > 0) {
474 String str = currToken.toString();
475 if (str.startsWith(
"$")) {
476 result.add(
new Token(str, TokenType.VARIABLE));
477 }
else if (inOperator) {
478 result.add(
new Token(str, TokenType.OPERATOR));
480 result.add(
new Token(str, TokenType.LITERAL));
484 currToken.delete(0, 1000000);
488 if (!inQuote && !inOperator && isOperatorChar(curr) && (curr !=
'-' || !isDigit(next))) {
489 if (currToken.length() > 0) {
490 String str = currToken.toString();
491 if (str.startsWith(
"$")) {
492 result.add(
new Token(str, TokenType.VARIABLE));
494 result.add(
new Token(str, TokenType.LITERAL));
497 currToken.delete(0, 1000000);
499 if (charEscaped && curr ==
'n') {
500 currToken.append(
"\n");
502 currToken.append(curr);
507 if (!inQuote && inOperator && !isOperatorChar(curr)) {
508 if (currToken.length() > 0) {
509 String str = currToken.toString();
510 result.add(
new Token(str, TokenType.OPERATOR));
512 currToken.delete(0, 1000000);
514 if (charEscaped && curr ==
'n') {
515 currToken.append(
"\n");
517 currToken.append(curr);
522 if (charEscaped && curr ==
'n') {
523 currToken.append(
"\n");
525 currToken.append(curr);
530 throw new RuleException(
"Unmatched quotes in string: " +
string +
"]");
533 if (currToken.length() > 0) {
534 String str = currToken.toString();
535 if (str.startsWith(
"$")) {
536 result.add(
new Token(str, TokenType.VARIABLE));
537 }
else if (inOperator) {
538 result.add(
new Token(str, TokenType.OPERATOR));
540 result.add(
new Token(str, TokenType.LITERAL));
548 private static boolean isDigit(
char c) {
549 if (c == 0)
return false;
550 String digits =
"1234567890";
551 return digits.contains(
"" + c);
553 private static boolean isOperatorChar(
char c) {
554 String operatorChars =
"=<>!+-";
555 return operatorChars.contains(
"" + c);
560 if (str ==
null)
return "Null";
561 if (str.isEmpty())
return "";
562 return (
"" + str.charAt(0)).toUpperCase() + str.substring(1);
566 if (str ==
null)
return "Null";
567 if (str.isEmpty())
return "";
568 return (
"" + str.charAt(0)).toLowerCase() + str.substring(1);
573 List<String> keySet =
new ArrayList<String>(memoryMap.keySet());
578 for (String key : keySet) {
580 List<String> keys =
new ArrayList<String>(memory.
getKeys());
581 Collections.sort(keys,
new Comparator<String>() {
582 public int compare(String o1, String o2) {
583 return o2.length() - o1.length();
586 for (String token : keys) {
587 Object value = memory.
get(token);
588 if (value ==
null) value =
"null";
589 if (value instanceof String || value instanceof Boolean || value instanceof Float || value instanceof Integer) {
590 text = text.replaceAll(
"(?s)\\$" + Pattern.quote(key) +
"\\." + Pattern.quote(token.substring(1)), value.toString());
591 text = text.replaceAll(
"(?s)\\$" + Pattern.quote(token.substring(1)), value.toString());
607 private static Vector2f temp3 =
new Vector2f();
610 return (
float) Math.sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y));
615 return (v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y);
618 public static float getDistance(
float x1,
float y1,
float x2,
float y2) {
622 return (
float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
640 if (in <= 10)
return Math.max(1, (
int) in);
641 float pow = (int) Math.log10(in);
642 float div = (float) Math.pow(10, Math.max(0, pow - 1));
643 if (pow == 1) div = 10;
644 return (
int) Math.round(in / div) * div;
648 if (Math.abs((
float)Math.round(value) - value) < 0.0001f) {
650 return String.format(
"%d", (
int) Math.round(value));
654 }
else if ((
int) Math.round((value * 100f)) == (
int) Math.round((value * 10f)) * 10) {
655 return (value > 10 || value < -10) ?
"" + (int) Math.round(value) : String.format(
"%.1f", value);
657 return (value > 10 || value < -10) ?
"" + (int) Math.round(value) : String.format(
"%.2f", value);
662 if (Math.abs((
float)Math.round(value) - value) < 0.0001f) {
663 return (
int) Math.round(value);
664 }
else if ((
int) Math.round((value * 100f)) == (
int) Math.round((value * 10f)) * 10) {
665 return (value > 10 || value < -10) ? (int) Math.round(value) :
666 (Math.round(value * 10f) / 10f);
668 return (value > 10 || value < -10) ? (int) Math.round(value) :
669 (Math.round(value * 100f) / 100f);
674 if (Math.abs((
float)Math.round(value) - value) < 0.0001f) {
675 return String.format(
"%d", (
int) Math.round(value));
676 }
else if ((
int) Math.round((value * 100f)) == (
int) Math.round((value * 10f)) * 10) {
677 return (value >= 10 || value <= -10) ?
"" + (int) Math.round(value) : String.format(
"%.1f", value);
679 return (value >= 10 || value <= -10) ?
"" + (int) Math.round(value) : String.format(
"%.1f", value);
684 if (Math.abs((
float)Math.round(value) - value) < 0.0001f) {
685 return String.format(
"%d", (
int) Math.round(value));
687 return String.format(
"%.1f", value);
694 return (
float) (Math.log(num) / Math.log(base));
698 float angle = (float) ((
float) Math.random() * Math.PI * 2f);
699 float x = (float) (Math.cos(angle) * r) + from.x;
700 float y = (float) (Math.sin(angle) * r) + from.y;
701 return new Vector2f(x, y);
705 float angle = (float) (
random.nextFloat() * Math.PI * 2f);
706 float x = (float) (Math.cos(angle) * r) + from.x;
707 float y = (float) (Math.sin(angle) * r) + from.y;
708 return new Vector2f(x, y);
715 r = r *
random.nextFloat();
716 float angle = (float) (
random.nextFloat() * Math.PI * 2f);
717 float x = (float) (Math.cos(angle) * r) + from.x;
718 float y = (float) (Math.sin(angle) * r) + from.y;
719 return new Vector2f(x, y);
723 r = (float) (r * Math.sqrt(
random.nextFloat()));
724 float angle = (float) (
random.nextFloat() * Math.PI * 2f);
725 float x = (float) (Math.cos(angle) * r) + from.x;
726 float y = (float) (Math.sin(angle) * r) + from.y;
727 return new Vector2f(x, y);
731 float r = (float) (minR + (maxR - minR) * Math.sqrt(
random.nextFloat()));
732 float angle = (float) (
random.nextFloat() * Math.PI * 2f);
733 float x = (float) (Math.cos(angle) * r) + from.x;
734 float y = (float) (Math.sin(angle) * r) + from.y;
735 return new Vector2f(x, y);
742 before += member.getFleetPointCost();
749 List<FleetMemberAPI> lost =
new ArrayList<FleetMemberAPI>();
752 if (!curr.contains(member)) {
765 event = manager.
startEvent(eventTarget, eventId, params);
804 return new Color(0, 100, 255);
817 return new Color(155,155,155,255);
868 return new IntervalUtil(interval * 0.75f, interval * 1.25f);
879 public static String
getJoined(String joiner, List<String> strings) {
880 return getJoined(joiner, strings.toArray(
new String [0]));
882 public static String
getJoined(String joiner, String ... strings) {
883 if (strings.length == 1)
return strings[0];
886 for (
int i = 0; i < strings.length - 1; i++) {
887 result += strings[i] +
", ";
889 if (!result.isEmpty()) {
890 result = result.substring(0, result.length() - 2);
892 if (strings.length > 2) {
893 if (joiner.isEmpty()) {
894 result +=
", " + strings[strings.length - 1];
896 result +=
", " + joiner +
" " + strings[strings.length - 1];
898 }
else if (strings.length == 2) {
899 if (joiner.isEmpty()) {
900 result +=
", " + strings[strings.length - 1];
902 result +=
" " + joiner +
" " + strings[strings.length - 1];
908 public static interface FleetFilter {
913 List<CampaignFleetAPI> result =
new ArrayList<CampaignFleetAPI>();
915 if (fleet == from)
continue;
917 if (dist > maxRange)
continue;
919 if (filter ==
null || filter.accept(fleet)) {
927 List<CampaignFleetAPI> result =
new ArrayList<CampaignFleetAPI>(system.
getFleets());
929 if (!fleet.isInOrNearSystem(system))
continue;
937 List<MarketAPI> result =
new ArrayList<MarketAPI>();
939 if (curr.getFactionId().equals(factionId)) {
950 int size = curr.getSize();
951 if (size > max || (size == max && curr.getFaction().isPlayerFaction())) {
961 if (location ==
null)
return new ArrayList<MarketAPI>();
972 List<MarketAPI> result =
new ArrayList<MarketAPI>();
974 if (market.getFaction() == faction) {
982 List<MarketAPI> result =
new ArrayList<MarketAPI>();
984 if (market.getFaction() == player) {
986 }
else if (includeNonPlayerFaction && market.isPlayerOwned()) {
998 List<StarSystemAPI> systems =
new ArrayList<StarSystemAPI>();
1001 if (system !=
null && !systems.contains(system)) {
1002 systems.add(system);
1013 List<MarketAPI> result =
new ArrayList<MarketAPI>();
1015 if (market.getFaction() == faction) {
1023 List<MarketAPI> result =
new ArrayList<MarketAPI>();
1025 float dist =
getDistanceLY(market.getLocationInHyperspace(), locInHyper);
1026 if (dist > distLY)
continue;
1033 int hostileMarketsNearPoint = 0;
1037 if (dist > maxDist)
continue;
1038 if (market.getFaction() !=
null && market.getFaction().isHostileTo(faction)) {
1039 hostileMarketsNearPoint ++;
1042 return hostileMarketsNearPoint;
1046 List<StarSystemAPI> result =
new ArrayList<StarSystemAPI>();
1050 if (dist > maxRangeLY)
continue;
1062 float minDist = Float.MAX_VALUE;
1065 if (dist > maxRangeLY)
continue;
1066 if (dist < minDist) {
1080 float minDist = Float.MAX_VALUE;
1084 if (dist < minDist) {
1105 if (initialTrigger !=
null) {
1116 float angle = (float) Math.atan2(v.y, v.x) *
DEG_PER_RAD;
1121 float dx = to.x - from.x;
1122 float dy = to.y - from.y;
1123 float angle = (float) Math.atan2(dy, dx) *
DEG_PER_RAD;
1135 if (v.lengthSquared() > Float.MIN_VALUE) {
1136 return (Vector2f)v.normalise();
1139 return new Vector2f(1, 0);
1143 return (angleDeg % 360f + 360f) % 360f;
1148 float distToLocalMarket = Float.MAX_VALUE;
1151 if (filter !=
null && !filter.acceptMarket(market))
continue;
1153 if (market.getPrimaryEntity() ==
null)
continue;
1157 if (currDist > maxDist)
continue;
1158 if (currDist < distToLocalMarket) {
1159 distToLocalMarket = currDist;
1167 List<MarketAPI> result =
new ArrayList<MarketAPI>();
1170 if (filter !=
null && !filter.acceptMarket(market))
continue;
1171 if (market.getPrimaryEntity() ==
null)
continue;
1175 if (currDist > maxDist)
continue;
1185 public boolean acceptMarket(
MarketAPI curr) {
1197 Vector2f result =
new Vector2f();
1199 result.x = (float)Math.cos(radians);
1200 result.y = (float)Math.sin(radians);
1206 float cos = (float) Math.cos(angle *
RAD_PER_DEG);
1207 float sin = (float) Math.sin(angle *
RAD_PER_DEG);
1208 Vector2f r =
new Vector2f();
1209 r.x = v.x * cos - v.y * sin;
1210 r.y = v.x * sin + v.y * cos;
1215 float cos = (float) Math.cos(angle *
RAD_PER_DEG);
1216 float sin = (float) Math.sin(angle *
RAD_PER_DEG);
1217 Vector2f r = Vector2f.sub(v, origin,
new Vector2f());
1218 Vector2f r2 =
new Vector2f();
1219 r2.x = r.x * cos - r.y * sin;
1220 r2.y = r.x * sin + r.y * cos;
1221 Vector2f.add(r2, origin, r2);
1232 public static boolean isBetween(
float one,
float two,
float check) {
1238 if (check >= one && check <= two)
return true;
1241 if (check <= two)
return true;
1242 if (check >= one)
return true;
1248 float shielded = 0f;
1250 if (member.isMothballed())
continue;
1252 shielded += member.getCargoCapacity();
1256 if (max < 1)
return 0f;
1257 return shielded / max;
1262 float red = (float)from.getRed() + ((float)to.getRed() - (
float)from.getRed()) * progress;
1263 float green = (float)from.getGreen() + ((float)to.getGreen() - (
float)from.getGreen()) * progress;
1264 float blue = (float)from.getBlue() + ((float)to.getBlue() - (
float)from.getBlue()) * progress;
1265 float alpha = (float)from.getAlpha() + ((float)to.getAlpha() - (
float)from.getAlpha()) * progress;
1266 red = Math.round(red);
1267 green = Math.round(green);
1268 blue = Math.round(blue);
1269 alpha = Math.round(alpha);
1270 return new Color((
int)red, (
int)green, (
int)blue, (
int)alpha);
1274 Color color =
new Color((
int) (min.getRed() + (max.getRed() - min.getRed()) *
random.nextDouble()),
1275 (
int) (min.getGreen() + (max.getGreen() - min.getGreen()) *
random.nextDouble()),
1276 (
int) (min.getBlue() + (max.getBlue() - min.getBlue()) *
random.nextDouble()),
1283 Vector2f v =
new Vector2f(from);
1285 v.x += (to.x - from.x) * progress;
1286 v.y += (to.y - from.y) * progress;
1291 public static float interpolate(
float from,
float to,
float progress) {
1292 to = from + (to - from) * progress;
1297 return new Color((
int) (color.getRed() * factor),
1298 (
int) (color.getGreen() * factor),
1299 (
int) (color.getBlue() * factor),
1300 (
int) (color.getAlpha() * factor));
1303 return new Color((
int) (color.getRed() * factor),
1304 (
int) (color.getGreen() * factor),
1305 (
int) (color.getBlue() * factor),
1306 (
int) (color.getAlpha()));
1310 return new Color((
int) (color.getRed() * 1f),
1311 (
int) (color.getGreen() * 1f),
1312 (
int) (color.getBlue() * 1f),
1313 (
int) (color.getAlpha() * factor));
1317 if (alpha < 0) alpha = 0;
1318 if (alpha > 255) alpha = 255;
1319 return new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha);
1342 Map<String, MemoryAPI> memoryMap =
new HashMap<String, MemoryAPI>();
1343 memoryMap.put(memKey, memory);
1356 Vector2f dir = Vector2f.sub(p1, p2,
new Vector2f());
1359 Vector2f relVel = Vector2f.sub(v2, v1,
new Vector2f());
1360 float closingSpeed = Vector2f.dot(dir, relVel);
1361 return closingSpeed;
1365 protected static DecimalFormat
format =
null;
1368 DecimalFormatSymbols symbols =
new DecimalFormatSymbols(Locale.getDefault());
1371 format =
new DecimalFormat(
"###,###,###,###,###", symbols);
1398 if (dist <= 0)
return new Vector2f(to.
getLocation());
1401 if (closingSpeed <= 10)
return new Vector2f(to.
getLocation());
1406 float dot = Vector2f.dot(toTarget, vel);
1407 if (dot < 0)
return new Vector2f(to.
getLocation());
1411 float time = dist / closingSpeed;
1440 String requiredKey = flagKey +
"_" + reason;
1443 memory.
set(flagKey,
true);
1444 memory.
set(requiredKey, value, expire);
1447 memory.
unset(requiredKey);
1454 String requiredKey = flagKey +
"_" + reason;
1489 String flag = MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE +
"_" + factionId;
1500 String flag = MemFlags.MEMORY_KEY_MAKE_HOSTILE +
"_" + factionId;
1516 String flag = MemFlags.MEMORY_KEY_MAKE_HOSTILE +
"_" + factionId;
1532 }
else if (days <= 6f) {
1533 return (
int)Math.ceil(days) +
" days ago";
1534 }
else if (days <= 7) {
1535 return "1 week ago";
1536 }
else if (days <= 14) {
1537 return "2 weeks ago";
1538 }
else if (days <= 21) {
1539 return "3 weeks ago";
1540 }
else if (days <= 30 + 14) {
1541 return "1 month ago";
1542 }
else if (days < 30 * 2 + 14) {
1543 return "2 months ago";
1544 }
else if (days < 30 * 3 + 14) {
1545 return "3 months ago";
1547 return "Over 3 months ago";
1556 return "0 days ago";
1557 }
else if (days == 1) {
1559 }
else if (days <= 6) {
1560 return (
int)Math.ceil(days) +
" days ago";
1561 }
else if (days <= 7) {
1562 return "1 week ago";
1563 }
else if (days <= 14) {
1564 return "2 weeks ago";
1565 }
else if (days <= 21) {
1566 return "3 weeks ago";
1568 int months = days / 30;
1571 return "1 month ago";
1573 return "" + months +
" months ago";
1576 int years = months / 12;
1578 return "1 cycle ago";
1580 return "" + years +
" cycles ago";
1588 return "at least a day";
1589 }
else if (days <= 6f) {
1590 return "at least a few days";
1591 }
else if (days <= 7 + 6) {
1592 return "at least a week";
1593 }
else if (days <= 14 + 6) {
1594 return "at least two weeks";
1595 }
else if (days <= 21 + 8) {
1596 return "at least three weeks";
1597 }
else if (days <= 30 + 29) {
1598 return "at least a month";
1599 }
else if (days < 30 * 2 + 29) {
1600 return "at least two months";
1601 }
else if (days < 30 * 3 + 29) {
1602 return "at least three months";
1604 return "many months";
1611 }
else if (days <= 6f) {
1612 return "a few days";
1613 }
else if (days <= 7 + 6) {
1615 }
else if (days <= 14 + 6) {
1617 }
else if (days <= 21 + 8) {
1618 return "three weeks";
1619 }
else if (days <= 30 + 29) {
1621 }
else if (days < 30 * 2 + 29) {
1622 return "two months";
1623 }
else if (days < 30 * 3 + 29) {
1624 return "three months";
1626 return "many months";
1658 return Math.round(currBurn);
1692 return speed * perLY;
1709 private static Vector3f temp4 =
new Vector3f();
1713 return Vector3f.sub(v1, v2, temp4).length();
1718 if (diff > 180)
return 360 - diff;
1722 public static boolean isInArc(
float direction,
float arc, Vector2f from, Vector2f to) {
1724 if (arc >= 360)
return true;
1725 if (direction < 0) direction = 360 + direction;
1726 Vector2f towardsTo =
new Vector2f(to.x - from.x, to.y - from.y);
1727 if (towardsTo.lengthSquared() == 0)
return false;
1729 if (dir < 0) dir = 360 + dir;
1730 float arcFrom = direction - arc/2f;
1731 if (arcFrom < 0) arcFrom = 360 + arcFrom;
1732 if (arcFrom > 360) arcFrom -= 360;
1733 float arcTo = direction + arc/2f;
1734 if (arcTo < 0) arcTo = 360 + arcTo;
1735 if (arcTo > 360) arcTo -= 360;
1737 if (dir >= arcFrom && dir <= arcTo)
return true;
1738 if (dir >= arcFrom && arcFrom > arcTo)
return true;
1739 if (dir <= arcTo && arcFrom > arcTo)
return true;
1743 public static boolean isInArc(
float direction,
float arc,
float test) {
1746 if (arc >= 360)
return true;
1747 if (direction < 0) direction = 360 + direction;
1749 if (dir < 0) dir = 360 + dir;
1750 float arcFrom = direction - arc/2f;
1751 if (arcFrom < 0) arcFrom = 360 + arcFrom;
1752 if (arcFrom > 360) arcFrom -= 360;
1753 float arcTo = direction + arc/2f;
1754 if (arcTo < 0) arcTo = 360 + arcTo;
1755 if (arcTo > 360) arcTo -= 360;
1757 if (dir >= arcFrom && dir <= arcTo)
return true;
1758 if (dir >= arcFrom && arcFrom > arcTo)
return true;
1759 if (dir <= arcTo && arcFrom > arcTo)
return true;
1765 String category, String key,
int tilesWide,
int tilesHigh,
StarAge age) {
1771 String category, String key,
int tilesWide,
int tilesHigh,
1772 String terrainType,
StarAge age) {
1774 BufferedImage img =
null;
1778 int chunkSize = 10000;
1779 int w = img.getWidth();
1780 int h = img.getHeight();
1781 Raster data = img.getData();
1782 for (
int i = 0; i < w; i += chunkSize) {
1783 for (
int j = 0; j < h; j += chunkSize) {
1785 int chunkWidth = chunkSize;
1786 if (i + chunkSize > w) chunkWidth = w - i;
1787 int chunkHeight = chunkSize;
1788 if (j + chunkSize > h) chunkHeight = h - i;
1803 StringBuilder
string =
new StringBuilder();
1804 for (
int y = j + chunkHeight - 1; y >= j; y--) {
1805 for (
int x = i; x < i + chunkWidth; x++) {
1806 int [] pixel = data.getPixel(x, h - y - 1, (
int [])
null);
1807 int total = pixel[0] + pixel[1] + pixel[2];
1817 float x = centerX - tileSize * (float) w / 2f + (
float) i * tileSize + chunkWidth / 2f * tileSize;
1818 float y = centerY - tileSize * (float) h / 2f + (
float) j * tileSize + chunkHeight / 2f * tileSize;
1821 chunkWidth, chunkHeight,
1822 category, key, tilesWide, tilesHigh,
null));
1836 }
catch (IOException e) {
1837 throw new RuntimeException(e);
1842 public static void renderQuad(
float x,
float y,
float width,
float height, Color color,
float alphaMult) {
1843 GL11.glColor4ub((
byte)color.getRed(),
1844 (
byte)color.getGreen(),
1845 (
byte)color.getBlue(),
1846 (
byte)((
float)color.getAlpha() * alphaMult));
1848 GL11.glBegin(GL11.GL_QUADS);
1850 GL11.glVertex2f(x, y);
1851 GL11.glVertex2f(x, y + height);
1852 GL11.glVertex2f(x + width, y + height);
1853 GL11.glVertex2f(x + width, y);
1866 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1867 float denom = Vector2f.sub(p2, p1,
new Vector2f()).length();
1871 Vector2f i =
new Vector2f();
1872 i.x = p1.x + u * (p2.x - p1.x);
1873 i.y = p1.y + u * (p2.y - p1.y);
1874 return Vector2f.sub(i, p3,
new Vector2f()).length();
1878 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1879 float denom = Vector2f.sub(p2, p1,
new Vector2f()).length();
1881 if (denom == 0)
return p1;
1883 Vector2f i =
new Vector2f();
1884 i.x = p1.x + u * (p2.x - p1.x);
1885 i.y = p1.y + u * (p2.y - p1.y);
1890 float u = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
1891 float denom = Vector2f.sub(p2, p1,
new Vector2f()).length();
1900 Vector2f i =
new Vector2f();
1901 i.x = p1.x + u * (p2.x - p1.x);
1902 i.y = p1.y + u * (p2.y - p1.y);
1907 Vector2f p2 =
new Vector2f(p1);
1910 for (
int i = 0; i < 2; i++) {
1911 for (
int j = 0; j < bounds.size() - 1; j++) {
1912 Vector2f s1 = bounds.get(j);
1913 Vector2f s2 = bounds.get(j + 1);
1916 if (Math.abs(p.x - s1.x) < 0.001f &&
1917 Math.abs(p.y - s1.y) < 0.001f) {
1926 if (i == 0 && count % 2 == 1) {
1933 return count % 2 == 1;
1937 float denom = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
1938 float numUa = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);
1939 float numUb = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);
1941 if (denom == 0 && !(numUa == 0 && numUb == 0)) {
1945 if (denom == 0 && numUa == 0 && numUb == 0) {
1946 float minX, minY, maxX, maxY;
1963 if (b1.x >= minX && b1.x <= maxX && b1.y >= minY && b1.y <= maxY) {
1964 return new Vector2f(b1);
1965 }
else if (b2.x >= minX && b2.x <= maxX && b2.y >= minY && b2.y <= maxY) {
1966 return new Vector2f(b2);
1972 float Ua = numUa / denom;
1973 float Ub = numUb / denom;
1974 if (Ua >=0 && Ua <= 1 && Ub >= 0 && Ub <= 1) {
1975 Vector2f result =
new Vector2f();
1983 result.x = a1.x + Ua * (a2.x - a1.x);
1984 result.y = a1.y + Ua * (a2.y - a1.y);
1994 public static Vector2f
intersectLines(Vector2f a1, Vector2f a2, Vector2f b1, Vector2f b2) {
1995 float denom = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
1996 float numUa = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);
1997 float numUb = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);
1999 if (denom == 0 && !(numUa == 0 && numUb == 0)) {
2003 if (denom == 0 && numUa == 0 && numUb == 0) {
2004 return new Vector2f(a1);
2007 float Ua = numUa / denom;
2008 float Ub = numUb / denom;
2009 Vector2f result =
new Vector2f();
2010 result.x = a1.x + Ua * (a2.x - a1.x);
2011 result.y = a1.y + Ua * (a2.y - a1.y);
2028 float uNom = (p3.x - p1.x) * (p2.x - p1.x) + (p3.y - p1.y) * (p2.y - p1.y);
2029 float uDenom = (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
2031 Vector2f closest =
new Vector2f();
2035 float u = uNom / uDenom;
2036 closest.x = p1.x + u * (p2.x - p1.x);
2037 closest.y = p1.y + u * (p2.y - p1.y);
2040 float distSq = (closest.x - p3.x) * (closest.x - p3.x) + (closest.y - p3.y) * (closest.y - p3.y);
2041 if (distSq > r * r) {
2044 }
else if (uDenom == 0) {
2048 float a = (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
2049 float b = 2f * ( (p2.x - p1.x) * (p1.x - p3.x) + (p2.y - p1.y) *
2051 float c = p3.x * p3.x + p3.y * p3.y + p1.x * p1.x + p1.y * p1.y - 2f
2052 * (p3.x * p1.x + p3.y * p1.y) - r * r;
2054 float bb4ac = b * b - 4f * a * c;
2056 if (bb4ac < 0)
return null;
2058 float mu1 = (-b + (float) Math.sqrt(bb4ac)) / (2 * a);
2059 float mu2 = (-b - (float) Math.sqrt(bb4ac)) / (2 * a);
2062 if ((mu2 < minMu && mu2 >= 0) || minMu < 0) minMu = mu2;
2064 if (minMu < 0 || minMu > 1) {
2065 float p2DistSq = (p2.x - p3.x) * (p2.x - p3.x) + (p2.y - p3.y) * (p2.y - p3.y);
2066 if (p2DistSq <= r * r)
return p2;
2071 Vector2f result =
new Vector2f();
2072 result.x = p1.x + minMu * (p2.x - p1.x);
2073 result.y = p1.y + minMu * (p2.y - p1.y);
2080 float denom = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
2081 float numUa = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);
2082 float numUb = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) *(a1.x - b1.x);
2084 if (denom == 0 && !(numUa == 0 && numUb == 0)) {
2088 if (denom == 0 && numUa == 0 && numUb == 0) {
2096 Vector2f perp =
new Vector2f();
2104 if (diff < 0) diff += 360;
2106 if (diff == 0 || diff == 360f) {
2108 }
else if (diff > 180) {
2130 if (diff < 0) diff += 360;
2132 if (diff == 0 || diff == 360f) {
2134 }
else if (diff > 180) {
2156 public static Vector2f
getDiff(Vector2f v1, Vector2f v2)
2159 return Vector2f.sub(v1, v2,
new Vector2f());
2164 if (
id ==
null)
return null;
2171 if (
id ==
null)
return null;
2189 float f = (1f - Math.min(1f, distLY/range));
2190 return min + (1f - min) * f * f;
2200 if (dist > minDist + r) {
2205 v.scale(minDist + 2000 - dist);
2206 Vector2f.add(v, from, v);
2217 if (dist > minDist + r) {
2222 v.scale(minDist + 2000 - dist);
2223 Vector2f.add(v, from, v);
2231 public static void wiggle(Vector2f v,
float max) {
2232 v.x += (max * 2f * ((float) Math.random() - 0.5f));
2233 v.y += (max * 2f * ((float) Math.random() - 0.5f));
2234 if (v.length() == 0 || v.lengthSquared() == 0) {
2318 if (hyper !=
null) {
2335 if (plugin ==
null)
return 0f;
2341 if (plugin ==
null)
return new ArrayList<StarSystemAPI>();
2361 if (planet.isStar() && planet.getSpec() !=
null && planet.getSpec().isBlackHole()) {
2363 if (dist < planet.getRadius() + fleet.
getRadius()) {
2365 }
else if (includeEventHorizon) {
2378 if (star ==
null)
return null;
2412 return system !=
null && system.
hasPulsar();
2447 boolean caresAboutTransponder =
true;
2449 caresAboutTransponder =
false;
2453 caresAboutTransponder =
false;
2457 caresAboutTransponder =
false;
2462 caresAboutTransponder =
false;
2465 if (caresAboutTransponder && source !=
null && source.
getPrimaryEntity() !=
null) {
2468 caresAboutTransponder =
false;
2489 return caresAboutTransponder;
2493 public static interface FindShipFilter {
2494 public boolean matches(
ShipAPI ship);
2498 return findClosestShipEnemyOf(ship, locFromForSorting, smallestToNote, maxRange, considerShipRadius,
null);
2502 List<ShipAPI> ships = engine.
getShips();
2503 float minDist = Float.MAX_VALUE;
2506 if (other.getHullSize().ordinal() < smallestToNote.ordinal())
continue;
2507 if (other.isShuttlePod())
continue;
2508 if (other.isHulk())
continue;
2509 if (ship.
getOwner() != other.getOwner() && other.getOwner() != 100) {
2510 if (filter !=
null && !filter.matches(other))
continue;
2513 float distSort =
getDistance(locFromForSorting, other.getLocation());
2515 if (!considerShipRadius) radSum = 0;
2516 if (dist > maxRange + radSum)
continue;
2517 if (distSort < minDist) {
2526 public static ShipAPI findClosestShipTo(
ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote,
float maxRange,
boolean considerShipRadius,
boolean allowHulks, FindShipFilter filter) {
2528 List<ShipAPI> ships = engine.
getShips();
2529 float minDist = Float.MAX_VALUE;
2532 if (other == ship)
continue;
2533 if (other.getHullSize().ordinal() < smallestToNote.ordinal())
continue;
2534 if (other.isShuttlePod())
continue;
2535 if (other.isHulk())
continue;
2536 if (allowHulks || other.getOwner() != 100) {
2537 if (filter !=
null && !filter.matches(other))
continue;
2540 float distSort =
getDistance(locFromForSorting, other.getLocation());
2542 if (!considerShipRadius) radSum = 0;
2543 if (dist > maxRange + radSum)
continue;
2544 if (distSort < minDist) {
2554 public static <T extends Enum<T>> T
mapToEnum(JSONObject json, String key, Class<T> enumType, T defaultOption)
throws JSONException {
2555 return mapToEnum(json, key, enumType, defaultOption,
true);
2557 public static <T extends Enum<T>> T
mapToEnum(JSONObject json, String key, Class<T> enumType, T defaultOption,
boolean required)
throws JSONException {
2558 String val = json.optString(key);
2559 if (val ==
null || val.equals(
"")) {
2560 if (defaultOption ==
null && required) {
2561 throw new RuntimeException(
"Key [" + key +
"] is required");
2563 return defaultOption;
2566 return (T) Enum.valueOf(enumType, val);
2567 }
catch (IllegalArgumentException e) {
2568 throw new RuntimeException(
"Key [" + key +
"] has invalid value [" + val +
"] in [" + json.toString() +
"]");
2572 public static Color
getColor(JSONObject json, String key)
throws JSONException {
2573 if (!json.has(key))
return Color.white;
2574 JSONArray arr = json.getJSONArray(key);
2575 return new Color(arr.getInt(0), arr.getInt(1), arr.getInt(2), arr.getInt(3));
2578 public static Color
optColor(JSONObject json, String key, Color defaultValue)
throws JSONException {
2579 if (!json.has(key))
return defaultValue;
2580 JSONArray arr = json.getJSONArray(key);
2581 return new Color(arr.getInt(0), arr.getInt(1), arr.getInt(2), arr.getInt(3));
2584 public static Vector2f
getVector(JSONObject json, String arrayKey, Vector2f def)
throws JSONException {
2585 if (!json.has(arrayKey))
return def;
2588 public static Vector2f
getVector(JSONObject json, String arrayKey)
throws JSONException {
2589 Vector2f v =
new Vector2f();
2590 JSONArray arr = json.getJSONArray(arrayKey);
2591 v.set((
float) arr.getDouble(0), (
float) arr.getDouble(1));
2595 public static Vector3f
getVector3f(JSONObject json, String arrayKey)
throws JSONException {
2596 Vector3f v =
new Vector3f();
2597 JSONArray arr = json.getJSONArray(arrayKey);
2598 v.set((
float) arr.getDouble(0), (
float) arr.getDouble(1), (
float) arr.getDouble(1));
2602 public static Vector2f
optVector(JSONObject json, String arrayKey) {
2603 Vector2f v =
new Vector2f();
2604 JSONArray arr = json.optJSONArray(arrayKey);
2605 if (arr ==
null)
return null;
2606 v.set((
float) arr.optDouble(0), (
float) arr.optDouble(1));
2610 public static Vector3f
optVector3f(JSONObject json, String arrayKey)
throws JSONException {
2611 Vector3f v =
new Vector3f();
2612 JSONArray arr = json.optJSONArray(arrayKey);
2613 if (arr ==
null)
return new Vector3f();
2614 v.set((
float) arr.getDouble(0), (
float) arr.getDouble(1), (
float) arr.getDouble(2));
2618 public static Vector2f
getVector(JSONObject json, String arrayKey,
int index)
throws JSONException {
2619 Vector2f v =
new Vector2f();
2620 JSONArray arr = json.getJSONArray(arrayKey);
2621 v.set((
float) arr.getDouble(index * 2 + 0), (
float) arr.getDouble(index * 2 + 1));
2628 for (
int i = 0; i < noise.length; i++) {
2629 for (
int j = 0; j < noise[0].length; j++) {
2630 if (noise[i][j] != -1) {
2631 if (noise[i][j] > maxNoise)
2632 maxNoise = noise[i][j];
2633 if (noise[i][j] < minNoise)
2634 minNoise = noise[i][j];
2639 if (minNoise >= maxNoise)
return;
2641 float range = maxNoise - minNoise;
2643 for (
int i = 0; i < noise.length; i++) {
2644 for (
int j = 0; j < noise[0].length; j++) {
2645 if (noise[i][j] != -1) {
2646 float newNoise = (noise[i][j] - minNoise) / range;
2647 noise[i][j] = newNoise;
2650 noise[i][j] = noise[i - 1][j];
2651 else if (i < noise.length - 1)
2652 noise[i][j] = noise[i + 1][j];
2662 float [][] noise =
new float [w][h];
2663 for (
int i = 0; i < noise.length; i++) {
2664 for (
int j = 0; j < noise[0].length; j++) {
2668 noise[0][0] =
random.nextFloat() * spikes;
2669 noise[0][noise[0].length - 1] =
random.nextFloat() * spikes;
2670 noise[noise.length - 1][0] =
random.nextFloat() * spikes;
2671 noise[noise.length - 1][noise[0].length - 1] =
random.nextFloat() * spikes;
2676 int x2,
int y2,
int iter,
float spikes) {
2677 if (x1 + 1 >= x2 || y1 + 1 >= y2)
return;
2679 int midX = (x1 + x2) / 2;
2680 int midY = (y1 + y2) / 2;
2682 fill(
random, noise, midX, y1, x1, y1, x2, y1, iter, spikes);
2683 fill(
random, noise, midX, y2, x1, y2, x2, y2, iter, spikes);
2684 fill(
random, noise, x1, midY, x1, y1, x1, y2, iter, spikes);
2685 fill(
random, noise, x2, midY, x2, y1, x2, y2, iter, spikes);
2688 fill(
random, noise, midX, midY, midX, y1, midX, y2, iter, spikes);
2689 float midValue1 = noise[midX][midY];
2690 fill(
random, noise, midX, midY, x1, midY, x2, midY, iter, spikes);
2691 float midValue2 = noise[midX][midY];
2692 noise[midX][midY] = (midValue1 + midValue2)/2f;
2700 private static void fill(Random
random,
float[][] noise,
int x,
int y,
int x1,
int y1,
2701 int x2,
int y2,
int iter,
float spikes) {
2702 if (noise[x][y] == -1) {
2703 float avg = (noise[x1][y1] + noise[x2][y2]) / 2f;
2704 noise[x][y] = avg + ((float) Math.pow(spikes, (iter)) * (
float) (
random.nextFloat() - .5));
2710 if (range <= 1)
return 180f;
2711 return (2f * radius) / (2f * (float) Math.PI * range) * 360f;
2715 float rad = (float) Math.toRadians(angle);
2719 public static float approach(
float curr,
float dest,
float minSpeed,
float diffSpeedMult,
float amount) {
2720 float diff = dest - curr;
2721 float delta = (Math.signum(diff) * minSpeed + (diff * diffSpeedMult)) * amount;
2723 if (Math.abs(delta) > Math.abs(diff)) delta = diff;
2724 return curr + delta;
2728 public static Map<Class, Method>
cleanCache =
new LinkedHashMap<>();
2733 Method cleanerMethod =
cleanerCache.get(toBeDestroyed.getClass());
2734 if (cleanerMethod ==
null) {
2735 cleanerMethod = toBeDestroyed.getClass().getMethod(
"cleaner");
2736 if (cleanerMethod !=
null) {
2737 cleanerMethod.setAccessible(
true);
2738 cleanerCache.put(toBeDestroyed.getClass(), cleanerMethod);
2741 if (cleanerMethod !=
null) {
2742 Object cleaner = cleanerMethod.invoke(toBeDestroyed);
2743 if (cleaner !=
null) {
2744 Method cleanMethod =
cleanCache.get(cleaner.getClass());
2745 if (cleanMethod ==
null) {
2746 cleanMethod = cleaner.getClass().getMethod(
"clean");
2747 if (cleanMethod !=
null) {
2748 cleanMethod.setAccessible(
true);
2749 cleanCache.put(cleaner.getClass(), cleanMethod);
2752 if (cleanMethod !=
null) {
2753 cleanMethod.invoke(cleaner);
2764 }
catch (Exception e) {
2773 if (member.isMothballed())
continue;
2774 total += member.getStats().getDynamic().getValue(dynamicMemberStatId);
2785 if (member.isMothballed())
continue;
2789 total += member.getStats().getDynamic().getValue(dynamicMemberStatId, base);
2799 if (system.
getStar() !=
null) {
2806 starId = parent.
getId();
2811 starId = parent.
getId();
2830 SurveyLevel minLevel = SurveyLevel.FULL;
2831 boolean empty =
true;
2833 if (planet.isStar())
continue;
2835 if (market ==
null)
continue;
2839 if (level.ordinal() < minLevel.ordinal()) {
2857 if (planet.isStar())
continue;
2859 if (market ==
null)
continue;
2862 if (level != SurveyLevel.NONE)
return true;
2871 if (system !=
null) {
2874 throw new RuntimeException(
"Star system [" + systemName +
"] not found");
2880 if (planet.isStar())
continue;
2883 if (market ==
null)
continue;
2894 if (planet.isStar())
continue;
2897 if (market ==
null)
continue;
2901 mc.setSurveyed(
true);
2912 if (system !=
null) {
2915 throw new RuntimeException(
"Star system [" + systemName +
"] not found");
2921 if (planet.isStar())
continue;
2923 if (planet.getMarket() !=
null && !planet.getMarket().getConditions().isEmpty())
continue;
2931 Vector2f centerLoc =
new Vector2f();
2932 float centerRadius = 0;
2938 float planetRadius = planet.
getRadius();
2949 }
else if (parentParent !=
null && parentParent.
isStar()) {
2951 centerRadius = parentParent.
getRadius();
2956 float approximateExtraRadiusPerOrbit = 400f;
2959 int orbitIndex = (int) ((dist - centerRadius - planetRadius -
2962 if (orbitIndex == 0) {
2963 orbitIndex = (int) ((dist - centerRadius - planetRadius -
2967 if (orbitIndex < 0) orbitIndex = 0;
2974 if (seed == 0)
return random;
2976 Random r =
new Random(seed);
2977 for (
int i = 0; i < level; i++) {
2980 return new Random(r.nextLong());
2989 if (dataType !=
null) {
3007 mc.setSurveyed(
true);
3077 String
string =
"New planet data: " + planet.
getName() +
", " + type;
3111 public static void renderQuadAlpha(
float x,
float y,
float width,
float height, Color color,
float alphaMult) {
3113 GL11.glDisable(GL11.GL_TEXTURE_2D);
3114 GL11.glEnable(GL11.GL_BLEND);
3115 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ZERO);
3117 GL11.glColor4ub((
byte)color.getRed(),
3118 (
byte)color.getGreen(),
3119 (
byte)color.getBlue(),
3120 (
byte)(color.getAlpha() * alphaMult));
3122 GL11.glBegin(GL11.GL_QUADS);
3124 GL11.glVertex2f(x, y);
3125 GL11.glVertex2f(x, y + height);
3126 GL11.glVertex2f(x + width, y + height);
3127 GL11.glVertex2f(x + width, y);
3144 public boolean runWhilePaused() {
3147 public boolean isDone() {
3150 public void advance(
float amount) {
3152 if (elapsed > seconds) {
3155 float b = 1f - elapsed / seconds;
3170 public boolean runWhilePaused() {
3173 public boolean isDone() {
3176 public void advance(
float amount) {
3178 if (elapsed > in + dur + out) {
3184 }
else if (elapsed > in + dur) {
3185 b = 1f - (elapsed - in - dur) / out;
3200 public boolean runWhilePaused() {
3203 public boolean isDone() {
3204 return elapsed > in;
3206 public void advance(
float amount) {
3212 float b = elapsed / in;
3251 vel.scale(5f + 10f * (
float) Math.random());
3280 DropData data =
new DropData();
3282 data.value = (int) ((1000 + params.bandWidthInEngine) * 5);
3285 debris.
setDiscoveryXP((
float)((
int)(params.bandWidthInEngine * 0.2f)));
3286 if (params.baseSalvageXP <= 0) {
3287 debris.
setSalvageXP((
float)((
int)(params.bandWidthInEngine * 0.6f)));
3301 if (hullSpec.
getHints().contains(ShipTypeHints.UNBOARDABLE)) {
3303 if (hullSpec.
hasTag(tag))
return false;
3308 if (parent.
hasTag(tag))
return false;
3341 if (recoverer !=
null) {
3343 if (useOfficerRecovery) {
3347 chance *= chanceMult;
3349 if (chance < 0) chance = 0;
3350 if (chance > 1f) chance = 1f;
3351 boolean recoverable = rand.nextFloat() < chance;
3370 float min = Float.MAX_VALUE;
3375 if (!allowWormhole && curr.isWormhole())
continue;
3389 float min = Float.MAX_VALUE;
3394 if (curr.isGasGiantAnchor() || curr.isStarAnchor())
continue;
3405 float min = Float.MAX_VALUE;
3410 if (requireGasGiant && !curr.isGasGiant())
continue;
3411 if (!allowStars && curr.isStar())
continue;
3430 Vector2f stubLocInHyper =
null;
3431 if (containingLocation ==
null || containingLocation.
isHyperspace()) {
3432 stubLocInHyper = location;
3434 stubLocInHyper = containingLocation.
getLocation();
3439 boolean sameLoc = containingLocation !=
null &&
3442 float maxDist = 6000;
3443 if (!sameLoc) maxDist = 3000;
3446 return dist < maxDist;
3475 private static final AtomicLong seedUniquifier =
new AtomicLong(8682522807148012L);
3482 return seedUniquifier() ^ System.nanoTime();
3488 long current = seedUniquifier.get();
3489 long next = current * 181783497276652981L;
3491 if (seedUniquifier.compareAndSet(current, next)) {
3503 return UUID.randomUUID().toString();
3509 for (Color c : colors) {
3510 result += Integer.toHexString(c.getRGB()) +
"|";
3512 if (result.length() > 0) {
3513 result = result.substring(0, result.length() - 1);
3519 List<Color> result =
new ArrayList<Color>();
3520 for (String p : in.split(
"\\|")) {
3522 result.add(
new Color((
int)Long.parseLong(p, 16)));
3535 @SuppressWarnings(
"unchecked")
3537 float min = Float.MAX_VALUE;
3539 LocationAPI location = from.getContainingLocation();
3542 float dist =
Misc.
getDistance(from.getLocation(), curr.getLocation());
3568 float dist1 = Math.abs(angle - direction) - arc/2f;
3569 float dist2 = Math.abs(360 - Math.abs(angle - direction)) - arc/2f;
3571 if (dist1 <= 0 || dist2 <= 0)
return 0;
3573 return dist1 > dist2 ? dist2 : dist1;
3606 if (level == SurveyLevel.NONE) str =
UNKNOWN;
3607 else if (level == SurveyLevel.SEEN) str =
UNSURVEYED;
3608 else if (level == SurveyLevel.PRELIMINARY) str =
PRELIMINARY;
3609 else if (level == SurveyLevel.FULL) str =
FULL;
3612 str =
"[" + str +
"]";
3622 String classStr = spec.
getName().replaceFirst(
" Survey Data",
"");
3655 List<StarSystemAPI> systems =
new ArrayList<StarSystemAPI>();
3658 if (exclude !=
null && exclude.contains(system))
continue;
3661 if (dist > maxRange)
continue;
3664 systems.add(system);
3691 if (!p.isStar())
return true;
3720 for (
int i = 0; i < params.length; i += 2) {
3721 String item = (String) params[i];
3723 if (params[i+1] instanceof Float) {
3724 weight = (Float) params[i+1];
3725 }
else if (params[i+1] instanceof Integer) {
3726 weight = (Integer) params[i+1];
3728 picker.
add(item, weight);
3748 List<CampaignFleetAPI> result =
new ArrayList<CampaignFleetAPI>();
3750 if (from == other)
continue;
3752 if (dist <= maxDist) {
3760 List<CampaignFleetAPI> result =
new ArrayList<CampaignFleetAPI>();
3762 if (from == other)
continue;
3763 VisibilityLevel level = other.getVisibilityLevelTo(from);
3764 if (level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS || level == VisibilityLevel.COMPOSITION_DETAILS) {
3766 }
else if (level == VisibilityLevel.SENSOR_CONTACT && includeSensorContacts) {
3787 for (
int i = 0; i < stacks1.size(); i++) {
3791 if ((s1 ==
null || s2 ==
null) && s1 != s2)
return false;
3805 float minDist = Float.MAX_VALUE;
3812 if (dist < minDist) {
3831 if (forgetTransponder) {
3852 if (source !=
null) {
3858 if (entity !=
null) {
3887 if (repChangeFaction != 0) {
3888 CustomRepImpact impact =
new CustomRepImpact();
3889 impact.delta = repChangeFaction;
3890 impact.limit = limit;
3892 new RepActionEnvelope(RepActions.CUSTOM, impact,
3896 if (person !=
null) {
3897 impact.delta = repChangePerson;
3898 impact.limit = personLimit;
3900 new RepActionEnvelope(RepActions.CUSTOM, impact,
3901 null, text,
true), person);
3909 if (curr.isActive()) {
3910 for (String t : curr.getSpec().getTags()) {
3911 if (t.equals(tag)) {
3929 float s2 = v2.length();
3931 if (s1 < 10) s1 = 10;
3932 if (s2 < 10) s2 = 10;
3938 float time = dist / s1;
3939 float maxTime = dist / s2 * 0.75f;
3940 if (time > maxTime) time = maxTime;
3944 p3.scale(time * s2);
3945 Vector2f.add(p2, p3, p3);
3948 overshoot.scale(3000f);
3949 Vector2f.add(p3, overshoot, p3);
3961 float s1 = maxSpeedFrom;
3962 float s2 = v2.length();
3964 if (s1 < 10) s1 = 10;
3965 if (s2 < 10) s2 = 10;
3971 float time = dist / s1;
3972 float maxTime = dist / s2 * 0.75f;
3973 if (time > maxTime) time = maxTime;
3977 p3.scale(time * s2);
3978 Vector2f.add(p2, p3, p3);
3981 overshoot.scale(3000f);
3982 Vector2f.add(p3, overshoot, p3);
3989 if (player !=
null) {
3995 List<String> list =
new ArrayList<String>();
3996 for (String con : res.keySet()) {
3998 int qty = res.get(con);
3999 list.add(
"" + qty +
" " + spec.
getName().toLowerCase());
4000 quantities.add(
"" + qty);
4007 GL11.glColor4ub((
byte)color.getRed(),
4008 (
byte)color.getGreen(),
4009 (
byte)color.getBlue(),
4010 (
byte)color.getAlpha());
4013 public static void setColor(Color color,
float alphaMult) {
4014 GL11.glColor4ub((
byte)color.getRed(),
4015 (
byte)color.getGreen(),
4016 (
byte)color.getBlue(),
4017 (
byte)((
float)color.getAlpha() * alphaMult));
4022 GL11.glColor4ub((
byte)color.getRed(),
4023 (
byte)color.getGreen(),
4024 (
byte)color.getBlue(),
4031 if (market ==
null)
return false;
4038 if (entry.getType() == EntryType.PERSON && entry.getEntryData() instanceof
PersonAPI) {
4089 List<String> unset =
new ArrayList<String>();
4090 for (String key : memory.
getKeys()) {
4091 if (key.startsWith(
"$" + prefix)) {
4095 for (String key : unset) {
4099 if (prefix.endsWith(
"_")) {
4100 prefix = prefix.substring(0, prefix.length() - 1);
4110 if (player ==
null)
return;
4113 if (player == other)
continue;
4114 if (other.getBattle() !=
null)
continue;
4115 if (other.getOrbit() !=
null)
continue;
4116 if (!other.isHostileTo(player))
continue;
4119 if (dist < minDist) {
4123 Vector2f.add(v, other.getLocation(), v);
4124 other.setLocation(v.x, v.y);
4136 String
id = entity.
getId();
4137 if (
id ==
null)
id =
genUID();
4139 seed = (entity.
getId().hashCode() * 17000) * 1181783497276652981L;
4141 seed = seedUniquifier() ^ (entity.
getId().hashCode() * 17000);
4143 Random r =
new Random(seed);
4144 for (
int i = 0; i < 5; i++) {
4147 long result = r.nextLong();
4157 if (
id ==
null)
id =
genUID();
4159 long seed = (entity.
getId().hashCode() * 17000);
4160 Random r =
new Random(seed);
4161 for (
int i = 0; i < 53; i++) {
4164 long result = r.nextLong();
4196 Vector2f neg =
new Vector2f(vel);
4219 if (plugin ==
null) {
4277 if (max <= min)
return 0f;
4279 float f = (curr - min) / (max - min);
4288 return storageFreeFraction;
4296 if (market ==
null)
return null;
4298 if (submarket ==
null)
return null;
4304 if (submarket ==
null)
return null;
4308 if (market ==
null)
return null;
4310 if (submarket ==
null)
return null;
4316 if (submarket ==
null)
return null;
4325 if (plugin ==
null)
return 0f;
4328 value += stack.getSize() * stack.getBaseValuePerUnit();
4335 if (plugin ==
null)
return 0f;
4339 value += member.getBaseValue();
4351 boolean includeLocalResources,
boolean addSectionIfEmpty) {
4356 List<FleetMemberAPI> ships =
new ArrayList<FleetMemberAPI>();
4357 if (storage !=
null) {
4361 if (local !=
null && includeLocalResources) {
4367 if (!cargo.
isEmpty() || addSectionIfEmpty) {
4368 String title =
"Cargo in storage";
4369 if (includeLocalResources && local !=
null) {
4370 title =
"Cargo in storage and resource stockpiles";
4374 tooltip.
showCargo(cargo, 10,
true, opad);
4377 if (!ships.isEmpty() || addSectionIfEmpty) {
4378 String title =
"Ships in storage";
4379 if (includeLocalResources && local !=
null) {
4380 title =
"Ships in storage";
4384 tooltip.
showShips(ships, 10,
true, opad);
4394 if (addSectionIfEmpty)
return true;
4396 return !cargo.
isEmpty() || !ships.isEmpty();
4411 String salaryKey =
"adminSalaryTier" + tier;
4428 float salary = (officerBase + officer.
getStats().getLevel() * officerPerLevel) * payMult;
4444 if (hull !=
null)
return hull;
4469 if (fp !=
null)
return fp;
4486 if (market !=
null) {
4493 fp *= 1f + (pts - 1f) / 4f;
4498 if (market !=
null) {
4547 if (d.market !=
null) {
4549 return ShipPickMode.IMPORTED;
4550 }
else if (factionId !=
null && !factionId.equals(d.market.
getFactionId())) {
4551 return ShipPickMode.IMPORTED;
4553 return ShipPickMode.PRIORITY_THEN_ALL;
4555 return ShipPickMode.IMPORTED;
4566 if (curr !=
null && curr == fleet)
return entity;
4575 if (fleet !=
null)
return fleet;
4594 if (fleet !=
null)
return fleet;
4630 return !notActiveModule;
4636 return !notActiveModule;
4647 if (d.getDestination() !=
null && d.getDestination().getContainingLocation() !=
null &&
4648 d.getDestination().getContainingLocation().isHyperspace()) {
4649 return d.getDestination().getLocation();
4659 if (dist > maxRange)
return false;
4668 float deviation = desired * deviationMult;
4669 float exponent = (desired - current) / deviation;
4670 if (exponent > 4) exponent = 4;
4671 float probMult = (float) Math.pow(10f, exponent);
4684 showCost(text,
"Resources: consumed (available)",
true, color, dark, res, quantities);
4686 public static void showCost(
TextPanelAPI text, String title,
boolean withAvailable, Color color, Color dark, String [] res,
int [] quantities) {
4687 showCost(text, title, withAvailable, -1f, color, dark, res, quantities,
null);
4689 public static void showCost(
TextPanelAPI text, String title,
boolean withAvailable,
float widthOverride, Color color, Color dark, String [] res,
int [] quantities,
boolean [] consumed) {
4693 Set<String> unmet =
new HashSet<String>();
4694 Set<String> all =
new LinkedHashSet<String>();
4698 for (
int i = 0; i < res.length; i++) {
4699 String commodityId = res[i];
4700 int quantity = quantities[i];
4701 if (quantity > cargo.
getQuantity(CargoItemType.RESOURCES, commodityId)) {
4702 unmet.add(commodityId);
4704 all.add(commodityId);
4707 float costHeight = 67;
4714 if (widthOverride > 0) {
4719 for (
int i = 0; i < res.length; i++) {
4720 String commodityId = res[i];
4721 int required = quantities[i];
4724 if (withAvailable && required > cargo.
getQuantity(CargoItemType.RESOURCES, commodityId)) {
4728 if (withAvailable) {
4733 if (consumed !=
null && consumed[i]) {
4737 if (withAvailable) {
4738 cost.
addCost(commodityId,
"" + required +
" (" + available +
")", curr);
4740 cost.
addCost(commodityId,
"" + required, curr);
4742 if (consumed !=
null && consumed[i]) {
4751 String key =
"$shownFactionConfigDialog";
4792 float minDist = Float.MAX_VALUE;
4795 if (fleet ==
null || fleet.
isEmpty())
continue;
4800 if (dist < minDist) {
4802 closestEntity = station;
4809 if (!fleet.isStationMode())
continue;
4810 if (fleet.isHidden())
continue;
4815 if (dist < minDist) {
4817 closestEntity =
null;
4822 if (closest ==
null)
return null;
4829 float distPrimary = 10000f;
4831 if (market !=
null) {
4836 if (distPrimary > check && distStation > check) {
4851 if (str < min) str = min;
4853 float quality = 0.5f;
4863 if (source !=
null && source.
getInflater() !=
null &&
4870 if (quality < 0) quality = 0f;
4885 float captainMult = 1f;
4887 float captainLevel = (member.
getCaptain().getStats().getLevel() - 1f);
4897 str *= Math.max(0.25f, 0.8f + quality * 0.4f);
4913 float expire = days;
4917 if (expire > 180) expire = 180;
4947 if (design !=
null && !design.isEmpty()) {
4960 float mult = (radius - min) / (max - min);
4961 if (mult > 1) mult = 1;
4969 mult = Math.round(mult * 100f) / 100f;
4979 mult = Math.round(mult * 100f) / 100f;
4980 if (mult < 0.1f) mult = 0.1f;
4987 float dur = 1f + (float) Math.random();
4988 addHitGlow(location, loc, vel, size, dur, color);
4992 size, 0.4f, dur, color);
4994 size * 0.25f, 0.4f, dur, color);
4996 size * 0.15f, 1f, dur, Color.white);
5006 size, 0.4f, rampUp, dur, color);
5008 size * 0.25f, 0.4f, rampUp, dur, color);
5010 size * 0.15f, 1f, rampUp, dur, Color.white);
5029 if (strAdjustedFP < 50) {
5030 strDesc =
"very weak";
5031 }
else if (strAdjustedFP < 150) {
5032 strDesc =
"somewhat weak";
5033 }
else if (strAdjustedFP < 300) {
5034 strDesc =
"fairly capable";
5035 }
else if (strAdjustedFP < 750) {
5036 strDesc =
"fairly strong";
5037 }
else if (strAdjustedFP < 1250) {
5040 strDesc =
"very strong";
5050 boolean heavyIndustry =
false;
5053 heavyIndustry =
true;
5056 return heavyIndustry;
5071 if (claimedBy !=
null) {
5080 if (curr.isHidden())
continue;
5081 if (curr.getFaction().isPlayerFaction())
continue;
5083 int score = curr.getSize();
5085 if (other != curr && other.getFaction() == curr.getFaction()) score++;
5090 if (json ==
null)
continue;
5091 boolean territorial = json.optBoolean(
"territorial");
5092 if (!territorial)
continue;
5098 if (result ==
null)
return null;
5134 while (curr !=
null) {
5148 return (
int) refund;
5154 beacon.
addTag(beaconTag);
5156 float radius = (gap.start + gap.end) / 2f;
5160 Color glowColor =
new Color(255,200,0,255);
5161 Color pingColor =
new Color(255,200,0,255);
5163 glowColor =
new Color(250,155,0,255);
5164 pingColor =
new Color(250,155,0,255);
5166 glowColor =
new Color(250,55,0,255);
5167 pingColor =
new Color(250,125,0,255);
5175 CoreUITradeMode mode = CoreUITradeMode.OPEN;
5176 String val = memory.
getString(
"$tradeMode");
5177 if (val !=
null && !val.isEmpty()) {
5178 mode = CoreUITradeMode.valueOf(val);
5197 float max = color.getRed();
5198 if (color.getGreen() > max) max = color.getGreen();
5199 if (color.getBlue() > max) max = color.getBlue();
5200 float f = brightness / max;
5206 int red = (int) (color.getRed() * factor);
5207 int green = (int) (color.getGreen() * factor);
5208 int blue = (int) (color.getBlue() * factor);
5209 int alpha = (int) (color.getAlpha() * factor);
5211 if (red > 255) red = 255;
5212 if (green > 255) green = 255;
5213 if (blue > 255) blue = 255;
5214 if (alpha > 255) alpha = 255;
5216 return new Color(red, green, blue, alpha);
5234 List<OfficerDataAPI> mercs =
new ArrayList<OfficerDataAPI>();
5251 if (curr.isIndustry()) {
5253 }
else if (curr.isUpgrading()) {
5254 String up = curr.getSpec().getUpgrade();
5271 if (curr.isImproved()) {
5279 if (system ==
null)
return 0;
5295 if (curr.isBuilding() && !curr.isUpgrading()) {
5303 Color relColor =
new Color(125,125,125,255);
5304 if (rel > 1) rel = 1;
5305 if (rel < -1) rel = -1;
5309 }
else if (rel < 0) {
5333 float playerStr = 0f;
5334 float fleetStr = 0f;
5337 playerStr += strength;
5342 fleetStr += strength;
5345 if (playerStr > fleetStr * 3f)
return 1;
5346 if (playerStr > fleetStr * 1.5f)
return 2;
5347 if (playerStr > fleetStr * 0.75f)
return 3;
5348 if (playerStr > fleetStr * 0.33f)
return 4;
5354 if (result ==
null || baseDamage <= 0)
return baseSize;
5361 return getHitGlowSize(baseSize, baseDamage, type, sd, ad, hd, ed);
5367 float minBonus = 0f;
5373 if (ad > 0) minBonus = 0.1f;
5376 minBonus = 0.2f * (hd / (hd + ad));
5383 float totalDamage = sd + ad + hd;
5384 if (totalDamage <= 0)
return baseSize;
5387 if (totalDamage < baseDamage) {
5389 if (totalDamage > baseDamage) {
5390 totalDamage = baseDamage;
5394 float minSize = 15f;
5395 float minMult = minSize / baseSize;
5396 minMult = Math.max(minMult, 0.67f + minBonus);
5397 if (minMult > 1) minMult = 1;
5399 float mult = totalDamage / baseDamage;
5400 if (mult < minMult) mult = minMult;
5402 float maxMult = 1.5f;
5403 if (mult > maxMult) mult = maxMult;
5407 return baseSize * mult;
5413 if (sl.getLevel() >= 2) count++;
5492 if (stats ==
null)
return false;
5505 if (ship ==
null)
return false;
5511 @SuppressWarnings(
"unchecked")
5515 tags =
new HashSet<String>();
5524 if (ship ==
null)
return 0;
5529 if (member ==
null)
return 0;
5543 float fraction = 0f;
5575 if (fraction < 0f) fraction = 0f;
5576 if (fraction > 1f) fraction = 1f;
5603 if (!variant.
getSMods().contains(spec.
getId()))
return false;
5625 if (variant ==
null)
return 0;
5640 List<HullModSpecAPI> result =
new ArrayList<HullModSpecAPI>();
5641 if (variant ==
null)
return result;
5674 public static enum FleetMemberDamageLevel {
5681 boolean withCRDamage, String crDamageId, String crDamageReason,
5683 String messageText) {
5684 float damageMult = 1f;
5696 applyDamage(member,
random, damageMult, withCRDamage, crDamageId, crDamageReason,
5697 withMessage, textPanel, messageText);
5701 boolean withCRDamage, String crDamageId, String crDamageReason,
5703 String messageText) {
5705 damageMult *= 0.75f +
random.nextFloat() * 0.5f;
5715 float hullDamageFraction = 0.025f * damageMult;
5716 float max = 0.5f +
random.nextFloat() * 0.1f;
5717 float min = 0.01f +
random.nextFloat() * 0.04f;
5718 if (hullDamageFraction > max) hullDamageFraction = max;
5719 if (hullDamageFraction < min) hullDamageFraction = min;
5721 if (hitStrength > 0) {
5723 for (
int i = 0; i < numHits; i++) {
5730 boolean isPF = member !=
null && member.
getFleetData() !=
null &&
5736 float crDamage = Math.min(currCR, crPerDep * 0.1f * damageMult);
5746 if (withMessage && isPF) {
5751 if (textPanel !=
null) {
5780 if (member == record.getMember() && record.getMember() !=
null) {
5781 points += record.getSPSpent();
5782 xp += record.getBonusXPFractionGained() * record.getSPSpent();
5786 return new float[] {points, 1f - xp/points};
5788 return new float[] {0f, 0f};
5793 if (mult == 0) mult = 1f;
5809 personalityName =
"Fearless";
5812 return personalityName;
5822 if (ts ==
null)
return Float.MAX_VALUE;
5836 int diff = newMod - currMod;
5844 if (Math.abs(units) > maxUnits) {
5845 int sign = (int) Math.signum(quantity);
5855 if (!market.isHidden())
return true;
5862 for (String tag : other) {
5863 if (tags.contains(tag))
return true;
5884 return market !=
null &&
5911 return market !=
null &&
5922 triggers.add(trigger);
5927 if (triggers !=
null) {
5928 triggers.remove(trigger);
5933 @SuppressWarnings(
"unchecked")
5935 MemoryAPI mem = fleet.getMemoryWithoutUpdate();
5936 List<String> triggers =
null;
5938 if (!createIfNecessary) return null;
5939 triggers = new ArrayList<String>();
5940 mem.set(DEFEAT_TRIGGERS, triggers);
5942 triggers = (List<String>) mem.get(DEFEAT_TRIGGERS);
5949 if (triggers !=
null && triggers.isEmpty()) {
5962 boolean sourceIsPlayerShipWing =
false;
5963 sourceIsPlayerShipWing = source !=
null && source.
getWing() !=
null &&
5967 boolean showFloaty = target == playerShip ||
5968 target == followedEntity ||
5969 source == playerShip ||
5970 sourceIsPlayerShipWing ||
5973 showFloaty = showFloaty && !target.
isFighter();
5995 String str = GL11.glGetString(GL11.GL_EXTENSIONS);
5997 List<String> extensions = Arrays.asList(str.split(
" "));
6012 return GL11.glGetInteger(NVXGpuMemoryInfo.GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX);
6014 return GL11.glGetInteger(ATIMeminfo.GL_TEXTURE_FREE_MEMORY_ATI);
6019 return GL11.glGetInteger(NVXGpuMemoryInfo.GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX);
6022 return GL11.glGetInteger(NVXGpuMemoryInfo.GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX);
6037 String lightShields, String solidShields, String heavyShields,
6038 String lightHull, String solidHull, String heavyHull
6046 float totalDam = shieldDam + armorDam + hullDam;
6048 if (totalDam + fluxDam <= 0)
return;
6055 if (shieldDam > 0) {
6056 String soundId =
null;
6057 if (shieldDam < 70) {
6058 vol = shieldDam / 20f;
6059 if (vol > 1) vol = 1;
6060 soundId = lightShields;
6061 }
else if (shieldDam < 200) {
6062 soundId = solidShields;
6064 soundId = heavyShields;
6066 if (soundId !=
null) {
6072 String soundId =
null;
6074 float physicalDam = armorDam + hullDam + fluxDam;
6076 if (physicalDam < 5) {
6077 vol = physicalDam / 5f;
6078 if (vol > 1) vol = 1;
6079 soundId = lightHull;
6080 }
else if (physicalDam < 40) {
6081 soundId = lightHull;
6082 }
else if (physicalDam < 150) {
6083 soundId = solidHull;
6085 soundId = heavyHull;
6088 if (soundId !=
null) {
6100 if (ship.
isDrone())
return 0.1f;
6104 case CAPITAL_SHIP: weight += 8;
break;
6105 case CRUISER: weight += 4;
break;
6106 case DESTROYER: weight += 2;
break;
6107 case FRIGATE: weight += 1;
break;
6108 case FIGHTER: weight += 1;
break;
6113 if (nonCombat && adjustForNonCombat) weight *= 0.25f;
6114 if (ship.
isDrone()) weight *= 0.1f;
6119 float incapTime = 0f;
6134 if (avoidingPlayer && !fleet.
isHostileTo(player))
return true;
6151 return faction !=
null &&
6161 word = word.toLowerCase();
6162 for (String other :
new String[] {
"euler",
"heir",
"honest",
"hono"}) {
6163 if (word.startsWith(other)) {
6168 if (word.startsWith(
"hour") && !word.startsWith(
"houri")) {
6175 for (String regex :
new String[] {
"^e[uw]",
"^onc?e\b",
"^uni([^nmd]|mo)",
"^u[bcfhjkqrst][aeiou]"}) {
6176 p = Pattern.compile(
"(?is)" + regex +
".*");
6177 m = p.matcher(word);
6183 p = Pattern.compile(
"(?is)" +
"^U[NK][AIEO]");
6184 m = p.matcher(word);
6189 for (String letter :
new String[] {
"a",
"e",
"i",
"o",
"u" }) {
6190 if (word.startsWith(letter)) {
6195 p = Pattern.compile(
"(?is)" +
"^y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)" +
".*");
6196 m = p.matcher(word);
6207 if (intel !=
null) {
6210 boolean addToComms = alwaysAddToCommDirectory;
6211 boolean hidden =
false;
6215 if (entry !=
null) {
6234 if (entry !=
null) {
6274 if (recentlyBeaten)
return true;
6277 if (pf ==
null)
return true;
6278 if (fleet.
getAI() !=
null) {
6280 if (opt == EncounterOption.DISENGAGE || opt == EncounterOption.HOLD_VS_STRONGER) {
6283 if (opt == EncounterOption.ENGAGE) {
6290 return otherCount <= pfCount / 4;
6301 if (recentlyBeaten)
return true;
6306 if (!member.isCivilian() && member.getHullSpec() !=
null) {
6307 switch (member.getHullSpec().getHullSize()) {
6308 case CAPITAL_SHIP: count += 4;
break;
6309 case CRUISER: count += 3;
break;
6310 case DESTROYER: count += 2;
break;
6311 case FRIGATE: count += 1;
break;
6319 if (!member.isCivilian() && member.getHullSpec() !=
null) {
6320 switch (member.getHullSpec().getHullSize()) {
6321 case CAPITAL_SHIP: pfCount += 4;
break;
6322 case CRUISER: pfCount += 3;
break;
6323 case DESTROYER: pfCount += 2;
break;
6324 case FRIGATE: pfCount += 1;
break;
6329 if (count > pfCount * 0.67f) {
6339 if (arr ==
null || arr.length <= k || k < 0) {
6344 int to = arr.length - 1;
6349 float mid = arr[(r + w) / 2];
6352 if (arr[r] >= mid) {
6362 if (arr[r] > mid) r--;
6375 if (ship ==
null || weapon ==
null)
return base;
6379 return (base * (1f + percent/100f) + flat) * mult;
6383 public static Vector2f
bezier(Vector2f p0, Vector2f p1, Vector2f p2,
float t) {
6386 Vector2f r =
new Vector2f();
6387 r.x = (1f - t) * (1f - t) * p0.x + 2f * (1f - t) * t * p1.x + t * t * p2.x;
6388 r.y = (1f - t) * (1f - t) * p0.y + 2f * (1f - t) * t * p1.y + t * t * p2.y;
6392 public static Vector2f
bezierCubic(Vector2f p0, Vector2f p1, Vector2f p2, Vector2f p3,
float t) {
6395 Vector2f r =
new Vector2f();
6397 r.x = (1f - t) * (1f - t) * (1f -t) * p0.x +
6398 3f * (1f - t) * (1f - t) * t * p1.x +
6399 3f * (1f - t) * t * t * p2.x +
6401 r.y = (1f - t) * (1f - t) * (1f -t) * p0.y +
6402 3f * (1f - t) * (1f - t) * t * p1.y +
6403 3f * (1f - t) * t * t * p2.y +
6412 if (location ==
null)
return false;
6439 return loc.x < -sw/2f || loc.x > sw/2f || loc.y < -sh/2f || loc.y > sh/2f;
6446 List<SlipstreamSegment> segments = plugin.
getSegments();
6447 int skip = Math.max(20, segments.size() / 10);
6448 for (
int i = 0; i < segments.size(); i += skip) {
6450 if (i2 > segments.size() - skip/2) i2 = segments.size() - 1;
6451 if (i2 >= segments.size()) i2 = segments.size() - 1;
6455 Vector2f p =
intersectSegments(segments.get(i).loc, segments.get(i2).loc, from, to);
6456 if (p !=
null)
return true;
6464 Vector2f min =
new Vector2f();
6465 Vector2f max =
new Vector2f();
6468 Vector2f loc = curr.getLocation();
6469 min.x = Math.min(min.x, loc.x);
6470 min.y = Math.min(min.y, loc.y);
6471 max.x = Math.max(max.x, loc.x);
6472 max.y = Math.max(max.y, loc.y);
6476 Vector2f core = Vector2f.add(min, max,
new Vector2f());
6554 float absTurnVel = Math.abs(turnVel);
6559 float decelTime = absTurnVel / turnDecel;
6560 float decelDistance = absTurnVel * decelTime - 0.5f * turnDecel * decelTime * decelTime;
6562 float facingAfterNaturalDecel = missile.
getFacing() + Math.signum(turnVel) * decelDistance;
6563 float diffWithEventualFacing =
getAngleDiff(facingAfterNaturalDecel, desiredFacing);
6566 if (diffWithEventualFacing > 1f) {
6568 if (Math.signum(turnVel) == Math.signum(turnDir)) {
6569 if (decelDistance > diffWithCurrFacing) {
6575 }
else if (turnDir >= 0) {
6587 float absTurnVel = Math.abs(turnVel);
6592 float decelTime = absTurnVel / turnDecel;
6593 float decelDistance = absTurnVel * decelTime - 0.5f * turnDecel * decelTime * decelTime;
6595 float facingAfterNaturalDecel = ship.
getFacing() + Math.signum(turnVel) * decelDistance;
6596 float diffWithEventualFacing =
getAngleDiff(facingAfterNaturalDecel, desiredFacing);
6599 if (diffWithEventualFacing > 1f) {
6601 if (Math.signum(turnVel) == Math.signum(turnDir)) {
6602 if (decelDistance > diffWithCurrFacing) {
6608 }
else if (turnDir >= 0) {
6628 return adjustRep(person, delta,
null, text);
6631 return adjustRep(person, delta, limit, text,
true,
true);
6634 boolean addMessageOnNoChange,
boolean withMessage) {
6635 CustomRepImpact impact =
new CustomRepImpact();
6636 impact.delta = delta;
6637 if (limit !=
null) {
6638 impact.limit = limit;
6641 new RepActionEnvelope(RepActions.CUSTOM,
6642 impact,
null, text, addMessageOnNoChange, withMessage),
6647 return adjustRep(factionId, delta,
null, text);
6650 return adjustRep(factionId, delta, limit, text,
true,
true);
6653 boolean addMessageOnNoChange,
boolean withMessage) {
6654 CustomRepImpact impact =
new CustomRepImpact();
6655 impact.delta = delta;
6656 if (limit !=
null) {
6657 impact.limit = limit;
6660 new RepActionEnvelope(RepActions.CUSTOM,
6661 impact,
null, text, addMessageOnNoChange, withMessage),
6667 case CAPITAL_SHIP:
return "Capital";
6668 case CRUISER:
return "Cruiser";
6669 case DESTROYER:
return "Destroyer";
6670 case FIGHTER:
return "Fighter";
6671 case FRIGATE:
return "Frigate";
6677 float r = Math.abs(one.getRed() - two.getRed());
6678 float g = Math.abs(one.getGreen() - two.getGreen());
6679 float b = Math.abs(one.getBlue() - two.getBlue());
6680 float a = Math.abs(one.getAlpha() - two.getAlpha());
6682 return (
float) Math.sqrt(r * r + g * g + b * b + a * a);
6702 float a = sw * 0.5f * mult;
6703 float b = sh * 0.5f * mult;
6707 float f = (x * x) / (a * a) + (y * y)/ (b * b);
6724 public static enum CatalogEntryType {
6730 public String suffix;
6731 private CatalogEntryType(String suffix) {
6732 this.suffix = suffix;
6739 public static String
genEntityCatalogId(
int cycleOverride,
int monthOverride,
int dayOverride, CatalogEntryType type) {
6742 public static String
genEntityCatalogId(String firstChar,
int cycleOverride,
int monthOverride,
int dayOverride, CatalogEntryType type) {
6744 String base =
"Perseus";
6748 if (cycleOverride > 0) cycle = cycleOverride;
6751 if (monthOverride > 0) month = monthOverride;
6753 if (dayOverride > 0) day = dayOverride;
6755 String s1 = Integer.toHexString(cycle).toUpperCase();
6759 String s0 = Integer.toHexString(r.nextInt(16)).toUpperCase();
6760 if (firstChar !=
null) s0 = firstChar;
6762 String s2 = Integer.toHexString(month).toUpperCase();
6763 String s3 = Integer.toHexString(day).toUpperCase();
6768 while (s1.length() < 3) s1 =
"0" + s1;
6769 while (s3.length() < 2) s3 =
"0" + s3;
6771 return base +
" " + s0 + s1 +
"-" + s2 + s3 + type.suffix;
6778 if (starData !=
null) {
6785 if (planetData !=
null) {
6803 if (genData !=
null && hab !=
null) {
6821 ShipAPI ignore,
boolean ignoreFightersAndModules) {
6825 float dir,
float arc,
float maxRange,
6826 ShipAPI ignore,
boolean ignoreFightersAndModules,
boolean awareOnly) {
6832 if (ignoreFightersAndModules) {
6833 if (other.isFighter())
continue;
6834 if (other.isStationModule())
continue;
6836 if (other.isFighter() && other.getWing() !=
null && !other.getWing().isLeader(other))
continue;
6837 if (other.isHulk())
continue;
6838 if (other.isDrone())
continue;
6839 if (other.isShuttlePod())
continue;
6840 if (other.getOwner() == 100)
continue;
6841 if (owner == other.getOwner())
continue;
6843 if (other.controlsLocked())
continue;
6844 if (other == ignore)
continue;
6845 if (awareOnly && !engine.
isAwareOf(owner, other))
continue;
6847 float dist =
getDistance(loc, other.getLocation());
6848 if (dist > maxRange)
continue;
6850 if (arc >= 360f ||
isInArc(dir, arc, loc, other.getLocation())) {
6861 float [] result =
new float [arr.length()];
6862 for (
int i = 0; i < arr.length(); i++) {
6863 result[i] = (float) arr.optDouble(i, 0f);
6866 }
catch (JSONException e) {
6871 public static enum WeaponSkinType {
6885 cat =
"weaponSkinsPlayerOnly";
6888 if (skin !=
null)
return skin;
6890 cat =
"weaponSkinsPlayerAndNPC";
6898 String exclude =
"weaponSkinsExcludeFromSharing";
6904 List<SpriteAPI> matching =
new ArrayList<SpriteAPI>();
6905 String keyForHull = weaponId +
":" + style +
":" + type.name();
6906 for (String key : skins) {
6907 if (key.equals(keyForHull)) {
6910 if (key.startsWith(weaponId) && key.endsWith(type.name()) && !noSharing.contains(key)) {
6915 if (!matching.isEmpty()) {
6917 float minDist = Float.MAX_VALUE;
6921 if (dist < minDist) {
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static FactoryAPI getFactory()
static Logger getLogger(Class c)
static CombatEngineAPI getCombatEngine()
static SectorAPI getSector()
static final String NEAREST_FLEEING_FROM
static final String LOCAL
void modifyFlat(String source, float value)
float computeEffective(float baseValue)
static float getWeaponBaseRangeMultMod(ShipAPI ship, WeaponAPI weapon)
static float getWeaponBaseRangeFlatMod(ShipAPI ship, WeaponAPI weapon)
static float getWeaponBaseRangePercentMod(ShipAPI ship, WeaponAPI weapon)
boolean reportPlayerAwareOfPlanet(String planetId, boolean withSave)
static SharedUnlockData get()
static int getNumDMods(ShipVariantAPI variant)
static final String UNSTABLE_KEY
static String GLOW_COLOR_KEY
static String PING_COLOR_KEY
static String REVERSED_POLARITY
List< ConstructionQueueItem > getItems()
static ShipQuality getInstance()
QualityData getQualityData(MarketAPI market)
static float getShipQuality(MarketAPI market, String factionId)
static String KEY_SPAWN_FP_MULT
static final String FARMLAND_BOUNTIFUL
static final String RUINS_WIDESPREAD
static final String RUINS_SCATTERED
static final String RUINS_EXTENSIVE
static final String FARMLAND_ADEQUATE
static final String RUINS_VAST
static final String ABANDONED_STATION
static final String FARMLAND_POOR
static final String FREE_PORT
static final String HABITABLE
static final String FARMLAND_RICH
static final String NORMAL
static final String BASIC
static final String WARNING_BEACON
static final String CARGO_PODS
static final String CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE
static final String CUSTOM_DECENTRALIZED
static final String NEUTRAL
static final String CUSTOM_PUNITIVE_EXPEDITION_DATA
static final String PLAYER
static final String CUSTOM_PIRATE_BEHAVIOR
static final String AUTOMATED
static final String SHIELDED_CARGO_HOLDS
static final String TAG_POPULATION
static final String TAG_STATION
static final String TAG_SPACEPORT
static final String TAG_INDUSTRY
static final String TAG_HEAVYINDUSTRY
static final String PREV_SALVAGE_SPECIAL_DATA
static final String MEMORY_KEY_MAKE_HOSTILE_TO_PLAYER_TRADE_FLEETS
static final String ENTITY_MISSION_IMPORTANT
static final String MEMORY_KEY_MAKE_HOSTILE_WHILE_TOFF
static final String MEMORY_KEY_SOURCE_MARKET
static final String SALVAGE_SPECIAL_DATA
static final String MEMORY_KEY_WAR_FLEET
static final String MEMORY_KEY_MAKE_NON_HOSTILE
static final String MEMORY_KEY_PATROL_FLEET
static final String MARKET_MILITARY
static final String MEMORY_KEY_MAKE_HOSTILE
static final String SALVAGE_DEFENDER_OVERRIDE
static final String MEMORY_KEY_SMUGGLER
static String HIDDEN_BASE_MEM_FLAG
static final String MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_ON
static final String MEMORY_KEY_PIRATE
static final String MEMORY_KEY_RAIDER
static final String STORY_CRITICAL
static final String SALVAGE_SEED
static final String STATION_BASE_FLEET
static final String STATION_FLEET
static final String PLAYER_UNTRUSTWORTHY
static final String STAR_SYSTEM_IN_ANCHOR_MEMORY
static final String STATION_MARKET
static final String MEMORY_KEY_AVOID_PLAYER_SLOWLY
static final String MEMORY_KEY_SAW_PLAYER_WITH_TRANSPONDER_OFF
static final String FCM_EVENT
static final String MEMORY_KEY_MAKE_HOSTILE_TO_ALL_TRADE_FLEETS
static final String MEMORY_KEY_LOW_REP_IMPACT
static final String MEMORY_KEY_NO_REP_IMPACT
static final String FLEET_BUSY
static final String MEMORY_KEY_SCAVENGER
static final String MEMORY_KEY_PLAYER_HOSTILE_ACTIVITY_NEAR_MARKET
static final String MEMORY_KEY_TRADE_FLEET
static final String CLAIMING_FACTION
static final String MEMORY_KEY_PATROL_ALLOW_TOFF
static final String MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER
static final String MEMORY_KEY_FLEET_TYPE
static final String MEMORY_KEY_NEVER_AVOID_PLAYER_SLOWLY
static final String FCM_FACTION
static final String RECKLESS
static final String NAVIGATION_PENALTY_MULT
static final String MOVE_SLOW_SPEED_BONUS_MOD
static final String INDIVIDUAL_SHIP_RECOVERY_MOD
static final String OFFICER_SHIP_RECOVERY_MOD
static final String COMBAT_FLEET_SIZE_MULT
static final String SHIP_RECOVERY_MOD
static final String MAX_MARKET_SIZE
static final String MAX_PERMANENT_HULLMODS_MOD
static final String MAX_INDUSTRIES
static final String SUBMARKET_STORAGE
static final String LOCAL_RESOURCES
static final String NEBULA
static final String RADIO_CHATTER
static final String DEBRIS_FIELD
void setIcon(String icon)
static PlaythroughLog getInstance()
List< SModRecord > getSModsInstalled()
boolean hasMultiplier(String key)
float getMultiplier(String key)
static void generateConditionsForPlanet(GenContext context, PlanetAPI planet)
static final float STARTING_RADIUS_STAR_RANGE
static final float STARTING_RADIUS_STAR_BASE
static final float BASE_INCR
static void addCommodityGainText(String commodityId, int quantity, TextPanelAPI text)
static float TRADE_IMPACT_DAYS
SectorEntityToken getRelatedEntity()
boolean containsEntity(SectorEntityToken other)
static float computeDetectionRange(float radius)
float getAbyssalDepth(Vector2f loc)
List< StarSystemAPI > getAbyssalSystems()
static final float TILE_SIZE
boolean containsEntity(SectorEntityToken other)
boolean containsPoint(Vector2f point, float radius)
List< SlipstreamSegment > getSegments()
static void makeAwareOfConditionsOn(MarketAPI market)
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 MarketConditionSpecAPI getRuinsSpec(MarketAPI market)
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 float countEnemyWeightInArcAroundLocation(ShipAPI ship, Vector2f loc, float dir, float arc, float maxRange, ShipAPI ignore, boolean ignoreFightersAndModules)
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 Map< Class, Method > cleanCache
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 countEnemyWeightInArcAroundLocation(int owner, Vector2f loc, float dir, float arc, float maxRange, ShipAPI ignore, boolean ignoreFightersAndModules, boolean awareOnly)
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 ShipAPI findClosestShipTo(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius, boolean allowHulks, FindShipFilter filter)
static void fadeInOutAndExpire(final SectorEntityToken entity, final float in, final float dur, final float out)
static boolean isKeepOnShipRecovery(PersonAPI person)
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 float getAbyssalDepth(SectorEntityToken entity, boolean uncapped)
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 getAbyssalDepthOfPlayer(boolean uncapped)
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 float countEnemyWeightInArc(ShipAPI ship, float dir, float arc, float maxRange, boolean ignoreFightersAndModules)
static void makeNonStoryCritical(MemoryAPI memory, String reason)
static SectorEntityToken findNearestPlanetTo(SectorEntityToken entity, boolean requireGasGiant, boolean allowStars)
static final String KEEP_CAPTAIN_ON_SHIP_RECOVERY
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 Map< Class, Method > cleanerCache
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 String getRuinsType(MarketAPI market)
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 void setKeepOnShipRecovery(PersonAPI person, boolean keepOnRecovery)
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 float getAbyssalDepth(Vector2f loc, boolean uncapped)
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 float[] getFloatArray(String key)
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 boolean canPlanetTypeRollCondition(PlanetSpecAPI spec, String id)
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 float getAveragePlanetRadius(PlanetSpecAPI spec)
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 boolean canPlanetTypeRollHabitable(PlanetSpecAPI spec)
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 SimulatorPlugin getSimulatorPlugin()
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 int getMaxMarketSize(MarketAPI market)
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 boolean turnTowardsFacingV2(ShipAPI ship, float desiredFacing, float relativeAngVel)
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 SpriteAPI getWeaponSkin(String cat, String weaponId, ShipAPI ship, WeaponSkinType type)
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 String getPlanetSurveyClass(PlanetAPI planet)
static void makeLowRepImpact(CampaignFleetAPI fleet, String reason)
static float getAbyssalDepthOfPlayer()
static String getFleetType(CampaignFleetAPI fleet)
static String getRoundedValue(float value)
static boolean isUnboardable(ShipHullSpecAPI hullSpec)
static float getAbyssalDepth(SectorEntityToken entity)
static SpriteAPI getWeaponSkin(ShipAPI ship, String weaponId, WeaponSkinType type)
static Color getBallisticMountColor()
GO_TO_LOCATION_AND_DESPAWN
CargoAPI createCargo(boolean unlimitedStacks)
MarketAPI createMarket(String id, String name, int size)
JSONArray getJSONArray(String key)
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()
MarketConditionSpecAPI getMarketConditionSpec(String conditionId)
Object getSpec(Class c, String id, boolean nullOnNotFound)
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)
List< String > getSpriteKeys(String category)
float getBonusXP(String key)
CommoditySpecAPI getCommoditySpec(String commodityId)
float getFleetSelectionRadiusPerUnitSize()
boolean isGeneratingNewGame()
float getFloat(String key)
SpriteAPI getSprite(String filename)
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)
boolean isPlayerPrimary()
CampaignFleetAPI getSourceFleet(FleetMemberAPI member)
boolean isOnPlayerSide(CampaignFleetAPI participantOrCombined)
float getElapsedDaysSince(long timestamp)
float convertToDays(float realSeconds)
LocationAPI getContainingLocation()
CampaignFleetAIAPI getAI()
void setVelocity(float x, float y)
Vector2f getMoveDestination()
FleetDataAPI getFleetData()
MutableFleetStatsAPI getStats()
FleetInflater getInflater()
void setInteractionTarget(SectorEntityToken target)
FleetLogisticsAPI getLogistics()
void addAssignment(FleetAssignment assignment, SectorEntityToken target, float maxDurationInDays)
boolean isHostileTo(SectorEntityToken other)
MutableCharacterStatsAPI getCommanderStats()
CampaignTerrainPlugin getPlugin()
boolean showInteractionDialog(InteractionDialogPlugin plugin, SectorEntityToken interactionTarget)
void addMessage(String text)
MessageDisplayAPI getMessageDisplay()
float getQuantity(CargoAPI.CargoItemType type, Object data)
float getCommodityQuantity(String id)
void addAll(CargoAPI other)
List< CargoStackAPI > getStacksCopy()
void addCommodity(String commodityId, float quantity)
FleetDataAPI getMothballedShips()
CargoAPI.CargoItemType getType()
MemoryAPI getMemoryWithoutUpdate()
void removePerson(PersonAPI person)
List< CommDirectoryEntryAPI > getEntriesCopy()
CommDirectoryEntryAPI getEntryForPerson(PersonAPI person)
String addPerson(PersonAPI person)
void setHidden(boolean hidden)
boolean getCustomBoolean(String key)
FactionDoctrineAPI getDoctrine()
boolean isPlayerFaction()
CampaignFleetAPI getFleet()
ArrayList< FleetMemberAPI > getSnapshot()
List< OfficerDataAPI > getOfficersCopy()
List< FleetMemberAPI > getMembersListCopy()
< T > T pickPlugin(Class< T > c, Object params)
SectorEntityToken getDestinationVisualEntity()
List< JumpDestination > getDestinations()
SectorEntityToken addTerrain(String terrainId, Object param)
List getEntities(Class implementedClassOrInterface)
ParticleControllerAPI addParticle(Vector2f loc, Vector2f vel, float size, float brightness, float rampUp, float duration, Color color)
void addHitParticle(Vector2f loc, Vector2f vel, float size, float brightness, float duration, Color color)
List< SectorEntityToken > getJumpPoints()
List< SectorEntityToken > getEntitiesWithTag(String tag)
List< PlanetAPI > getPlanets()
List< CustomCampaignEntityAPI > getCustomEntitiesWithTag(String tag)
List< CampaignTerrainAPI > getTerrainCopy()
SectorEntityToken createToken(float x, float y)
CustomCampaignEntityAPI addCustomEntity(String id, String name, String type, String factionId)
void removeEntity(SectorEntityToken entity)
MemoryAPI getMemoryWithoutUpdate()
List< CampaignFleetAPI > getFleets()
void addMessage(String text)
String getTypeNameWithWorld()
boolean hasTag(String tag)
AICoreOfficerPlugin pickAICoreOfficerPlugin(String commodityId)
ImmigrationPlugin pickImmigrationPlugin(MarketAPI market)
FleetInflater pickFleetInflater(CampaignFleetAPI fleet, Object params)
AICoreAdminPlugin pickAICoreAdminPlugin(String commodityId)
void setComWidthOverride(float comWidthOverride)
void setNumberOnlyMode(boolean numberOnlyMode)
void setAlignment(Alignment alignment)
void addCost(String commodityId, int quantity, Color color)
void setWithBorder(boolean withBorder)
void setLastCostConsumed(boolean consumed)
CampaignFleetAPI getPlayerFleet()
MemoryAPI getPlayerMemoryWithoutUpdate()
List< StarSystemAPI > getStarSystems()
ReputationAdjustmentResult adjustPlayerReputation(Object action, String factionId)
CampaignClockAPI getClock()
long getPlayerBattleSeed()
FactionAPI getPlayerFaction()
GenericPluginManagerAPI getGenericPlugins()
CampaignEventManagerAPI getEventManager()
IntelManagerAPI getIntelManager()
CampaignUIAPI getCampaignUI()
FactionAPI getFaction(String factionId)
StarSystemAPI getStarSystem(String name)
MemoryAPI getMemoryWithoutUpdate()
SectorEntityToken getEntityById(String id)
LocationAPI getHyperspace()
PluginPickerAPI getPluginPicker()
CharacterDataAPI getCharacterData()
LocationAPI getContainingLocation()
StatBonus getDetectedRangeMod()
void setAlwaysUseSensorFaderBrightness(Boolean alwaysUseSensorFaderBrightness)
void forceSensorFaderBrightness(float b)
void setCircularOrbitPointingDown(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)
void setExpired(boolean expired)
boolean isInOrNearSystem(StarSystemAPI system)
void addDropValue(String group, int value)
void setSensorProfile(Float sensorProfile)
void addScript(EveryFrameScript script)
Map< String, AbilityPlugin > getAbilities()
float getSensorFaderBrightness()
void setDiscoverable(Boolean discoverable)
void setName(String name)
StarSystemAPI getStarSystem()
SectorEntityToken getOrbitFocus()
boolean hasTag(String tag)
void setSalvageXP(Float salvageXP)
Vector2f getLocationInHyperspace()
MemoryAPI getMemoryWithoutUpdate()
void setMarket(MarketAPI market)
Map< String, Object > getCustomData()
void setDiscoveryXP(Float discoveryXP)
boolean isEnteredByPlayer()
void setHasSystemwideNebula(Boolean hasSystemwideNebula)
SectorEntityToken getCenter()
OnClickAction getOnClickAction(CoreUIAPI ui)
void setFontSmallInsignia()
ResourceCostPanelAPI addCostPanel(String title, float height, Color color, Color dark)
LabelAPI addParagraph(String text)
EncounterOption pickEncounterOption(FleetEncounterContextPlugin context, CampaignFleetAPI otherFleet)
TacticalModulePlugin getTacticalModule()
void setTarget(SectorEntityToken target)
void setPriorityTarget(SectorEntityToken priorityTarget, float duration, boolean followMode)
void addIntelToTextPanel(IntelInfoPlugin plugin, TextPanelAPI textPanel)
MutableStatWithTempMods getTradeModPlus()
MutableStatWithTempMods getTradeMod()
float getCombinedTradeModQuantity()
void addTradeMod(String source, float quantity, float days)
MutableStatWithTempMods getTradeModMinus()
float getModValueForQuantity(float quantity)
float getQuantityForModValue(float modValue)
List< MarketAPI > getMarketsCopy()
MarketAPI getMarket(String id)
void addMarket(MarketAPI market, boolean withJunkAndChatter)
List< MarketAPI > getMarketsInGroup(String group)
List< MarketAPI > getMarkets(LocationAPI loc)
void removeMarket(MarketAPI market)
float getWeightForMarketSize(float size)
IndustrySpecAPI getSpec()
PopulationComposition getPopulation()
void setSurveyLevel(SurveyLevel surveyLevel)
LocationAPI getContainingLocation()
SurveyLevel getSurveyLevel()
Industry instantiateIndustry(String id)
boolean isPlanetConditionMarketOnly()
void setFactionId(String factionId)
void setPlanetConditionMarketOnly(boolean isPlanetConditionMarketOnly)
void addSubmarket(String specId)
void setPrimaryEntity(SectorEntityToken primaryEntity)
Set< SectorEntityToken > getConnectedEntities()
MutableMarketStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
SubmarketAPI getSubmarket(String specId)
void addPerson(PersonAPI person)
StatBonus getAccessibilityMod()
CommDirectoryAPI getCommDirectory()
String addCondition(String id)
List< Industry > getIndustries()
List< PersonAPI > getPeopleCopy()
boolean hasCondition(String id)
void removePerson(PersonAPI person)
List< MarketConditionAPI > getConditions()
ConstructionQueue getConstructionQueue()
SectorEntityToken getPrimaryEntity()
SubmarketPlugin getPlugin()
CampaignEventPlugin startEvent(CampaignEventTarget eventTarget, String eventType, Object param)
CampaignEventPlugin getOngoingEvent(CampaignEventTarget eventTarget, String eventType)
float getFloat(String key)
Collection< String > getKeys()
String getString(String key)
float getExpire(String key)
void addRequired(String key, String requiredKey)
boolean contains(String key)
void removeAllRequired(String key)
void set(String key, Object value)
boolean is(String key, Object value)
Set< String > getRequired(String key)
boolean getBoolean(String key)
CampaignFleetAPI getFleet(String key)
String performTokenReplacement(String ruleId, String text, SectorEntityToken entity, Map< String, MemoryAPI > memoryMap)
DynamicStatsAPI getDynamic()
List< SkillLevelAPI > getSkillsCopy()
MutableStat getOfficerNumber()
void setStats(MutableCharacterStatsAPI stats)
void setMarket(MarketAPI market)
MutableCharacterStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
PersonalityAPI getPersonalityAPI()
CombatUIAPI getCombatUI()
boolean isAwareOf(int owner, CombatEntityAPI other)
List< ShipAPI > getAllShips()
List< ShipAPI > getShips()
boolean hasAttachedFloaty(CombatEntityAPI entity)
float getCollisionRadius()
float getAngularVelocity()
CombatEntityAPI getEntityToFollowV2()
float getOverloadTimeRemaining()
boolean isSModEffectAPenalty()
void giveCommand(ShipCommand command)
ShipEngineControllerAPI getEngineController()
MutableStat getNumFighterBays()
DynamicStatsAPI getDynamic()
FleetMemberAPI getFleetMember()
boolean isNonCombat(boolean considerOrders)
ShipHullSpecAPI getHullSpec()
MutableShipStatsAPI getMutableStats()
FleetMemberAPI getFleetMember()
FluxTrackerAPI getFluxTracker()
ShipVariantAPI getVariant()
ShipEngineControllerAPI getEngineController()
void giveCommand(ShipCommand command, Object param, int groupNumber)
float getTurnDeceleration()
boolean hasTag(String tag)
EnumSet< ShipTypeHints > getHints()
boolean isBuiltInMod(String modId)
ShipHullSpecAPI getDParentHull()
int getOrdnancePoints(MutableCharacterStatsAPI stats)
List< String > getBuiltInMods()
Collection< String > getHullMods()
boolean hasTag(String tag)
LinkedHashSet< String > getSMods()
boolean hasHullMod(String id)
ShipHullSpecAPI getHullSpec()
LinkedHashSet< String > getSModdedBuiltIns()
List< WeaponGroupSpec > getWeaponGroups()
Set< String > getPermaMods()
float getTotalDamageToArmor()
float getDamageToShields()
float getOverMaxDamageToShields()
float getFuelCostPerLightYear()
PersonAPI getFleetCommanderForStats()
ShipVariantAPI getVariant()
float getMemberStrength()
FleetDataAPI getFleetData()
float getDeploymentPointsCost()
void setFleetCommanderForStats(PersonAPI alternateFleetCommander, FleetDataAPI fleetForStats)
FleetMemberStatusAPI getStatus()
RepairTrackerAPI getRepairTracker()
ShipHullSpecAPI getHullSpec()
MutableShipStatsAPI getStats()
void applyDamage(float hitStrength)
void setHullFraction(float fraction)
DynamicStatsAPI getDynamic()
DynamicStatsAPI getDynamic()
void applyCREvent(float crChange, String description)
Color getAverageBrightColor()
boolean hasTag(String tag)
boolean isHiddenEverywhere()
HullModEffect getEffect()
boolean hasTag(String tag)
void init(CampaignFleetAPI fleet, PlanetAPI planet)
String getSurveyDataType(PlanetAPI planet)
float getValue(String id)
StatBonus getMod(String id)