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
27
29
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() {
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
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
81
83// if (true) {
84// return Global.getSector().getEconomy().getMarket("jangala");
85// }
86
88
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
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) {
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;
199
200 if (fleet == null || fleet.isEmpty()) return null;
201
202 fleet.setFaction(Factions.INDEPENDENT, true);
203
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:65
static CampaignFleetAPI createFleet(FleetParamsV3 params)
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
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)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:602
static void makeLowRepImpact(CampaignFleetAPI fleet, String reason)
Definition Misc.java:1465
void setFaction(String factionId, boolean includeCaptains)
List< SectorEntityToken > getEntitiesWithTag(String tag)
void addScript(EveryFrameScript script)
void set(String key, Object value)