1package com.fs.starfarer.api.impl.combat.dweller;
3import org.lwjgl.util.vector.Vector2f;
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.combat.CombatEngineAPI;
7import com.fs.starfarer.api.combat.ShipAPI;
8import com.fs.starfarer.api.combat.ShipCommand;
9import com.fs.starfarer.api.combat.ShipSystemAIScript;
10import com.fs.starfarer.api.combat.ShipSystemAPI;
11import com.fs.starfarer.api.combat.ShipwideAIFlags;
12import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
13import com.fs.starfarer.api.util.IntervalUtil;
14import com.fs.starfarer.api.util.Misc;
29 public static class SharedLungeAIData {
30 public float usedByMawToAttack;
31 public float usedByMawToPullBack;
35 String key =
"lunge_AI_shared";
38 data =
new SharedLungeAIData();
74 public void advance(
float amount, Vector2f missileDangerDir, Vector2f collisionDangerDir,
ShipAPI target) {
75 if (
ship ==
null)
return;
96 boolean forceUseForPullback = !isMaw && data.usedByMawToPullBack + 0.1f > now;
97 boolean forceUseForAttack = !isMaw && data.usedByMawToAttack + 0.1f > now;
103 forceUseForPullback =
true;
106 if (
tracker.intervalElapsed() || forceUseForPullback || forceUseForAttack) {
119 if (((hardFluxLevel >=
prevHardFluxLevel && hardFluxLevel >= 0.33f) || fluxLevel > 0.65f) &&
121 if (target !=
null) {
125 useSystemForPullback =
true;
132 useSystemForPullback |= forceUseForPullback;
134 if (useSystemForPullback) {
136 if (target !=
null) {
139 if (missileDangerDir !=
null) {
156 data.usedByMawToPullBack = now;
162 boolean useSystemForAttackOrMovement =
false;
165 float checkDist = 700f;
166 if (!isMaw && forceUseForAttack) checkDist = 300f;
167 boolean blocked =
false;
170 if (target !=
null) {
177 if (other.isFighter())
continue;
180 (!other.isHulk() || (isMaw && other.getMassWithModules() <
ship.
getMass() * 0.25f)) &&
181 (
ship.
getHullSize().ordinal() > other.getHullSize().ordinal() || (!isMaw && forceUseForAttack)) &&
190 if (dist > checkDist)
continue;
200 boolean aligned = speedInDir > speed * 0.65f && speed >=
ship.
getMaxSpeed() * 0.9f;
202 useSystemForAttackOrMovement = !blocked && aligned;
204 useSystemForAttackOrMovement =
false;
208 if (!isMaw) useSystemForAttackOrMovement =
false;
209 useSystemForAttackOrMovement |= (forceUseForAttack && !blocked);
212 if (useSystemForAttackOrMovement) {
224 data.usedByMawToAttack = now;
static CombatEngineAPI getCombatEngine()
void setFlag(AIFlags flag)
boolean hasFlag(AIFlags flag)
static float MAW_LUNGE_ARC
static float USE_SCORE_PER_USE
static float USE_SCORE_THRESHOLD
float sinceUsedForAttackOrMove
ConvulsiveLungeSystemScript script
float hullLevelAtPrevSystemUse
static float HULL_LOSS_FOR_PULLBACK
void giveCommand(Vector2f target)
static float MIN_AGGRO_USE_INTERVAL
void advance(float amount, Vector2f missileDangerDir, Vector2f collisionDangerDir, ShipAPI target)
void init(ShipAPI ship, ShipSystemAPI system, ShipwideAIFlags flags, CombatEngineAPI engine)
static SharedLungeAIData getSharedData()
float recentAggroUseScore
static boolean isMaw(ShipAPI ship)
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getAngleDiff(float from, float to)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
static float getAngleInDegrees(Vector2f v)
Map< String, Object > getCustomData()
float getTotalElapsedTime(boolean includePaused)
List< ShipAPI > getShips()
float getCollisionRadius()
boolean isOverloadedOrVenting()
FluxTrackerAPI getFluxTracker()
ShipwideAIFlags getAIFlags()
void giveCommand(ShipCommand command, Object param, int groupNumber)
ShipSystemStatsScript getScript()
float getCooldownRemaining()