1package com.fs.starfarer.api.impl.campaign.fleets;
3import java.util.ArrayList;
5import java.util.Random;
7import org.apache.log4j.Logger;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.BattleAPI;
12import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
13import com.fs.starfarer.api.campaign.CampaignFleetAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
16import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
17import com.fs.starfarer.api.impl.campaign.fleets.PilgrimageFleetAssignmentAI.PilgrimageRouteData;
18import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
19import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
21import com.fs.starfarer.api.impl.campaign.ids.Conditions;
22import com.fs.starfarer.api.impl.campaign.ids.Factions;
23import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
24import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
25import com.fs.starfarer.api.impl.campaign.ids.Tags;
26import com.fs.starfarer.api.impl.campaign.missions.DelayedFleetEncounter;
27import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
28import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
29import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
30import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
31import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
32import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn;
33import com.fs.starfarer.api.impl.campaign.shared.SharedData;
34import com.fs.starfarer.api.util.Misc;
35import com.fs.starfarer.api.util.TimeoutTracker;
36import com.fs.starfarer.api.util.WeightedRandomPicker;
56 public static final String
SOURCE_ID =
"pilgrimage";
61 protected List<SectorEntityToken>
shrines =
null;
81 super.advance(amount);
97 int maxBasedOnMarkets = numMarkets * 1;
109 if (from !=
null && to !=
null) {
111 PilgrimageRouteData data =
createData(from, to);
112 if (data ==
null)
return;
114 log.info(
"Added shrine pilgrimage fleet route from " + from.getName() +
" to " + to.getName());
116 Long seed = Misc.genRandomSeed();
119 OptionalFleetData extra =
new OptionalFleetData(from);
122 String factionId = from.getFactionId();
132 extra.factionId = factionId;
135 route.setCustom(data);
137 float orbitDays = data.size * (0.75f + (float) Math.random() * 0.5f);
139 if (orbitDays < 1f) orbitDays = 1f;
140 if (orbitDays > 3f) orbitDays = 3f;
142 route.addSegment(
new RouteSegment(
ROUTE_SRC_LOAD, orbitDays, from.getPrimaryEntity()));
143 route.addSegment(
new RouteSegment(
ROUTE_TRAVEL_DST, from.getPrimaryEntity(), to));
145 route.addSegment(
new RouteSegment(
ROUTE_DST_LOAD, orbitDays * 0.5f, to));
146 route.addSegment(
new RouteSegment(
ROUTE_TRAVEL_SRC, to, from.getPrimaryEntity()));
147 route.addSegment(
new RouteSegment(
ROUTE_SRC_UNLOAD, orbitDays, from.getPrimaryEntity()));
160 WeightedRandomPicker<MarketAPI> markets =
new WeightedRandomPicker<MarketAPI>();
161 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
162 if (market.isHidden())
continue;
163 if (!market.hasSpaceport())
continue;
168 if (SharedData.getData().getMarketsWithoutTradeFleetSpawn().contains(market.getId()))
continue;
170 float distLY = Misc.getDistanceToPlayerLY(market.getPrimaryEntity());
171 float mult = 1f - Math.min(0.99f, distLY / 10f);
173 String fid = market.getFactionId();
174 if (Factions.LUDDIC_CHURCH.equals(fid) ||
175 Factions.LUDDIC_PATH.equals(fid) ||
176 Factions.KOL.equals(fid)) {
180 markets.add(market, market.getSize() * mult);
186 return markets.pick();
190 if (from ==
null)
return null;
192 WeightedRandomPicker<SectorEntityToken> picker =
new WeightedRandomPicker<SectorEntityToken>();
194 for (SectorEntityToken shrine :
new ArrayList<SectorEntityToken>(
shrines)) {
195 if (!shrine.isAlive())
continue;
197 MarketAPI market = shrine.getMarket();
198 boolean realMarket = market !=
null && !market.isPlanetConditionMarketOnly();
199 if (realMarket && market.hasCondition(Conditions.DECIVILIZED))
continue;
203 mult = 10f * market.getSize();
207 picker.add(shrine, mult);
210 return picker.pick();
214 public static PilgrimageRouteData
createData(MarketAPI from, SectorEntityToken to) {
215 PilgrimageRouteData data =
new PilgrimageRouteData();
218 data.factionId = Factions.LUDDIC_CHURCH;
220 MarketAPI market = to.getMarket();
221 boolean realMarket = market !=
null && !market.isPlanetConditionMarketOnly();
222 if (realMarket && market.getFaction().isHostileTo(from.getFaction())) {
223 if (market.getFaction().isHostileTo(Factions.INDEPENDENT)) {
224 data.smuggling =
true;
226 data.factionId = Factions.INDEPENDENT;
233 sizeBasis = market.getSize() + from.getSize();
235 sizeBasis = from.getSize() * 0.5f;
237 data.size = sizeBasis / 40f;
248 Random random =
new Random();
249 if (route.getSeed() !=
null) {
250 random =
new Random(route.getSeed());
254 if (fleet ==
null)
return null;;
258 fleet.addEventListener(
this);
265 PilgrimageRouteData data = (PilgrimageRouteData) route.getCustom();
267 FleetCreatorMission m =
new FleetCreatorMission(random);
271 m.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.LOWER, data.factionId,
272 FleetTypes.SHRINE_PILGRIMS, data.from.getLocationInHyperspace());
273 m.triggerSetFleetOfficers(OfficerNum.FC_ONLY, OfficerQuality.LOWER);
274 m.triggerSetFleetSizeFraction(data.size * 0.5f * (0.5f + random.nextFloat() * 0.5f));
275 m.triggerFleetSetNoFactionInName();
276 m.triggerSetTraderFleet();
277 m.triggerSetFleetComposition(0f, 0f, 0f, 1f, 0f);
278 m.triggerSetFleetMemoryValue(MemFlags.MEMORY_KEY_SOURCE_MARKET, data.from);
279 m.triggerSetFleetMemoryValue(
"$destShrine", data.to.getId());
280 m.triggerSetFleetMemoryValue(MemFlags.SHRINE_PILGRIM_FLEET,
true);
282 CampaignFleetAPI fleet = m.createFleet();
283 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class);
291 if (route ==
null || !(route.getCustom() instanceof PilgrimageRouteData))
return;
293 if (route.isExpired())
return;
294 if (!battle.isPlayerInvolved())
return;
297 if (battle.getNonPlayerSideSnapshot().contains(fleet)) {
298 PilgrimageRouteData data = (PilgrimageRouteData) route.getCustom();
300 DelayedFleetEncounter e =
new DelayedFleetEncounter(
new Random(),
"luddicPilgrims");
303 e.setLocationCoreOnly(
true, Factions.LUDDIC_CHURCH);
305 e.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.DEFAULT, Factions.LUDDIC_CHURCH, FleetTypes.PATROL_MEDIUM,
new Vector2f());
306 e.triggerSetFleetSizeFraction(Math.min(1f, data.size * 3f));
307 e.autoAdjustFleetTypeName();
308 e.triggerSetPatrol();
309 e.triggerSetStandardAggroInterceptFlags();
310 e.triggerSetFleetGenericHailPermanent(
"PilgrimRevengeHail");
static SettingsAPI getSettings()
static Logger getLogger(Class c)
static SectorAPI getSector()
static final Integer ROUTE_RESUPPLY_BACK_WS
static final Integer ROUTE_DST_UNLOAD
static final Integer ROUTE_SRC_UNLOAD
void advance(float amount)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
CampaignFleetAPI spawnFleet(RouteData route)
TimeoutTracker< String > recentlySentPilgrims
void reportAboutToBeDespawnedByRouteManager(RouteData route)
static final Integer ROUTE_TRAVEL_BACK_WS
PilgrimageFleetRouteManager()
SectorEntityToken pickDestShrine(MarketAPI from)
MarketAPI pickSourceMarket()
boolean shouldCancelRouteAfterDelayCheck(RouteData route)
static final Integer ROUTE_TRAVEL_DST
static final String SOURCE_ID
void addRouteFleetIfPossible()
static final Integer ROUTE_DST_LOAD
static final Integer ROUTE_TRAVEL_SRC
static CampaignFleetAPI createPilgrimRouteFleet(RouteData route, Random random)
static PilgrimageRouteData createData(MarketAPI from, SectorEntityToken to)
static final Integer ROUTE_SRC_LOAD
String getRouteSourceId()
boolean shouldRepeat(RouteData route)
List< SectorEntityToken > shrines
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
static RouteManager getInstance()
RouteData getRoute(String source, CampaignFleetAPI fleet)
float getFloat(String key)