001package com.fs.starfarer.api.impl.campaign;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.EveryFrameScript;
006import com.fs.starfarer.api.Script;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken;
009import com.fs.starfarer.api.util.Misc;
010
011public class LeashScript implements EveryFrameScript {
012
013        private CampaignFleetAPI fleet;
014        private float range;
015        private Script onBroken;
016
017        private SectorEntityToken anchor;
018        private Vector2f offset;
019        
020        public LeashScript(CampaignFleetAPI fleet, float range, SectorEntityToken anchor, Vector2f offset, Script onBroken) {
021                this.fleet = fleet;
022                this.range = range;
023                this.onBroken = onBroken;
024                this.anchor = anchor;
025                this.offset = offset;
026        }
027
028        private boolean broken = false;
029        public void advance(float amount) {
030                if (fleet.getContainingLocation() != anchor.getContainingLocation()) {
031                        broken = true;
032                        onBroken.run();
033                }
034                if (broken) return;
035                
036                
037                Vector2f dest = new Vector2f(anchor.getLocation().x + offset.x, anchor.getLocation().y + offset.y);
038                float distToDest = Misc.getDistance(dest, fleet.getLocation());
039                fleet.setMoveDestination(dest.x, dest.y);
040                if (distToDest < 2) {
041                        fleet.setLocation(dest.x, dest.y);
042                }
043                
044                float dist = Misc.getDistance(anchor.getLocation(), fleet.getLocation());
045                if (dist > range + anchor.getRadius() + fleet.getRadius()) {
046                        broken = true;
047                        onBroken.run();
048                }
049                
050        }
051        
052        public boolean isDone() {
053                return broken;
054        }
055
056        public boolean runWhilePaused() {
057                return false;
058        }
059}
060
061
062
063
064