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 STANDING_OFF_VS_SHIP_ON_MAP_BORDER,
51 BACKING_OFF,
52 SAFE_VENT,
53 OK_TO_CANCEL_SYSTEM_USE_TO_VENT,
54
55 MANEUVER_RANGE_FROM_TARGET,
56
57 SAFE_FROM_DANGER_TIME,
58
59 PREFER_LEFT_BROADSIDE,
60 PREFER_RIGHT_BROADSIDE,
61
62 AUTO_FIRING_AT_PHASE_SHIP,
63 AUTO_BEAM_FIRING_AT_PHASE_SHIP,
64
65 DELAY_STRIKE_FIRE,
66
67 PHASE_ATTACK_RUN,
68 PHASE_ATTACK_RUN_FROM_BEHIND_DIST_CRITICAL,
69 PHASE_ATTACK_RUN_IN_GOOD_SPOT,
70 PHASE_ATTACK_RUN_TIMEOUT,
71
72 DO_NOT_PURSUE,
73
74
78 IN_CRITICAL_DPS_DANGER,
79 //MANEUVER_TARGET,
80
81
85 IN_ATTACK_RUN,
86 POST_ATTACK_RUN,
87 WANTED_TO_SLOW_DOWN,
88 FINISHED_SPREADING,
89 WING_NEAR_ENEMY,
90 WING_WAS_NEAR_ENEMY,
91 WING_SHOULD_GET_SOME_DISTANCE,
92
93
94 REACHED_WAYPOINT,
95 //ATTACK_RUN_WAYPOINT,
96
97
101 NEEDS_HELP,
102
103 SYSTEM_TARGET_COORDS,
104
105 BIGGEST_THREAT,
106
107 MOVEMENT_DEST,
108
109 HAS_POTENTIAL_MINE_TRIGGER_NEARBY,
110
111 TARGET_FOR_SHIP_SYSTEM,
112 }
113
114 public static final float FLAG_DURATION = 0.5f;
115
116 private class FlagData {
117 AIFlags flag;
118 float elapsed;
119 float durationOverride = 0;
120 Object custom;
121 private FlagData(AIFlags flag) {
122 super();
123 this.flag = flag;
124 }
125 }
126
127
128 private Map<AIFlags, FlagData> flags = new HashMap<AIFlags, FlagData>();
129
130 public void unsetFlag(AIFlags flag) {
131// if (flag == AIFlags.BACK_OFF) {
132// System.out.println("wefwefwefe");
133// }
134 flags.remove(flag);
135 }
136
137 public void setFlag(AIFlags flag) {
138// if (flag == AIFlags.BACK_OFF) {
139// System.out.println("fwfwefew");
140// }
141 FlagData data = flags.get(flag);
142 if (data != null) {
143 data.elapsed = 0;
144 } else {
145 flags.put(flag, new FlagData(flag));
146 }
147 }
148
149 public void setFlag(AIFlags flag, float duration) {
150 setFlag(flag, duration, null);
151 }
152
153 public void setFlag(AIFlags flag, float duration, Object custom) {
154// if (flag == AIFlags.DO_NOT_BACK_OFF) {
155// System.out.println("fwfwefew");
156// }
157 //if (flag == AIFlags.BACK_OFF) {
158// if (flag == AIFlags.CARRIER_FIGHTER_TARGET) {
159// System.out.println("fwfwefew");
160// }
161// if (flag == AIFlags.BACK_OFF) {
162// System.out.println("fwfwefew");
163// }
164// if (flag == AIFlags.DO_NOT_USE_SHIELDS) {
165// System.out.println("fwfwefew");
166// }
167 FlagData data = flags.get(flag);
168 if (data != null) {
169 data.elapsed = 0;
170 data.custom = custom;
171 } else {
172 data = new FlagData(flag);
173 data.durationOverride = duration;
174 data.custom = custom;
175 flags.put(flag, data);
176 }
177 }
178
179 public Object getCustom(AIFlags flag) {
180 FlagData data = flags.get(flag);
181 if (data != null) {
182 return data.custom;
183 }
184 return null;
185 }
186
187 public void removeFlag(AIFlags flag) {
188// if (flag == AIFlags.BACK_OFF) {
189// System.out.println("wefwefwefe");
190// }
191 flags.remove(flag);
192 }
193
194 public void advance(float amount) {
195 List<AIFlags> remove = new ArrayList<AIFlags>();
196 for (AIFlags flag : flags.keySet()) {
197 FlagData data = flags.get(flag);
198 data.elapsed += amount;
199 //if (data.elapsed > FLAG_DURATION && data.elapsed > data.durationOverride) {
200 if ((data.durationOverride <= 0 && data.elapsed > FLAG_DURATION) ||
201 (data.durationOverride > 0 && data.elapsed > data.durationOverride)) {
202 remove.add(flag);
203 }
204 }
205 for (AIFlags flag : remove) {
206// if (flag == AIFlags.BACK_OFF) {
207// System.out.println("wefwefwefe");
208// }
209 flags.remove(flag);
210 }
211 }
212
219 public boolean hasFlag(AIFlags flag) {
220 return flags.containsKey(flag);
221 }
222}
223
224
225
226
227
228
229
230
void setFlag(AIFlags flag, float duration, Object custom)
void setFlag(AIFlags flag, float duration)