Starsector API
Loading...
Searching...
No Matches
PatrolAssignmentAIV2.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.fleets;
2
3import com.fs.starfarer.api.EveryFrameScript;
4import com.fs.starfarer.api.campaign.CampaignFleetAPI;
5import com.fs.starfarer.api.campaign.FleetAssignment;
6import com.fs.starfarer.api.campaign.FleetOrStubAPI;
7import com.fs.starfarer.api.campaign.FleetStubAPI;
8import com.fs.starfarer.api.campaign.SectorEntityToken;
9import com.fs.starfarer.api.campaign.StarSystemAPI;
10import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManagerV2.PatrolFleetData;
11import com.fs.starfarer.api.util.WeightedRandomPicker;
12
13public class PatrolAssignmentAIV2 implements EveryFrameScript {
14
15 private FleetStubAPI stub;
16 private PatrolFleetData data;
17
18 //private IntervalUtil tracker = new IntervalUtil(0.5f, 1.5f);
19
20 public PatrolAssignmentAIV2(FleetStubAPI stub, PatrolFleetData data) {
21 this.stub = stub;
22 this.data = data;
23 giveInitialAssignment();
24 }
25
26 private void giveInitialAssignment() {
27 float daysToOrbit = getDaysToOrbit() * 0.25f;
28 if (daysToOrbit < 0.2f) {
29 daysToOrbit = 0.2f;
30 }
31 FleetOrStubAPI fleet = getAssignable();
32 //fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
33 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
34 "preparing for patrol duty");
35 }
36
37 private FleetOrStubAPI getAssignable() {
38 FleetOrStubAPI fleet = stub;
39 if (stub.getFleet() != null) {
40 fleet = stub.getFleet();
41 }
42 return fleet;
43 }
44
45 private boolean orderedReturn = false;
46 public void advance(float amount) {
47 //float days = Global.getSector().getClock().convertToDays(amount);
48
49 FleetOrStubAPI fleet = getAssignable();
50
51 if (fleet.getCurrentAssignment() != null) {
52 if (fleet instanceof CampaignFleetAPI) {
53 float fp = ((CampaignFleetAPI)fleet).getFleetPoints();
54 if (fp < data.startingFleetPoints && !orderedReturn) {
55 orderedReturn = true;
56 fleet.clearAssignments();
57
58 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
59 "returning to " + data.sourceMarket.getName());
60 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), 1f,
61 "standing down from patrol duty");
62 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, data.sourceMarket.getPrimaryEntity(), 1000);
63 }
64 }
65 } else {
66 float daysToOrbit = getDaysToOrbit();
67 StarSystemAPI system = data.sourceMarket.getStarSystem();
68 if (system == null) {
69 fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, data.sourceMarket.getPrimaryEntity(), 20,
70 "patrolling around " + data.sourceMarket.getName());
71 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
72 "returning to " + data.sourceMarket.getName());
73 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
74 "standing down from patrol duty");
75 } else {
76 if ((float) Math.random() > 0.95f) {
77 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getHyperspaceAnchor(), 20,
78 "patrolling around the " + system.getBaseName() + " star system");
79 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
80 "returning to " + data.sourceMarket.getName());
81 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
82 "standing down from patrol duty");
83 } else {
84 WeightedRandomPicker<SectorEntityToken> defenseTargets = new WeightedRandomPicker<SectorEntityToken>();
85 SectorEntityToken generalPatrol = data.sourceMarket.getPrimaryEntity().getContainingLocation().createToken(0, 0);
86
87 defenseTargets.add(generalPatrol, 30);
88
89 SectorEntityToken pick = defenseTargets.pick();
90
91 if (pick == generalPatrol) {
92 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getStar(), 30,
93 "patrolling the " + system.getBaseName() + " star system");
94 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
95 "returning to " + data.sourceMarket.getName());
96 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
97 "standing down from patrol duty");
98 } else {
99 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