Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package data.scripts.world.exipirated;
- import com.fs.starfarer.api.EveryFrameScript;
- import com.fs.starfarer.api.Global;
- import com.fs.starfarer.api.campaign.CampaignFleetAPI;
- import com.fs.starfarer.api.campaign.FleetAssignment;
- import com.fs.starfarer.api.campaign.SectorEntityToken;
- import com.fs.starfarer.api.campaign.StarSystemAPI;
- import com.fs.starfarer.api.campaign.econ.MarketAPI;
- import com.fs.starfarer.api.util.IntervalUtil;
- import com.fs.starfarer.api.util.Misc;
- import com.fs.starfarer.api.util.WeightedRandomPicker;
- import org.lazywizard.lazylib.MathUtils;
- import org.lwjgl.util.vector.Vector2f;
- public class ExipiratedCollectorAssignmentAI implements EveryFrameScript {
- private float daysTotal = 0f;
- private final CampaignFleetAPI fleet;
- private final float maxDays;
- private boolean orderedReturn = false;
- private boolean reachedSystem = false;
- private final MarketAPI sourceMarket;
- private final int startingFleetPoints;
- private StarSystemAPI system = null;
- private final IntervalUtil tracker = new IntervalUtil(0.5f, 1.5f);
- public ExipiratedCollectorAssignmentAI(CampaignFleetAPI fleet, MarketAPI market) {
- this.fleet = fleet;
- sourceMarket = market;
- maxDays = 60f;
- startingFleetPoints = fleet.getFleetPoints();
- giveInitialAssignment();
- }
- @Override
- public void advance(float amount) {
- boolean loiter = Avesta.getAvestaMovementScript().isLoitering();
- if (orderedReturn) {
- return;
- }
- float days = Global.getSector().getClock().convertToDays(amount);
- daysTotal += days;
- if (daysTotal > maxDays || !loiter) {
- giveReturnToSourceMarketOrders();
- return;
- }
- tracker.advance(days);
- if (tracker.intervalElapsed()) {
- if (system == fleet.getContainingLocation() && !reachedSystem) {
- reachedSystem = true;
- float nominalSpeed = Misc.getSpeedForBurnLevel(fleet.getFleetData().getMinBurnLevel() - 2);
- float nominalSpeedSq = nominalSpeed * nominalSpeed;
- float minDist = Float.MAX_VALUE;
- SectorEntityToken asteroid = null;
- for (SectorEntityToken roid : system.getAsteroids()) {
- if (roid.getVelocity().lengthSquared() >= nominalSpeedSq) {
- continue;
- }
- float dist = MathUtils.getDistance(roid, fleet);
- if (dist < minDist) {
- minDist = dist;
- asteroid = roid;
- }
- }
- if (asteroid == null) {
- giveReturnToSourceMarketOrders();
- return;
- }
- fleet.clearAssignments();
- fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, asteroid, 1000, "searching for asteroids");
- if (startingFleetPoints < 25f) {
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 5 + startingFleetPoints / 5f, "prospecting for hulls");
- } else if (startingFleetPoints < 50f) {
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 4 + startingFleetPoints / 5f, "gathering rocks");
- } else if (startingFleetPoints < 100f) {
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 3 + startingFleetPoints / 5f, "collecting starship resources");
- } else if (startingFleetPoints < 150f) {
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 2 + startingFleetPoints / 5f, "assembling core components");
- } else {
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, asteroid, 1 + startingFleetPoints / 5f, "constructing hull frames");
- }
- fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, sourceMarket.getPrimaryEntity(), 1000, "returning to " + sourceMarket.getName());
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), getDaysToOrbit() * 2f + 2f, "unloading at " +
- sourceMarket.getName());
- }
- }
- if (fleet.getAI().getCurrentAssignment() != null) {
- float fp = fleet.getFleetPoints();
- if (fp < startingFleetPoints * 0.75f) {
- giveReturnToSourceMarketOrders();
- }
- } else {
- system = pickNearbyStarSystemToCollect();
- if (system != null) {
- Vector2f dest = Misc.getPointAtRadius(system.getStar().getLocation(), MathUtils.getRandomNumberInRange(3000f, 7000f));
- SectorEntityToken token = system.createToken(dest.x, dest.y);
- if (system != fleet.getContainingLocation()) {
- fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, token, 1000,
- "travelling to the " + system.getBaseName() + " star system");
- }
- } else {
- giveReturnToSourceMarketOrders();
- }
- }
- }
- @Override
- public boolean isDone() {
- return false;
- }
- @Override
- public boolean runWhilePaused() {
- return false;
- }
- private float getDaysToOrbit() {
- return 0.5f + (float) Math.random() * 0.5f;
- }
- private void giveInitialAssignment() {
- float daysToOrbit = getDaysToOrbit();
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), daysToOrbit, "loading at " + sourceMarket.getName());
- }
- private void giveReturnToSourceMarketOrders() {
- if (!orderedReturn) {
- orderedReturn = true;
- fleet.clearAssignments();
- fleet.addAssignment(FleetAssignment.DELIVER_RESOURCES, sourceMarket.getPrimaryEntity(), 1000, "returning to " + sourceMarket.getName());
- fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, sourceMarket.getPrimaryEntity(), getDaysToOrbit(), "unloading at " + sourceMarket.getName());
- fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, sourceMarket.getPrimaryEntity(), 1000);
- }
- }
- private StarSystemAPI pickNearbyStarSystemToCollect() {
- WeightedRandomPicker<StarSystemAPI> picker = new WeightedRandomPicker<>();
- for (StarSystemAPI ss : Global.getSector().getStarSystems()) {
- float weight = ss.getAsteroids().size();
- float dist = Misc.getDistance(ss.getLocation(), fleet.getLocationInHyperspace());
- if (dist < 500f) {
- dist = 500f;
- }
- if (dist > 5000f) {
- continue;
- }
- weight *= Math.pow(5000f / dist, 1.5);
- picker.add(ss, weight);
- }
- StarSystemAPI ss = picker.pick();
- if (ss == null) {
- return null;
- }
- return ss;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement