001package com.fs.starfarer.api.impl.campaign.ghosts;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.campaign.SectorEntityToken;
006import com.fs.starfarer.api.util.IntervalUtil;
007import com.fs.starfarer.api.util.Misc;
008
009
010public class GBDartAround extends BaseGhostBehavior {
011        
012        protected SectorEntityToken other;
013        protected int maxBurn;
014        protected float desiredRange;
015        protected float desiredRangeMin;
016        protected float desiredRangeMax;
017        protected IntervalUtil interval = new IntervalUtil(5f, 10f);
018        protected float angleOffset = 0f;
019        protected Vector2f dest = new Vector2f();
020        
021        public GBDartAround(SectorEntityToken other, float duration, int maxBurn, float desiredRangeMin, float desiredRangeMax) {
022                super(duration);
023                this.other = other;
024                this.maxBurn = maxBurn;
025                this.desiredRangeMin = desiredRangeMin;
026                this.desiredRangeMax = desiredRangeMax;
027                interval.forceIntervalElapsed();
028        }
029
030        @Override
031        public void advance(float amount, SensorGhost ghost) {
032                if (other.getContainingLocation() != ghost.getEntity().getContainingLocation() || !other.isAlive()) {
033                        end();
034                        return;
035                }
036                super.advance(amount, ghost);
037                
038                float mult = 1f;
039                if (maxBurn >= 25f) mult = 3f;
040                else if (maxBurn >= 15f) mult = 2f;
041                else mult = 1.5f;
042                interval.advance(amount * mult);
043                if (interval.intervalElapsed()) {
044                        angleOffset = (float) Math.random() * 360f;
045                        desiredRange = desiredRangeMin + (desiredRangeMax - desiredRangeMin) * (float) Math.random();
046                        dest = Misc.getUnitVectorAtDegreeAngle(
047                                        angleOffset + Misc.getAngleInDegrees(other.getLocation(), ghost.getEntity().getLocation()));
048                        dest.scale(desiredRange + other.getRadius() + ghost.getEntity().getRadius());
049                        Vector2f.add(dest, other.getLocation(), dest);
050                }
051                
052                if (Misc.getDistance(dest, ghost.getEntity().getLocation()) < 10f) {
053                        interval.forceIntervalElapsed();
054                }
055                
056                ghost.moveTo(dest, new Vector2f(), maxBurn);
057        }
058        
059        
060        
061}
062
063
064
065
066
067
068
069
070
071
072
073
074