001package com.fs.starfarer.api.impl.combat.dweller;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.combat.CombatEngineAPI;
007import com.fs.starfarer.api.combat.DamageType;
008import com.fs.starfarer.api.combat.ShipAIConfig;
009import com.fs.starfarer.api.combat.ShipAIPlugin;
010import com.fs.starfarer.api.combat.ShipAPI;
011import com.fs.starfarer.api.combat.ShipCommand;
012import com.fs.starfarer.api.combat.ShipwideAIFlags;
013import com.fs.starfarer.api.util.IntervalUtil;
014import com.fs.starfarer.api.util.Misc;
015
016public class ShroudedEjectaAI implements ShipAIPlugin {
017
018        public static class FlockingData {
019                public Vector2f loc;
020                public Vector2f vel;
021                public float minA;
022                public float maxA;
023                public float minR;
024                public float maxR;
025                public float repelAtAngleDist;
026                public float minC;
027                public float maxC;
028                public float attractWeight;
029                public float repelWeight;
030                public float cohesionWeight;
031                public float facing;
032        }       
033        
034        
035        /**
036         * Loses hitpoints over time and eventually dissipates.
037         */
038        public static float HULL_FRACTION_LOST_PER_SECOND = 0.0667f;
039        
040        protected ShipwideAIFlags flags = new ShipwideAIFlags();
041        protected ShipAPI ship;
042        protected boolean exploded = false;
043        protected float turnDir = 1f;
044        
045        protected IntervalUtil updateInterval = new IntervalUtil(0.5f, 1.5f);
046        
047        public ShroudedEjectaAI(ShipAPI ship) {
048                this.ship = ship;
049                
050                doInitialSetup();
051                
052                updateInterval.forceIntervalElapsed();
053        }
054        
055        protected void doInitialSetup() {
056                turnDir = Math.signum(0.5f - (float) Math.random() * 0.5f);
057                if (turnDir == 0) turnDir = 1f;
058        }
059        
060        @Override
061        public void advance(float amount) {
062                //if (true) return;
063                
064                updateInterval.advance(amount);
065                if (updateInterval.intervalElapsed()) {
066                }
067                
068                CombatEngineAPI engine = Global.getCombatEngine();
069                float damage = ship.getMaxHitpoints() * HULL_FRACTION_LOST_PER_SECOND * 1f * amount;
070                ship.setHitpoints(ship.getHitpoints() - damage);
071                if (ship.getHitpoints() <= 0f) {
072                        engine.applyDamage(ship, ship.getLocation(), 10000f, DamageType.ENERGY, 0f, true, false, ship, false);
073                }
074                
075                giveMovementCommands();
076        }
077        
078        protected void giveMovementCommands() {
079                CombatEngineAPI engine = Global.getCombatEngine();
080                
081                //ship.giveCommand(ShipCommand.DECELERATE, null, 0);
082//              if (turnDir < 0f) {
083//                      ship.giveCommand(ShipCommand.TURN_RIGHT, null, 0);
084//              } else {
085//                      ship.giveCommand(ShipCommand.TURN_LEFT, null, 0);
086//              }
087
088                if (ship.getVelocity().length() > ship.getMaxSpeedWithoutBoost() * 0.1f) {
089                        ship.giveCommand(ShipCommand.DECELERATE, null, 0);
090                }
091                
092                float heading = Misc.getAngleInDegrees(ship.getVelocity());
093                //engine.headInDirectionWithoutTurning(ship, desiredHeading, 10000);
094        }
095        
096        
097        @Override
098        public ShipwideAIFlags getAIFlags() {
099                return flags;
100        }
101        
102        
103        
104        public void setDoNotFireDelay(float amount) {}
105        public void forceCircumstanceEvaluation() {}
106        public boolean needsRefit() { return false; }
107        public void cancelCurrentManeuver() {}
108        public ShipAIConfig getConfig() { return null; }
109}
110
111
112
113
114
115
116
117
118
119
120
121
122