Starsector API
Loading...
Searching...
No Matches
ShipwideAIFlags.java
Go to the documentation of this file.
1package com.fs.starfarer.api.combat;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7
8public class ShipwideAIFlags {
9 public static enum AIFlags {
10 //IS_ENGAGED,
11
12 HARASS_MOVE_IN,
13 HARASS_MOVE_IN_COOLDOWN,
14
15 AVOIDING_BORDER,
16 DO_NOT_AVOID_BORDER,
17 CAMP_LOCATION,
18 FACING_OVERRIDE_FOR_MOVE_AND_ESCORT_MANEUVERS,
19 ESCORT_OTHER_SHIP,
20 //PULL_BACK_FIGHTERS, // can do ship.setForceCarrierPullBackTime()
21
22
23
24 MANEUVER_TARGET,
25 MOVEMENT_DEST_WHILE_SIDETRACKED,
26 CARRIER_FIGHTER_TARGET,
27 MAINTAINING_STRIKE_RANGE,
28 //CARRIER_DEFEND_TARGET,
29 DRONE_MOTHERSHIP,
30
31 DO_NOT_USE_SHIELDS,
32 DO_NOT_USE_FLUX,
33 DO_NOT_VENT,
34 DO_NOT_AUTOFIRE_NON_ESSENTIAL_GROUPS,
35 RUN_QUICKLY,
36 TURN_QUICKLY,
37 PURSUING,
38 HAS_INCOMING_DAMAGE,
39 KEEP_SHIELDS_ON,
40 STAY_PHASED, // will not re-phase but should stay phased if cloak is on
41 PHASE_BRAWLER_DUMPING_FLUX, // will not re-phase but should stay phased if cloak is on
42 DO_NOT_BACK_OFF,
43
47 DO_NOT_BACK_OFF_EVEN_WHILE_VENTING,
48 BACK_OFF,
49 BACK_OFF_MIN_RANGE,
50 BACK_OFF_MAX_RANGE,
51 STANDING_OFF_VS_SHIP_ON_MAP_BORDER,
52 BACKING_OFF,
53 SAFE_VENT,
54 OK_TO_CANCEL_SYSTEM_USE_TO_VENT,
55
56 MANEUVER_RANGE_FROM_TARGET,
57
58 SAFE_FROM_DANGER_TIME,
59
60 PREFER_LEFT_BROADSIDE,
61 PREFER_RIGHT_BROADSIDE,
62
63 AUTO_FIRING_AT_PHASE_SHIP,
64 AUTO_BEAM_FIRING_AT_PHASE_SHIP,
65
66 DELAY_STRIKE_FIRE,
67
68 PHASE_ATTACK_RUN,
69 PHASE_ATTACK_RUN_FROM_BEHIND_DIST_CRITICAL,
70 PHASE_ATTACK_RUN_IN_GOOD_SPOT,
71 PHASE_ATTACK_RUN_TIMEOUT,
72
73 DO_NOT_PURSUE,
74
75 TIMID_ESCORT,
76 ESCORT_RANGE_MODIFIER,
77 IGNORES_ORDERS,
78
79
83 IN_CRITICAL_DPS_DANGER,
84 //MANEUVER_TARGET,
85
86
90 IN_ATTACK_RUN,
91 POST_ATTACK_RUN,
92 WANTED_TO_SLOW_DOWN,
93 FINISHED_SPREADING,
94 WING_NEAR_ENEMY,
95 WING_WAS_NEAR_ENEMY,
96 WING_SHOULD_GET_SOME_DISTANCE,
97
98
99 REACHED_WAYPOINT,
100 //ATTACK_RUN_WAYPOINT,
101
102
106 NEEDS_HELP,
107
108 SYSTEM_TARGET_COORDS,
109
110 BIGGEST_THREAT,
111
112 MOVEMENT_DEST,
113
114 HAS_POTENTIAL_MINE_TRIGGER_NEARBY,
115
116 TARGET_FOR_SHIP_SYSTEM,
117
118 CUSTOM1,
119 CUSTOM2,
120 CUSTOM3,
121 CUSTOM4,
122 CUSTOM5,
123 }
124
125 public static final float FLAG_DURATION = 0.5f;
126
127 private class FlagData {
128 AIFlags flag;
129 float elapsed;
130 float durationOverride = 0;
131 Object custom;
132 private FlagData(AIFlags flag) {
133 super();
134 this.flag = flag;
135 }
136 }
137
138
139 private Map<AIFlags, FlagData> flags = new HashMap<AIFlags, FlagData>();
140
141 public void unsetFlag(AIFlags flag) {
142// if (flag == AIFlags.BACK_OFF) {
143// System.out.println("wefwefwefe");
144// }
145 flags.remove(flag);
146 }
147
148 public void setFlag(AIFlags flag) {
149// if (flag == AIFlags.BACK_OFF) {
150// System.out.println("fwfwefew");
151// }
152 FlagData data = flags.get(flag);
153 if (data != null) {
154 data.elapsed = 0;
155 } else {
156 flags.put(flag, new FlagData(flag));
157 }
158 }
159
160 public void setFlag(AIFlags flag, float duration) {
161 setFlag(flag, duration, null);
162 }
163
164 public void setFlag(AIFlags flag, float duration, Object custom) {
165// if (flag == AIFlags.DO_NOT_BACK_OFF) {
166// System.out.println("fwfwefew");
167// }
168 //if (flag == AIFlags.BACK_OFF) {
169// if (flag == AIFlags.CARRIER_FIGHTER_TARGET) {
170// System.out.println("fwfwefew");
171// }
172// if (flag == AIFlags.BACK_OFF) {
173// System.out.println("fwfwefew");
174// }
175// if (flag == AIFlags.DO_NOT_USE_SHIELDS) {
176// System.out.println("fwfwefew");
177// }
178 FlagData data = flags.get(flag);
179 if (data != null) {
180 data.elapsed = 0;
181 data.custom = custom;
182 } else {
183 data = new FlagData(flag);
184 data.durationOverride = duration;
185 data.custom = custom;
186 flags.put(flag, data);
187 }
188 }
189
190 public Object getCustom(AIFlags flag) {
191 FlagData data = flags.get(flag);
192 if (data != null) {
193 return data.custom;
194 }
195 return null;
196 }
197
198 public void removeFlag(AIFlags flag) {
199// if (flag == AIFlags.BACK_OFF) {
200// System.out.println("wefwefwefe");
201// }
202 flags.remove(flag);
203 }
204
205 public void advance(float amount) {
206 List<AIFlags> remove = new ArrayList<AIFlags>();
207 for (AIFlags flag : flags.keySet()) {
208 FlagData data = flags.get(flag);
209 data.elapsed += amount;
210 //if (data.elapsed > FLAG_DURATION && data.elapsed > data.durationOverride) {
211 if ((data.durationOverride <= 0 && data.elapsed > FLAG_DURATION) ||
212 (data.durationOverride > 0 && data.elapsed > data.durationOverride)) {
213 remove.add(flag);
214 }
215 }
216 for (AIFlags flag : remove) {
217// if (flag == AIFlags.BACK_OFF) {
218// System.out.println("wefwefwefe");
219// }
220 flags.remove(flag);
221 }
222 }
223
230 public boolean hasFlag(AIFlags flag) {
231 return flags.containsKey(flag);
232 }
233}
234
235
236
237
238
239
240
241
void setFlag(AIFlags flag, float duration, Object custom)
void setFlag(AIFlags flag, float duration)