Starsector API
Loading...
Searching...
No Matches
NPCHassler.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.util.List;
4
5import com.fs.starfarer.api.EveryFrameScript;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.FleetAssignment;
9import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
10import com.fs.starfarer.api.campaign.StarSystemAPI;
11import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
12import com.fs.starfarer.api.impl.campaign.HassleNPCScript.HassleParams;
13import com.fs.starfarer.api.impl.campaign.ids.Factions;
14import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
15import com.fs.starfarer.api.util.IntervalUtil;
16import com.fs.starfarer.api.util.Misc;
17import com.fs.starfarer.api.util.Misc.FleetFilter;
18import com.fs.starfarer.api.util.WeightedRandomPicker;
19
20public class NPCHassler implements EveryFrameScript {
21
22 protected CampaignFleetAPI fleet;
23 protected HassleParams params;
24 protected StarSystemAPI restrictTo;
25 protected IntervalUtil interval = new IntervalUtil(0.1f, 0.3f);
26
27 public NPCHassler(CampaignFleetAPI fleet) {
28 this(fleet, new HassleParams(), null);
29 }
30 public NPCHassler(CampaignFleetAPI fleet, StarSystemAPI restrictTo) {
31 this(fleet, new HassleParams(), restrictTo);
32 }
33 public NPCHassler(CampaignFleetAPI fleet, HassleParams params, StarSystemAPI restrictTo) {
34 this.fleet = fleet;
35 this.params = params;
36 this.restrictTo = restrictTo;
37 }
38
39 public HassleParams getParams() {
40 return params;
41 }
42
43 public void advance(float amount) {
44// if (!params.timeoutKey.startsWith("$")) {
45// params.timeoutKey = "$" + params.timeoutKey;
46// }
47
48 float days = Misc.getDays(amount);
49 interval.advance(days);
50 if (!interval.intervalElapsed()) return;
51
52 if (restrictTo != null && fleet.getContainingLocation() != restrictTo) return;
53 if (Global.getSector().getMemoryWithoutUpdate().contains(params.timeoutKey)) return;
54 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_SPECIAL_ACTION)) return;
55
56 if (fleet.getBattle() != null) return;
57 if (fleet.getAI() != null && (fleet.getAI().isFleeing() || fleet.getAI().isMaintainingContact())) {
58 return;
59 }
60 if (fleet.getCurrentAssignment() != null &&
61 fleet.getCurrentAssignment().getAssignment() == FleetAssignment.ORBIT_PASSIVE) {
62 return;
63 }
64
65
66 List<CampaignFleetAPI> targets = Misc.findNearbyFleets(fleet, 1000f, new FleetFilter() {
67 public boolean accept(CampaignFleetAPI other) {
68 return isTargetAllowed(other);
69 }
70 });
71
72 WeightedRandomPicker<CampaignFleetAPI> picker = new WeightedRandomPicker<CampaignFleetAPI>();
73 picker.addAll(targets);
74 CampaignFleetAPI target = picker.pick();
75 if (target != null) {
76 fleet.getContainingLocation().addScript(new HassleNPCScript(fleet, target));
77 float globalTimeout = params.minGlobalTimeout +
78 (params.maxGlobalTimeout - params.minGlobalTimeout) * (float) Math.random();
79 Global.getSector().getMemoryWithoutUpdate().set(params.timeoutKey, true, globalTimeout);
80 float targetTimeout = params.minTargetTimeout +
81 (params.maxTargetTimeout - params.minTargetTimeout) * (float) Math.random();
82 target.getMemoryWithoutUpdate().set(params.timeoutKey, true, targetTimeout);
83 }
84 }
85
86 protected boolean isTargetAllowed(CampaignFleetAPI target) {
87 if (target.isPlayerFleet() || target.getAI() == null) return false;
88 if (target.isHostileTo(fleet)) return false;
89 if (target.isStationMode()) return false;
90 if (target.getBattle() != null) return false;
91
92 if (target.getFaction() == fleet.getFaction()) return false;
93 if (target.getMemoryWithoutUpdate().contains(params.timeoutKey)) return false;
94
95 if (target.getAI() instanceof ModularFleetAIAPI) {
96 ModularFleetAIAPI ai = (ModularFleetAIAPI) target.getAI();
97 if (ai.isFleeing() || ai.isMaintainingContact()) return false;
98 if (fleet.getInteractionTarget() instanceof CampaignFleetAPI) return false;
99 }
100
101 if (!isTargetRightTypeOfFleet(target)) return false;
102
103 VisibilityLevel vis = target.getVisibilityLevelTo(fleet);
104 if (vis == VisibilityLevel.NONE) return false;
105 return true;
106 }
107
113 protected boolean isTargetRightTypeOfFleet(CampaignFleetAPI target) {
114 if (Misc.isTrader(target)) return true;
115 if (Misc.isPirate(target)) return false;
116 if (Misc.isPatrol(target) && !target.getFaction().isPlayerFaction()) return false;
117 if (Misc.isWarFleet(target)) return false;
118 if (target.getFaction().getCustomBoolean(Factions.CUSTOM_DECENTRALIZED)) return true;
119 return false;
120 }
121
122
123 public boolean isDone() {
124 return false;
125 }
126
127 public boolean runWhilePaused() {
128 return false;
129 }
130}
static SectorAPI getSector()
Definition Global.java:59
NPCHassler(CampaignFleetAPI fleet, StarSystemAPI restrictTo)
boolean isTargetAllowed(CampaignFleetAPI target)
boolean isTargetRightTypeOfFleet(CampaignFleetAPI target)
NPCHassler(CampaignFleetAPI fleet, HassleParams params, StarSystemAPI restrictTo)