001package com.fs.starfarer.api.impl.campaign.procgen.themes; 002 003import java.util.Random; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.EveryFrameScript; 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.CampaignFleetAPI; 010import com.fs.starfarer.api.campaign.FleetAssignment; 011import com.fs.starfarer.api.campaign.SectorEntityToken; 012import com.fs.starfarer.api.campaign.StarSystemAPI; 013import com.fs.starfarer.api.util.Misc; 014 015public class RemnantAssignmentAI implements EveryFrameScript { 016 017 protected StarSystemAPI homeSystem; 018 protected CampaignFleetAPI fleet; 019 protected SectorEntityToken source; 020 021 022 public RemnantAssignmentAI(CampaignFleetAPI fleet, StarSystemAPI homeSystem, SectorEntityToken source) { 023 this.fleet = fleet; 024 this.homeSystem = homeSystem; 025 this.source = source; 026 027 giveInitialAssignments(); 028 } 029 030 protected void giveInitialAssignments() { 031 boolean playerInSameLocation = fleet.getContainingLocation() == Global.getSector().getCurrentLocation(); 032 033 // launch from source if player is in-system, or sometimes 034 if ((playerInSameLocation || (float) Math.random() < 0.1f) && source != null) { 035 fleet.setLocation(source.getLocation().x, source.getLocation().y); 036 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, source, 3f + (float) Math.random() * 2f); 037 } else { 038 // start at random location 039 SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), homeSystem, fleet); 040 if (target != null) { 041 Vector2f loc = Misc.getPointAtRadius(target.getLocation(), target.getRadius() + 100f); 042 fleet.setLocation(loc.x, loc.y); 043 } else { 044 Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 5000f); 045 fleet.setLocation(loc.x, loc.y); 046 } 047 pickNext(); 048 } 049 } 050 051 protected void pickNext() { 052 boolean standDown = source != null && (float) Math.random() < 0.2f; 053 if (!standDown) { 054 SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), homeSystem, fleet); 055 if (target != null) { 056 float speed = Misc.getSpeedForBurnLevel(8); 057 float dist = Misc.getDistance(fleet.getLocation(), target.getLocation()); 058 float seconds = dist / speed; 059 float days = seconds / Global.getSector().getClock().getSecondsPerDay(); 060 days += 5f + 5f * (float) Math.random(); 061 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, target, days, "patrolling"); 062 return; 063 } else { 064 float days = 5f + 5f * (float) Math.random(); 065 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, null, days, "patrolling"); 066 } 067 } 068 069 if (source != null) { 070 float dist = Misc.getDistance(fleet.getLocation(), source.getLocation()); 071 if (dist > 1000) { 072 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, source, 3f, "returning from patrol"); 073 } else { 074 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, source, 3f + (float) Math.random() * 2f, "standing down"); 075 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, source, 5f); 076 } 077 } 078 079 } 080 081 public void advance(float amount) { 082 if (fleet.getCurrentAssignment() == null) { 083 pickNext(); 084 } 085 } 086 087 088 089 public boolean isDone() { 090 return false; 091 } 092 093 public boolean runWhilePaused() { 094 return false; 095 } 096 097 098 099} 100 101 102 103 104 105 106 107 108 109