Starsector API
Loading...
Searching...
No Matches
MiscPilgrimFleetCreator.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.fleets.misc;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Random;
6
7import org.lwjgl.util.vector.Vector2f;
8
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;
33
35
36 public String SHRINE_LIST_KEY = "shrine_list_key";
37
38
39 @Override
40 public float getFrequency() {
41 return Global.getSettings().getFloat("miscFleetPilgrimFrequency");
42 }
43
44 @Override
46 return Global.getSettings().getInt("miscFleetPilgrimMaxFleets");
47 }
48
49
50
51 public List<SectorEntityToken> getShrines(MiscFleetRouteManager manager) {
52 List<SectorEntityToken> shrines = (List<SectorEntityToken>) manager.getData().get(SHRINE_LIST_KEY);
53 if (shrines == null) {
54 shrines = Global.getSector().getEntitiesWithTag(Tags.LUDDIC_SHRINE);
55 manager.getData().put(SHRINE_LIST_KEY, shrines);
56 }
57 return shrines;
58 }
59
60
61 @Override
62 public MiscRouteData createRouteParams(MiscFleetRouteManager manager, Random random) {
63 MarketAPI from = pickSourceMarket(manager);
64 if (from == null) return null;
65 SectorEntityToken to = pickDestShrine(manager, from);
66 if (to == null) return null;
67
68// from = Global.getSector().getEconomy().getMarket("chalcedon");
69// to = Global.getSector().getEconomy().getMarket("eochu_bres").getPrimaryEntity();
70// to = Global.getSector().getEntityById("beholder_station");
71
72 MiscRouteData result = createData(from, to);
73
74 return result;
75 }
76
77
78 @Override
79 public CampaignFleetAPI createFleet(MiscFleetRouteManager manager, RouteData route, Random random) {
80 MiscRouteData data = (MiscRouteData) route.getCustom();
81
82 FleetCreatorMission m = new FleetCreatorMission(random);
83 m.beginFleet();
84
85
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);
96
97 CampaignFleetAPI fleet = m.createFleet();
98 fleet.removeScriptsOfClass(MissionFleetAutoDespawn.class);
99
100 return fleet;
101 }
102
103
104 public MiscRouteData createData(MarketAPI from, SectorEntityToken to) {
105 MiscRouteData data = new MiscRouteData(getId());
106 data.from = from;
107 data.to = to;
108
109 if (from.getFaction().isHostileTo(Factions.LUDDIC_CHURCH)) {
110 data.factionId = Factions.INDEPENDENT;
111 } else {
112 data.factionId = Factions.LUDDIC_CHURCH;
113 }
114
115
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;
121 }
122// if (market.getFaction().isHostileTo(Factions.INDEPENDENT)) {
123// data.smuggling = true;
124// } else {
125// data.factionId = Factions.INDEPENDENT;
126// }
127 }
128
129
130 float sizeBasis;
131 if (realMarket) {
132 sizeBasis = market.getSize() + from.getSize();
133 } else {
134 sizeBasis = from.getSize() * 0.5f;
135 }
136 data.size = sizeBasis / 40f;
137
138 return data;
139 }
140
141 public MarketAPI pickSourceMarket(MiscFleetRouteManager manager) {
142
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; // markets w/o spaceports don't launch fleets
147 if (manager.getTimeout(getId()).contains(market.getId())) 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)) {
151 continue;
152 }
153
154 // use this for shrines also
155 if (SharedData.getData().getMarketsWithoutTradeFleetSpawn().contains(market.getId())) continue;
156
157 float distLY = Misc.getDistanceToPlayerLY(market.getPrimaryEntity());
158 float mult = 1f - Math.min(0.99f, distLY / 10f);
159
160 String fid = market.getFactionId();
161 if (Factions.LUDDIC_CHURCH.equals(fid) ||
162 Factions.LUDDIC_PATH.equals(fid) ||
163 Factions.KOL.equals(fid)) {
164 mult *= 10f;
165 }
166
167 markets.add(market, market.getSize() * mult);
168
169// if (market.getName().toLowerCase().equals("jannow")) {
170// markets.add(market, 100000f);
171// }
172 }
173 return markets.pick();
174 }
175
176 public SectorEntityToken pickDestShrine(MiscFleetRouteManager manager, MarketAPI from) {
177 if (from == null) return null;
178
179 WeightedRandomPicker<SectorEntityToken> picker = new WeightedRandomPicker<SectorEntityToken>(manager.getRandom());
180
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;
184
185 MarketAPI market = shrine.getMarket();
186 boolean realMarket = market != null && !market.isPlanetConditionMarketOnly();
187 if (realMarket) {
188 if (market.hasCondition(Conditions.DECIVILIZED)) continue;
189 if (market.getFaction().isHostileTo(Factions.INDEPENDENT) &&
190 market.getFaction().isHostileTo(Factions.LUDDIC_CHURCH)) {
191 continue;
192 }
193 }
194
195 float mult = 1f;
196 if (realMarket) {
197 mult = 10f * market.getSize();
198 } else {
199 //mult *= 100f;
200 }
201 picker.add(shrine, mult);
202 }
203
204 return picker.pick();
205 }
206
207 @Override
208 public void reportBattleOccurred(MiscFleetRouteManager manager, CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle) {
209 RouteData route = RouteManager.getInstance().getRoute(manager.getRouteSourceId(), fleet);
210 if (route == null || !(route.getCustom() instanceof MiscRouteData)) return;
211
212 if (route.isExpired()) return;
213 if (!battle.isPlayerInvolved()) return;
214
215 // player was involved, no the opposite side of the pilgrim fleet
216 if (battle.getNonPlayerSideSnapshot().contains(fleet)) {
217 MiscRouteData data = (MiscRouteData) route.getCustom();
218
219 DelayedFleetEncounter e = new DelayedFleetEncounter(new Random(), "luddicPilgrims");
220 e.setDelayShort();
221 //e.setDelayNone();
222 e.setLocationCoreOnly(true, Factions.LUDDIC_CHURCH);
223 e.beginCreate();
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");
230 e.endCreate();
231 }
232 }
233
234
235 public String getStartingActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
236 return "preparing for pilgrimage to shrine on " + data.to.getName();
237 }
238
239 public String getEndingActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
240 return "disembarking pilgrims at " + data.from.getName();
241 }
242
243 public String getTravelToDestActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
244 return "taking pilgrims to shrine on " + data.to.getName();
245 }
246
247 public String getTravelReturnActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
248 return "returning pilgrims to " + data.from.getName();
249 }
250
251 public String getAtDestUnloadActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
252 return "disembarking pilgrims at shrine on " + data.to.getName();
253 }
254
255 public String getAtDestLoadActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data) {
256 return "embarking pilgrims for return voyage to " + data.from.getName();
257 }
258
259}
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
RouteData getRoute(String source, CampaignFleetAPI fleet)
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)
SectorEntityToken pickDestShrine(MiscFleetRouteManager manager, MarketAPI from)
CampaignFleetAPI createFleet(MiscFleetRouteManager manager, RouteData route, Random random)
String getTravelReturnActionText(CampaignFleetAPI fleet, RouteSegment segment, MiscRouteData data)