001package com.fs.starfarer.api.impl.campaign.fleets; 002 003import com.fs.starfarer.api.EveryFrameScript; 004import com.fs.starfarer.api.campaign.CampaignFleetAPI; 005import com.fs.starfarer.api.campaign.FleetAssignment; 006import com.fs.starfarer.api.campaign.FleetOrStubAPI; 007import com.fs.starfarer.api.campaign.FleetStubAPI; 008import com.fs.starfarer.api.campaign.SectorEntityToken; 009import com.fs.starfarer.api.campaign.StarSystemAPI; 010import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManagerV2.PatrolFleetData; 011import com.fs.starfarer.api.util.WeightedRandomPicker; 012 013public class PatrolAssignmentAIV2 implements EveryFrameScript { 014 015 private FleetStubAPI stub; 016 private PatrolFleetData data; 017 018 //private IntervalUtil tracker = new IntervalUtil(0.5f, 1.5f); 019 020 public PatrolAssignmentAIV2(FleetStubAPI stub, PatrolFleetData data) { 021 this.stub = stub; 022 this.data = data; 023 giveInitialAssignment(); 024 } 025 026 private void giveInitialAssignment() { 027 float daysToOrbit = getDaysToOrbit() * 0.25f; 028 if (daysToOrbit < 0.2f) { 029 daysToOrbit = 0.2f; 030 } 031 FleetOrStubAPI fleet = getAssignable(); 032 //fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 033 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 034 "preparing for patrol duty"); 035 } 036 037 private FleetOrStubAPI getAssignable() { 038 FleetOrStubAPI fleet = stub; 039 if (stub.getFleet() != null) { 040 fleet = stub.getFleet(); 041 } 042 return fleet; 043 } 044 045 private boolean orderedReturn = false; 046 public void advance(float amount) { 047 //float days = Global.getSector().getClock().convertToDays(amount); 048 049 FleetOrStubAPI fleet = getAssignable(); 050 051 if (fleet.getCurrentAssignment() != null) { 052 if (fleet instanceof CampaignFleetAPI) { 053 float fp = ((CampaignFleetAPI)fleet).getFleetPoints(); 054 if (fp < data.startingFleetPoints && !orderedReturn) { 055 orderedReturn = true; 056 fleet.clearAssignments(); 057 058 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000, 059 "returning to " + data.sourceMarket.getName()); 060 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), 1f, 061 "standing down from patrol duty"); 062 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, data.sourceMarket.getPrimaryEntity(), 1000); 063 } 064 } 065 } else { 066 float daysToOrbit = getDaysToOrbit(); 067 StarSystemAPI system = data.sourceMarket.getStarSystem(); 068 if (system == null) { 069 fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, data.sourceMarket.getPrimaryEntity(), 20, 070 "patrolling around " + data.sourceMarket.getName()); 071 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000, 072 "returning to " + data.sourceMarket.getName()); 073 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 074 "standing down from patrol duty"); 075 } else { 076 if ((float) Math.random() > 0.95f) { 077 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getHyperspaceAnchor(), 20, 078 "patrolling around the " + system.getBaseName() + " star system"); 079 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000, 080 "returning to " + data.sourceMarket.getName()); 081 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 082 "standing down from patrol duty"); 083 } else { 084 WeightedRandomPicker<SectorEntityToken> defenseTargets = new WeightedRandomPicker<SectorEntityToken>(); 085 SectorEntityToken generalPatrol = data.sourceMarket.getPrimaryEntity().getContainingLocation().createToken(0, 0); 086 087 defenseTargets.add(generalPatrol, 30); 088 089 SectorEntityToken pick = defenseTargets.pick(); 090 091 if (pick == generalPatrol) { 092 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getStar(), 30, 093 "patrolling the " + system.getBaseName() + " star system"); 094 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000, 095 "returning to " + data.sourceMarket.getName()); 096 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 097 "standing down from patrol duty"); 098 } else { 099 fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, pick, 30, 100 "patrolling around " + pick.getName()); 101 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000, 102 "returning to " + data.sourceMarket.getName()); 103 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit, 104 "standing down from patrol duty"); 105 } 106 } 107 } 108 } 109 } 110 111 112 private float getDaysToOrbit() { 113 float daysToOrbit = 0f; 114 switch (data.type) { 115 case FAST: 116 daysToOrbit += 2f; 117 break; 118 case COMBAT: 119 daysToOrbit += 4f; 120 break; 121 case HEAVY: 122 daysToOrbit += 6f; 123 break; 124 } 125 126 daysToOrbit = daysToOrbit * (0.5f + (float) Math.random() * 0.5f); 127 return daysToOrbit; 128 } 129 130 public boolean isDone() { 131 return false; 132 } 133 public boolean runWhilePaused() { 134 return false; 135 } 136} 137 138 139 140 141 142 143