38 if (
entity.getContainingLocation() ==
null ||
entity.isInHyperspace())
return;
43 for (CampaignFleetAPI fleet :
entity.getContainingLocation().getFleets()) {
44 if (fleet.isInHyperspaceTransition())
continue;
46 if (fleet.getFaction() ==
entity.getFaction() || (
isHacked() && fleet.getFaction().isPlayerFaction())) {
47 if (reset && !fleet.getFaction().isPlayerFaction()) {
49 }
else if (reset && fleet.isPlayerFleet()) {
53 String desc =
"Sensor array";
56 desc =
"Makeshift sensor array";
66 StatMod curr = fleet.getStats().getSensorRangeMod().getFlatBonus(
id);
67 if (curr ==
null || curr.value <= bonus) {
68 fleet.getStats().addTemporaryModFlat(0.1f,
id,
70 fleet.getStats().getSensorRangeMod());
135 Random random = Misc.random;
137 MemoryAPI mem = fleet.getMemoryWithoutUpdate();
138 if (mem.getBoolean(MemFlags.FLEET_NOT_CHASING_GHOST)) {
141 if (mem.getBoolean(MemFlags.FLEET_CHASING_GHOST)) {
144 boolean spawnReading = random.nextFloat() < 0.5f;
147 mem.set(MemFlags.FLEET_NOT_CHASING_GHOST,
true, 1f + 2f * random.nextFloat());
151 float dur = 3f + 3f + random.nextFloat();
152 mem.set(MemFlags.FLEET_NOT_CHASING_GHOST,
true, dur * 0.5f);
154 BaseSensorGhost g =
new BaseSensorGhost(
null, 0);
156 float r = random.nextFloat();
159 g.initEntity(g.genMediumSensorProfile(), g.genSmallRadius(), 0, fleet.getContainingLocation());
160 maxBurn = 9 + random.nextInt(3);
161 }
else if (r < 0.6f) {
162 g.initEntity(g.genLargeSensorProfile(), g.genMediumRadius(), 0, fleet.getContainingLocation());
163 maxBurn = 8 + random.nextInt(3);
165 g.initEntity(g.genLargeSensorProfile(), g.genLargeRadius(), 0, fleet.getContainingLocation());
166 maxBurn = 7 + random.nextInt(3);
170 if (!g.placeNearPlayer()) {
176 float speed = Misc.getSpeedForBurnLevel(maxBurn);
177 float accelMult = speed / Misc.getSpeedForBurnLevel(20f);
178 if (accelMult < 0.1f) accelMult = 0.1f;
179 g.setAccelMult(1f/ accelMult);
181 float dir = Misc.getAngleInDegrees(g.getEntity().getLocation(), fleet.getLocation());
182 float sign = Math.signum(random.nextFloat() - 0.5f);
183 dir += sign * (30f + random.nextFloat() * 60f);
186 g.addBehavior(
new GBGoInDirection(dur, dir, maxBurn));
188 fleet.getContainingLocation().addScript(g);
193 if (fleet.isStationMode())
return;
194 if (fleet.getAI() ==
null) {
197 if (fleet.getAI().getAssignmentsCopy() ==
null) {
201 MemoryAPI mem = fleet.getMemoryWithoutUpdate();
202 if (mem.getBoolean(MemFlags.FLEET_NOT_CHASING_GHOST)) {
205 if (mem.getBoolean(MemFlags.FLEET_CHASING_GHOST)) {
208 if (mem.getBoolean(MemFlags.FLEET_BUSY)) {
211 boolean patrol = mem.getBoolean(MemFlags.MEMORY_KEY_PATROL_FLEET);
212 boolean warFleet = mem.getBoolean(MemFlags.MEMORY_KEY_WAR_FLEET);
213 boolean pirate = mem.getBoolean(MemFlags.MEMORY_KEY_PIRATE);
214 if (!patrol && !warFleet && !pirate) {
218 Random random = (Random) mem.get(MemFlags.FLEET_CHASING_GHOST_RANDOM);
219 if (random ==
null) {
220 random = Misc.getRandom(Misc.getSalvageSeed(fleet), 7);
221 mem.set(MemFlags.FLEET_CHASING_GHOST_RANDOM, random, 30f);
224 boolean willRespond = random.nextFloat() < 0.75f;
227 mem.set(MemFlags.FLEET_NOT_CHASING_GHOST,
true, 1f + 1f * random.nextFloat());
228 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
230 for (FleetAssignmentDataAPI curr : fleet.getAI().getAssignmentsCopy()) {
232 fleet.getAI().removeAssignment(curr);
238 float chaseDur = (2.5f + (float) Math.random()) * 2f;
239 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
241 mem.set(MemFlags.FLEET_BUSY,
true, chaseDur);
242 mem.set(MemFlags.FLEET_NOT_CHASING_GHOST,
true, chaseDur + 8f + 4f * random.nextFloat());
244 float angle = Misc.getAngleInDegrees(fleet.getLocation());
246 angle += arc/2f - arc * random.nextFloat();
247 float dist = 3000f + 3000f * random.nextFloat();
248 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(angle);
250 Vector2f.add(loc, fleet.getLocation(), loc);
253 String actionText =
"investigating anomalous sensor reading";
255 SectorEntityToken target = fleet.getContainingLocation().createToken(loc);
256 fleet.addAssignmentAtStart(FleetAssignment.PATROL_SYSTEM, target, 3f, actionText,
null);
257 FleetAssignmentDataAPI curr = fleet.getCurrentAssignment();
263 fleet.addAssignmentAtStart(FleetAssignment.GO_TO_LOCATION, target, 3f, actionText,
null);
264 curr = fleet.getCurrentAssignment();