Starsector API
Loading...
Searching...
No Matches
HassleNPCScript.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.util.Random;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.FleetAssignment;
11import com.fs.starfarer.api.campaign.ai.FleetAssignmentDataAPI;
12import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
13import com.fs.starfarer.api.impl.campaign.rulecmd.ApplyCRDamage;
14import com.fs.starfarer.api.util.IntervalUtil;
15import com.fs.starfarer.api.util.Misc;
16
23public class HassleNPCScript implements EveryFrameScript {
24
25 public static String HASSLE_ASSIGNMENT_ID = "hassle_assignment_id";
26
27 public static class HassleParams {
28 public String fleetAction = "conducting an inspection";
29 public String targetAction = "standing by for inspection";
30 public float minDurDays = 2f;
31 public float maxDurDays = 3f;
32 public float crDamageMult = 1f;
33
34 // used by NPCHassler, *not* by HassleNPCScript, but convenient to put here
35 public String timeoutKey = "$NPCHassleTimeout";
36 public float minGlobalTimeout = 1, maxGlobalTimeout = 2;
37 public float minTargetTimeout = 25, maxTargetTimeout = 35;
38 }
39
40 protected CampaignFleetAPI fleet;
41 protected CampaignFleetAPI target;
42 protected Vector2f loc1, loc2;
43 protected HassleParams params = new HassleParams();
44 protected float durDays = 3f;
45
46 private IntervalUtil interval = new IntervalUtil(0.1f, 0.3f);
47 boolean done = false;
48
49 public HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target) {
50 this(fleet, target, "conducting an inspection", "standing by for inspection");
51 }
52
53 public HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target, HassleParams params) {
54 this.fleet = fleet;
55 this.target = target;
56
57 this.params = params;
58
59 durDays = params.minDurDays + (params.maxDurDays - params.minDurDays) * (float) Math.random();
60 interval.forceIntervalElapsed();
61 }
62
63 public HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target, String fleetAction, String targetAction) {
64 this.fleet = fleet;
65 this.target = target;
66
67 this.params.fleetAction = fleetAction;
68 this.params.targetAction = targetAction;
69
70 durDays = params.minDurDays + (params.maxDurDays - params.minDurDays) * (float) Math.random();
71
72 interval.forceIntervalElapsed();
73 }
74
75
76 public float getDurDays() {
77 return durDays;
78 }
79
80 public void setDurDays(float durDays) {
81 this.durDays = durDays;
82 }
83
84 public void abort() {
85 done = true;
86
89 }
90
91 protected void cleanUpFleet(CampaignFleetAPI fleet) {
92 if (fleet.getAI() != null) {
93 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.FLEET_BUSY, "npc_hassle", false, 0f);
94 fleet.getMemoryWithoutUpdate().unset(MemFlags.FLEET_SPECIAL_ACTION);
95 fleet.getMemoryWithoutUpdate().unset(MemFlags.MEMORY_KEY_FLEET_DO_NOT_GET_SIDETRACKED);
96
97 FleetAssignmentDataAPI curr = fleet.getAI().getCurrentAssignment();
98 if (curr != null && HASSLE_ASSIGNMENT_ID.equals(curr.getCustom())) {
99 fleet.removeFirstAssignment();
100 }
101 }
102 }
103
104 public void advance(float amount) {
105 if (done) return;
106
107
108 if (target.isPlayerFleet()) {
109 abort();
110 return;
111 }
112 if (fleet.getBattle() != null || target.getBattle() != null) {
113 abort();
114 return;
115 }
116 if (fleet.getAI() != null && (fleet.getAI().isFleeing() || fleet.getAI().isMaintainingContact())) {
117 abort();
118 return;
119 }
120 if (target.getAI() != null && (target.getAI().isFleeing() || target.getAI().isMaintainingContact())) {
121 abort();
122 return;
123 }
124 if (fleet.getContainingLocation() != target.getContainingLocation()) {
125 abort();
126 return;
127 }
128 if (fleet.isHostileTo(target) || fleet.getFaction() == target.getFaction()) {
129 abort();
130 return;
131 }
132
133
134 float days = Global.getSector().getClock().convertToDays(amount);
135 durDays -= days;
136 if (durDays <= 0) {
137 abort();
138 if (params.crDamageMult > 0) {
139 float damageFP = fleet.getFleetPoints() * 0.2f;
140 ApplyCRDamage.applyCRDamage(target, damageFP, params.crDamageMult, "Vindictive inspection", null, new Random());
141 }
142 return;
143 }
144
145 if (loc1 == null) {
146 loc1 = new Vector2f(target.getLocation());
147 Vector2f.add(loc1, fleet.getLocation(), loc1);
148 loc1.scale(0.5f);
149 loc2 = Misc.getPointAtRadius(loc1, fleet.getRadius() + target.getRadius());
150 }
151
152 fleet.setMoveDestinationOverride(loc2.x, loc2.y);
153 target.setMoveDestinationOverride(loc1.x, loc1.y);
154
155 interval.advance(days);
156 if (!interval.intervalElapsed()) return;
157
158
159
160 if (fleet.getAI() != null) {
161 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(), MemFlags.FLEET_BUSY, "npc_hassle", true, 0.4f);
162 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_FLEET_DO_NOT_GET_SIDETRACKED, true, 0.4f);
163 fleet.getMemoryWithoutUpdate().set(MemFlags.FLEET_SPECIAL_ACTION, true, 0.4f);
164 FleetAssignmentDataAPI curr = fleet.getAI().getCurrentAssignment();
165 if (curr == null || !HASSLE_ASSIGNMENT_ID.equals(curr.getCustom())) {
166 fleet.clearAssignments();
167 fleet.addAssignmentAtStart(FleetAssignment.HOLD, null, durDays + 1f, params.fleetAction, null);
168 fleet.getCurrentAssignment().setCustom(HASSLE_ASSIGNMENT_ID);
169 }
170 }
171 if (target.getAI() != null) {
172 Misc.setFlagWithReason(target.getMemoryWithoutUpdate(), MemFlags.FLEET_BUSY, "npc_hassle", true, 0.4f);
173 target.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_FLEET_DO_NOT_GET_SIDETRACKED, true, 0.4f);
174 target.getMemoryWithoutUpdate().set(MemFlags.FLEET_SPECIAL_ACTION, true, 0.4f);
175
176 FleetAssignmentDataAPI curr = target.getAI().getCurrentAssignment();
177 curr = null;
178 if (curr == null || !HASSLE_ASSIGNMENT_ID.equals(curr.getCustom())) {
179 target.clearAssignments();
180 target.addAssignmentAtStart(FleetAssignment.HOLD, null, durDays + 1f, params.targetAction, null);
181 target.getCurrentAssignment().setCustom(HASSLE_ASSIGNMENT_ID);
182 }
183 }
184 }
185
186 public boolean isDone() {
187 return done;
188 }
189
190 public boolean runWhilePaused() {
191 return false;
192 }
193
194 public float getCrDamageMult() {
195 return params.crDamageMult;
196 }
197
198 public void setCrDamageMult(float crDamageMult) {
199 this.params.crDamageMult = crDamageMult;
200 }
201
202 public HassleParams getParams() {
203 return params;
204 }
205
206
207}
208
209
210
211
212
213
214
215
216
217
218
219
220
static SectorAPI getSector()
Definition Global.java:59
HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target, String fleetAction, String targetAction)
HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target)
HassleNPCScript(CampaignFleetAPI fleet, CampaignFleetAPI target, HassleParams params)