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