Starsector API
Loading...
Searching...
No Matches
BaseSensorGhostCreator.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.ghosts;
2
3import java.util.List;
4import java.util.Random;
5
6import org.lwjgl.util.vector.Vector2f;
7
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
11import com.fs.starfarer.api.campaign.LocationAPI;
12import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
13import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
14import com.fs.starfarer.api.util.Misc;
15import com.fs.starfarer.api.util.WeightedRandomPicker;
16
18
19 public List<SensorGhost> createGhost(SensorGhostManager manager) {
20 return null;
21 }
22
23 public float getFrequency(SensorGhostManager manager) {
24 return 10f;
25 }
26
27 public String getId() {
28 return getClass().getSimpleName();
29 }
30
32 return 10f + manager.getRandom().nextFloat() * 10f;
33 }
34
35
36 public static Vector2f findClearHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random) {
37 return findHyperspaceArea(from, minRange, maxRange, radius, random, true, 0f);
38 }
39 public static Vector2f findDeepHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random) {
40 return findHyperspaceArea(from, minRange, maxRange, radius, random, false, 0f);
41 }
42 public static Vector2f findHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random, boolean clear, float noSlipstreamRange) {
43 if (random == null) random = Misc.random;
44
45 CampaignTerrainAPI terrain = Misc.getHyperspaceTerrain();
46 if (terrain == null) return null;
47
48 HyperspaceTerrainPlugin plugin = (HyperspaceTerrainPlugin) terrain.getPlugin();
49
50 int[][] tiles = plugin.getTiles();
51 float perTile = plugin.getTileSize();
52 int areaSize = (int) Math.ceil(radius / perTile);
53
54
55 Vector2f best = null;
56 float bestScore = 0f;
57
58 float total = (areaSize + areaSize + 1) * (areaSize + areaSize + 1);
59 if (total < 1f) total = 1f;
60 for (int k = 0; k < 20; k++) {
61 Vector2f test = Misc.getPointWithinRadiusUniform(from, minRange, maxRange, random);
62 int [] coords = plugin.getTile(test);
63 if (coords == null) continue;
64
65 if (noSlipstreamRange > 0) {
66 if (Misc.isInsideSlipstream(test, noSlipstreamRange)) continue;
67 }
68
69 float count = 0f;
70 for (int i = coords[0] - areaSize; i <= coords[0] + areaSize; i++) {
71 if (i < 0) continue;
72 if (i >= tiles.length) continue;
73 for (int j = coords[1] - areaSize; j < coords[1] + areaSize; j++) {
74 if (j < 0) continue;
75 if (j >= tiles[0].length) continue;
76
77 int texIndex = tiles[i][j];
78 if (clear) {
79 if (texIndex <= 0) {
80 count++;
81 }
82 } else {
83 if (texIndex > 0) {
84 count++;
85 }
86 }
87 }
88 }
89 float score = count / total;
90 if (score >= 0.75f && score > bestScore) {
91 best = test;
92 bestScore = score;
93 }
94 }
95
96 return best;
97 }
98
99 public static SlipstreamTerrainPlugin2 pickNearbySlipstream(float radius, Random random) {
100 return pickNearbySlipstream(radius, Global.getSector().getHyperspace(), random);
101 }
102 public static SlipstreamTerrainPlugin2 pickNearbySlipstream(float radius, LocationAPI location, Random random) {
103 WeightedRandomPicker<SlipstreamTerrainPlugin2> picker = new WeightedRandomPicker<SlipstreamTerrainPlugin2>(random);
104 CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
105 Vector2f loc = pf.getLocation();
106
107 for (CampaignTerrainAPI ter : location.getTerrainCopy()) {
108 if (ter.getPlugin() instanceof SlipstreamTerrainPlugin2) {
109 SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2) ter.getPlugin();
110 if (plugin.containsPoint(loc, radius)) {
111 float w = 1f;
112 if (plugin.isPreventedFromAffecting(pf)) {
113 w *= 0.25f; // more likely to pick the slipstream the player is in, if there is one
114 }
115 picker.add(plugin, w);
116 }
117 }
118 }
119 return picker.pick();
120 }
121
122 // moved to Misc
123// public static boolean isInsideSlipstream(Vector2f loc, float radius) {
124// return isInsideSlipstream(loc, radius, Global.getSector().getHyperspace());
125// }
126// public static boolean isInsideSlipstream(Vector2f loc, float radius, LocationAPI location) {
127// for (CampaignTerrainAPI ter : location.getTerrainCopy()) {
128// if (ter.getPlugin() instanceof SlipstreamTerrainPlugin2) {
129// SlipstreamTerrainPlugin2 plugin = (SlipstreamTerrainPlugin2) ter.getPlugin();
130// if (plugin.containsPoint(loc, radius)) {
131// return true;
132// }
133// }
134// }
135// return false;
136// }
137
139 return false;
140 }
141
142 public boolean canSpawnWhilePlayerInAbyss() {
143 return false;
144 }
145
147 return true;
148 }
149}
150
151
152
153
154
155
static SectorAPI getSector()
Definition Global.java:59
static Vector2f findClearHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random)
static Vector2f findHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random, boolean clear, float noSlipstreamRange)
static SlipstreamTerrainPlugin2 pickNearbySlipstream(float radius, LocationAPI location, Random random)
static SlipstreamTerrainPlugin2 pickNearbySlipstream(float radius, Random random)
static Vector2f findDeepHyperspaceArea(Vector2f from, float minRange, float maxRange, float radius, Random random)