1package com.fs.starfarer.api.impl.campaign.fleets.misc;
3import java.util.ArrayList;
5import java.util.Random;
7import org.lwjgl.util.vector.Vector2f;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BattleAPI;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
15import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
16import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
17import com.fs.starfarer.api.impl.campaign.fleets.misc.MiscFleetRouteManager.MiscRouteData;
18import com.fs.starfarer.api.impl.campaign.ids.Conditions;
19import com.fs.starfarer.api.impl.campaign.ids.Factions;
20import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
21import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
22import com.fs.starfarer.api.impl.campaign.ids.Tags;
23import com.fs.starfarer.api.impl.campaign.missions.DelayedFleetEncounter;
24import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
25import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality;
26import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize;
27import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum;
28import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
29import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn;
30import com.fs.starfarer.api.impl.campaign.shared.SharedData;
31import com.fs.starfarer.api.util.Misc;
32import com.fs.starfarer.api.util.WeightedRandomPicker;
53 if (shrines ==
null) {
64 if (from ==
null)
return null;
66 if (to ==
null)
return null;
80 MiscRouteData data = (MiscRouteData) route.getCustom();
82 FleetCreatorMission m =
new FleetCreatorMission(random);
86 m.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.LOWER, data.factionId,
87 FleetTypes.SHRINE_PILGRIMS, data.from.getLocationInHyperspace());
88 m.triggerSetFleetOfficers(OfficerNum.FC_ONLY, OfficerQuality.LOWER);
89 m.triggerSetFleetSizeFraction(data.size * 0.5f * (0.5f + random.nextFloat() * 0.5f));
90 m.triggerFleetSetNoFactionInName();
91 m.triggerSetTraderFleet();
92 m.triggerSetFleetComposition(0f, 0f, 0f, 1f, 0f);
93 m.triggerSetFleetMemoryValue(MemFlags.MEMORY_KEY_SOURCE_MARKET, data.from);
94 m.triggerSetFleetMemoryValue(
"$destShrine", data.to.getId());
95 m.triggerSetFleetMemoryValue(MemFlags.SHRINE_PILGRIM_FLEET,
true);
97 CampaignFleetAPI fleet = m.createFleet();
98 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class);
104 public MiscRouteData
createData(MarketAPI from, SectorEntityToken to) {
105 MiscRouteData data =
new MiscRouteData(
getId());
109 if (from.getFaction().isHostileTo(Factions.LUDDIC_CHURCH)) {
110 data.factionId = Factions.INDEPENDENT;
112 data.factionId = Factions.LUDDIC_CHURCH;
116 MarketAPI market = to.getMarket();
117 boolean realMarket = market !=
null && !market.isPlanetConditionMarketOnly();
118 if (realMarket && market.getFaction().isHostileTo(from.getFaction())) {
119 if (market.getFaction().isHostileTo(data.factionId)) {
120 data.smuggling =
true;
132 sizeBasis = market.getSize() + from.getSize();
134 sizeBasis = from.getSize() * 0.5f;
136 data.size = sizeBasis / 40f;
143 WeightedRandomPicker<MarketAPI> markets =
new WeightedRandomPicker<MarketAPI>(manager.
getRandom());
144 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
145 if (market.isHidden())
continue;
146 if (!market.hasSpaceport())
continue;
148 if (market.getContainingLocation().hasTag(Tags.SYSTEM_CUT_OFF_FROM_HYPER))
continue;
149 if (market.getFaction().isHostileTo(Factions.INDEPENDENT) &&
150 market.getFaction().isHostileTo(Factions.LUDDIC_CHURCH)) {
155 if (SharedData.getData().getMarketsWithoutTradeFleetSpawn().contains(market.getId()))
continue;
157 float distLY = Misc.getDistanceToPlayerLY(market.getPrimaryEntity());
158 float mult = 1f - Math.min(0.99f, distLY / 10f);
160 String fid = market.getFactionId();
161 if (Factions.LUDDIC_CHURCH.equals(fid) ||
162 Factions.LUDDIC_PATH.equals(fid) ||
163 Factions.KOL.equals(fid)) {
167 markets.add(market, market.getSize() * mult);
173 return markets.pick();
177 if (from ==
null)
return null;
179 WeightedRandomPicker<SectorEntityToken> picker =
new WeightedRandomPicker<SectorEntityToken>(manager.
getRandom());
181 for (SectorEntityToken shrine :
new ArrayList<SectorEntityToken>(
getShrines(manager))) {
182 if (!shrine.isAlive())
continue;
183 if (shrine.getContainingLocation().hasTag(Tags.SYSTEM_CUT_OFF_FROM_HYPER))
continue;
185 MarketAPI market = shrine.getMarket();
186 boolean realMarket = market !=
null && !market.isPlanetConditionMarketOnly();
188 if (market.hasCondition(Conditions.DECIVILIZED))
continue;
189 if (market.getFaction().isHostileTo(Factions.INDEPENDENT) &&
190 market.getFaction().isHostileTo(Factions.LUDDIC_CHURCH)) {
197 mult = 10f * market.getSize();
201 picker.add(shrine, mult);
204 return picker.pick();
210 if (route ==
null || !(route.getCustom() instanceof MiscRouteData))
return;
212 if (route.isExpired())
return;
213 if (!battle.isPlayerInvolved())
return;
216 if (battle.getNonPlayerSideSnapshot().contains(fleet)) {
217 MiscRouteData data = (MiscRouteData) route.getCustom();
219 DelayedFleetEncounter e =
new DelayedFleetEncounter(
new Random(),
"luddicPilgrims");
222 e.setLocationCoreOnly(
true, Factions.LUDDIC_CHURCH);
224 e.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.DEFAULT, Factions.LUDDIC_CHURCH, FleetTypes.PATROL_MEDIUM,
new Vector2f());
225 e.triggerSetFleetSizeFraction(Math.min(1f, data.size * 3f));
226 e.autoAdjustFleetTypeName();
227 e.triggerSetPatrol();
228 e.triggerSetStandardAggroInterceptFlags();
229 e.triggerSetFleetGenericHailPermanent(
"PilgrimRevengeHail");
236 return "preparing for pilgrimage to shrine on " + data.to.getName();
240 return "disembarking pilgrims at " + data.from.getName();
244 return "taking pilgrims to shrine on " + data.to.getName();
248 return "returning pilgrims to " + data.from.getName();
252 return "disembarking pilgrims at shrine on " + data.to.getName();
256 return "embarking pilgrims for return voyage to " + data.from.getName();
static SettingsAPI getSettings()
static SectorAPI getSector()
static RouteManager getInstance()
RouteData getRoute(String source, CampaignFleetAPI fleet)
TimeoutTracker< String > getTimeout(String creatorId)
String getRouteSourceId()
MiscRouteData createData(MarketAPI from, SectorEntityToken to)
int getMaxFleetsForThisCreator()
MiscRouteData createRouteParams(MiscFleetRouteManager manager, Random random)
String getAtDestLoadActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
List< SectorEntityToken > getShrines(MiscFleetRouteManager manager)
String getTravelToDestActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
void reportBattleOccurred(MiscFleetRouteManager manager, CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
String getEndingActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
String getAtDestUnloadActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
String getStartingActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
MarketAPI pickSourceMarket(MiscFleetRouteManager manager)
SectorEntityToken pickDestShrine(MiscFleetRouteManager manager, MarketAPI from)
CampaignFleetAPI createFleet(MiscFleetRouteManager manager, RouteData route, Random random)
String getTravelReturnActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)
float getFloat(String key)