001package com.fs.starfarer.api.impl.campaign.world;
002
003import java.awt.Color;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.FleetAssignment;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI;
011import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
012import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI;
013import com.fs.starfarer.api.util.IntervalUtil;
014import com.fs.starfarer.api.util.Misc;
015
016public class ZigLeashAssignmentAI extends BaseAssignmentAI {
017
018        protected float elapsed = 0f;
019        protected float dur = 30f + (float) Math.random() * 20f;
020        protected SectorEntityToken toGuard;
021        
022        protected IntervalUtil moteSpawn = new IntervalUtil(0.01f, 0.1f);
023        
024        public ZigLeashAssignmentAI(CampaignFleetAPI fleet, SectorEntityToken toGuard) {
025                super();
026                this.fleet = fleet;
027                this.toGuard = toGuard;
028                
029                giveInitialAssignments();
030        }
031
032        @Override
033        protected void giveInitialAssignments() {
034                pickNext();
035        }
036
037        @Override
038        protected void pickNext() {
039                fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, toGuard, 100f);
040        }
041
042        @Override
043        public void advance(float amount) {
044                super.advance(amount);
045                
046//              if (fleet.getCurrentAssignment() == null || fleet.getCurrentAssignment().getAssignment() != FleetAssignment.HOLD) {
047//                      fleet.addAssignmentAtStart(FleetAssignment.HOLD, null, 1000f, null);
048//              }
049                
050                if (toGuard != null) {
051                        float dist = Misc.getDistance(fleet.getLocation(), toGuard.getLocation());
052                        if (dist > toGuard.getRadius() + fleet.getRadius() + 1500 && 
053                                        fleet.getAI().getCurrentAssignmentType() == FleetAssignment.ORBIT_AGGRESSIVE) {
054                                fleet.addAssignmentAtStart(FleetAssignment.ORBIT_PASSIVE, toGuard, 1f, null);
055                                CampaignFleetAIAPI ai = fleet.getAI();
056                                if (ai instanceof ModularFleetAIAPI) {
057                                        // needed to interrupt an in-progress pursuit
058                                        ModularFleetAIAPI m = (ModularFleetAIAPI) ai;
059                                        m.getStrategicModule().getDoNotAttack().add(m.getTacticalModule().getTarget(), 1f);
060                                        m.getTacticalModule().setTarget(null);
061                                }
062                        }
063                }
064                
065                float days = Misc.getDays(amount);
066                moteSpawn.advance(days * 1f);
067                if (moteSpawn.intervalElapsed()) {
068                        spawnMote(fleet);
069                }
070        }
071
072        
073        public static void spawnMote(SectorEntityToken from) {
074                if (!from.isInCurrentLocation()) return;
075                
076                float dur = 1f + 2f * (float) Math.random();
077                dur *= 2f;
078                float size = 3f + (float) Math.random() * 5f;
079                size *= 3f;
080                Color color = new Color(255,100,255,175);
081                
082                Vector2f loc = Misc.getPointWithinRadius(from.getLocation(), from.getRadius());
083                Vector2f vel = Misc.getUnitVectorAtDegreeAngle((float) Math.random() * 360f);
084                vel.scale(5f + (float) Math.random() * 10f);
085                Vector2f.add(vel, from.getVelocity(), vel);
086                Misc.addGlowyParticle(from.getContainingLocation(), loc, vel, size, 0.5f, dur, color);
087        }
088}
089
090
091
092
093
094
095
096
097
098
099
100