Starsector API
Loading...
Searching...
No Matches
RuinsFleetRouteManager.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen.themes;
2
3import java.util.Random;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.StarSystemAPI;
10import com.fs.starfarer.api.campaign.econ.MarketAPI;
11import com.fs.starfarer.api.impl.campaign.fleets.BaseRouteFleetManager;
12import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
13import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
14import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
15import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
16import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
17import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
18import com.fs.starfarer.api.impl.campaign.ids.Factions;
19import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
20import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
21import com.fs.starfarer.api.impl.campaign.ids.Tags;
22import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
23import com.fs.starfarer.api.util.Misc;
24import com.fs.starfarer.api.util.WeightedRandomPicker;
25
26public class RuinsFleetRouteManager extends BaseRouteFleetManager {
27
28 protected StarSystemAPI system;
29
30 public RuinsFleetRouteManager(StarSystemAPI system) {
31 super(1f, 14f);
32 this.system = system;
33 }
34
35 protected String getRouteSourceId() {
36 return "salvage_" + system.getId();
37 }
38
39 protected int getMaxFleets() {
40 //if (true) return 0;
41
43 return (int) (1 + Math.min(salvage / 2, 7));
44 }
45
46 protected void addRouteFleetIfPossible() {
47 if (TutorialMissionIntel.isTutorialInProgress()) {
48 return;
49 }
50
51 MarketAPI market = pickSourceMarket();
52 if (market == null) return;
53
54 Long seed = new Random().nextLong();
55 String id = getRouteSourceId();
56
57 OptionalFleetData extra = new OptionalFleetData(market);
58
59 RouteData route = RouteManager.getInstance().addRoute(id, market, seed, extra, this);
60
61 float distLY = Misc.getDistanceLY(market.getLocationInHyperspace(), system.getLocation());
62 float travelDays = distLY * 1.5f;
63
64 float prepDays = 2f + (float) Math.random() * 3f;
65 float endDays = 8f + (float) Math.random() * 3f; // longer since includes time from jump-point to source
66
67 float totalTravelTime = prepDays + endDays + travelDays * 2f;
68 float stayDays = Math.max(20f, totalTravelTime);
69
70 route.addSegment(new RouteSegment(prepDays, market.getPrimaryEntity()));
71 route.addSegment(new RouteSegment(travelDays, market.getPrimaryEntity(), system.getCenter()));
72 route.addSegment(new RouteSegment(stayDays, system.getCenter()));
73 route.addSegment(new RouteSegment(travelDays, system.getCenter(), market.getPrimaryEntity()));
74 route.addSegment(new RouteSegment(endDays, market.getPrimaryEntity()));
75 }
76
77
78 public static float getVeryApproximateSalvageValue(StarSystemAPI system) {
79 return system.getEntitiesWithTag(Tags.SALVAGEABLE).size();
80 }
81
82 public MarketAPI pickSourceMarket() {
83// if (true) {
84// return Global.getSector().getEconomy().getMarket("jangala");
85// }
86
87 WeightedRandomPicker<MarketAPI> markets = new WeightedRandomPicker<MarketAPI>();
88
89 for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
90 if (market.getFaction().isHostileTo(Factions.INDEPENDENT)) continue;
91 if (market.getContainingLocation() == null) continue;
92 if (market.getContainingLocation().isHyperspace()) continue;
93 if (market.isHidden()) continue;
94
95 float distLY = Misc.getDistanceLY(system.getLocation(), market.getLocationInHyperspace());
96 float weight = market.getSize();
97
98 float f = Math.max(0.1f, 1f - Math.min(1f, distLY / 20f));
99 f *= f;
100 weight *= f;
101
102 markets.add(market, weight);
103 }
104
105 return markets.pick();
106 }
107
108
109 public CampaignFleetAPI spawnFleet(RouteData route) {
110 Random random = route.getRandom();
111
112 WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(random);
113 picker.add(FleetTypes.SCAVENGER_SMALL, 10f);
114 picker.add(FleetTypes.SCAVENGER_MEDIUM, 15f);
115 picker.add(FleetTypes.SCAVENGER_LARGE, 5f);
116
117 String type = picker.pick();
118
119 boolean pirate = random.nextBoolean();
120 CampaignFleetAPI fleet = createScavenger(type, system.getLocation(), route, route.getMarket(), pirate, random);
121 if (fleet == null) return null;;
122
123 fleet.addScript(new ScavengerFleetAssignmentAI(fleet, route, pirate));
124
125 return fleet;
126 }
127
128 public static CampaignFleetAPI createScavenger(String type, Vector2f locInHyper, MarketAPI source, boolean pirate, Random random) {
129 return createScavenger(type, locInHyper, null, source, pirate, random);
130 }
131 public static CampaignFleetAPI createScavenger(String type, Vector2f locInHyper, RouteData route, MarketAPI source, boolean pirate, Random random) {
132 if (random == null) random = new Random();
133
134
135 if (type == null) {
136 WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(random);
137 picker.add(FleetTypes.SCAVENGER_SMALL, 10f);
138 picker.add(FleetTypes.SCAVENGER_MEDIUM, 15f);
139 picker.add(FleetTypes.SCAVENGER_LARGE, 5f);
140 type = picker.pick();
141 }
142
143
144 int combat = 0;
145 int freighter = 0;
146 int tanker = 0;
147 int transport = 0;
148 int utility = 0;
149
150
151 if (type.equals(FleetTypes.SCAVENGER_SMALL)) {
152 combat = random.nextInt(2) + 1;
153 tanker = random.nextInt(2) + 1;
154 utility = random.nextInt(2) + 1;
155 } else if (type.equals(FleetTypes.SCAVENGER_MEDIUM)) {
156 combat = 4 + random.nextInt(5);
157 freighter = 4 + random.nextInt(5);
158 tanker = 3 + random.nextInt(4);
159 transport = random.nextInt(2);
160 utility = 2 + random.nextInt(3);
161 } else if (type.equals(FleetTypes.SCAVENGER_LARGE)) {
162 combat = 7 + random.nextInt(8);
163 freighter = 6 + random.nextInt(7);
164 tanker = 5 + random.nextInt(6);
165 transport = 3 + random.nextInt(8);
166 utility = 4 + random.nextInt(5);
167 }
168
169 if (pirate) {
170// combat += transport;
171// combat += utility;
172 transport = utility = 0;
173 }
174
175 combat *= 5f;
176 freighter *= 3f;
177 tanker *= 3f;
178 transport *= 1.5f;
179
180 FleetParamsV3 params = new FleetParamsV3(
181 route != null ? route.getMarket() : source,
182 locInHyper,
183 Factions.SCAVENGERS, // quality will always be reduced by non-market-faction penalty, which is what we want
184 route == null ? null : route.getQualityOverride(),
185 type,
186 combat, // combatPts
187 freighter, // freighterPts
188 tanker, // tankerPts
189 transport, // transportPts
190 0f, // linerPts
191 utility, // utilityPts
192 0f // qualityMod
193 );
194 if (route != null) {
195 params.timestamp = route.getTimestamp();
196 }
197 params.random = random;
198 CampaignFleetAPI fleet = FleetFactoryV3.createFleet(params);
199
200 if (fleet == null || fleet.isEmpty()) return null;
201
202 fleet.setFaction(Factions.INDEPENDENT, true);
203
204 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_SCAVENGER, true);
205
206 if (pirate || true) {
207 Misc.makeLowRepImpact(fleet, "scav");
208 }
209
210 return fleet;
211 }
212
213 public boolean shouldCancelRouteAfterDelayCheck(RouteData data) {
214 return false;
215 }
216
217 public boolean shouldRepeat(RouteData route) {
218 return false;
219 }
220
221 public void reportAboutToBeDespawnedByRouteManager(RouteData route) {
222
223 }
224}
225
226
227
228
229
230
231
static SectorAPI getSector()
Definition Global.java:59
static CampaignFleetAPI createScavenger(String type, Vector2f locInHyper, MarketAPI source, boolean pirate, Random random)
static CampaignFleetAPI createScavenger(String type, Vector2f locInHyper, RouteData route, MarketAPI source, boolean pirate, Random random)