1package com.fs.starfarer.api.impl.campaign.missions;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.BattleAPI;
8import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.FactionAPI;
11import com.fs.starfarer.api.campaign.InteractionDialogAPI;
12import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
13import com.fs.starfarer.api.campaign.SectorEntityToken;
14import com.fs.starfarer.api.campaign.StarSystemAPI;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
16import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
17import com.fs.starfarer.api.campaign.rules.MemoryAPI;
18import com.fs.starfarer.api.characters.PersonAPI;
19import com.fs.starfarer.api.fleet.FleetMemberAPI;
20import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
21import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.MissionCompletionRep;
22import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
23import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
24import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepRewards;
25import com.fs.starfarer.api.impl.campaign.ids.Factions;
26import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
27import com.fs.starfarer.api.impl.campaign.ids.Ranks;
28import com.fs.starfarer.api.impl.campaign.ids.Tags;
29import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel;
30import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
31import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
32import com.fs.starfarer.api.ui.SectorMapAPI;
33import com.fs.starfarer.api.ui.TooltipMakerAPI;
34import com.fs.starfarer.api.util.Misc;
42 public static class BountyResult {
44 public float fraction;
45 public ReputationAdjustmentResult repFaction;
46 public ReputationAdjustmentResult repPerson;
47 public BountyResult(
int payment,
float fraction, ReputationAdjustmentResult repPerson, ReputationAdjustmentResult repFaction) {
48 this.payment = payment;
49 this.fraction = fraction;
50 this.repFaction = repFaction;
51 this.repPerson = repPerson;
57 public static enum Stage {
70 protected boolean create(MarketAPI createdAt,
boolean barEvent) {
75 setGiverRank(Ranks.CITIZEN);
76 post = pickOne(Ranks.POST_TRADER, Ranks.POST_COMMODITIES_AGENT,
77 Ranks.POST_MERCHANT, Ranks.POST_INVESTOR, Ranks.POST_EXECUTIVE,
78 Ranks.POST_PORTMASTER,
79 Ranks.POST_SENIOR_EXECUTIVE);
80 setGiverTags(Tags.CONTACT_TRADE);
82 if (post.equals(Ranks.POST_SENIOR_EXECUTIVE)) {
83 setGiverImportance(pickHighImportance());
85 setGiverImportance(pickImportance());
88 findOrCreateGiver(createdAt,
false,
false);
89 setGiverIsPotentialContactOnSuccess();
92 PersonAPI person = getPerson();
93 if (person ==
null)
return false;
95 if (Factions.PIRATES.equals(person.getFaction().getId()))
return false;
97 if (!setPersonMissionRef(person,
"$psb_ref")) {
102 requireMarketFactionCustom(ReqMode.ALL, Factions.CUSTOM_MAKES_PIRATE_BASES);
103 requireMarketMemoryFlag(PirateBaseIntel.MEM_FLAG,
true);
104 requireMarketFactionNot(person.getFaction().getId());
105 requireMarketHidden();
106 requireMarketIsMilitary();
107 preferMarketInDirectionOfOtherMissions();
110 if (
market ==
null ||
market.getStarSystem() ==
null)
return false;
111 if (!setMarketMissionRef(
market,
"$psb_ref")) {
115 makeImportant(
market,
"$psb_target", Stage.BOUNTY);
124 setStartingStage(Stage.BOUNTY);
125 setSuccessStage(Stage.DONE);
129 connectWithDaysElapsed(Stage.BOUNTY, Stage.DONE,
BOUNTY_DAYS);
131 addTag(Tags.INTEL_BOUNTY);
134 int numPirates = 2 + genRandom.nextInt(3);
136 FleetSize [] sizes =
new FleetSize [] {
140 FleetSize.VERY_LARGE,
143 for (
int i = 0; i < numPirates; i++) {
144 FleetSize size = sizes[i % sizes.length];
145 beginWithinHyperspaceRangeTrigger(
system, 3f,
false, Stage.BOUNTY);
146 triggerCreateFleet(size, FleetQuality.DEFAULT,
market.getFactionId(), FleetTypes.PATROL_MEDIUM,
system);
147 triggerAutoAdjustFleetStrengthMajor();
148 triggerSetPirateFleet();
149 triggerSpawnFleetNear(
system.getCenter(),
null,
null);
150 triggerOrderFleetPatrol(
system,
true, Tags.STATION, Tags.JUMP_POINT);
158 set(
"$psb_barEvent", isBarEvent());
159 set(
"$psb_manOrWoman", getPerson().getManOrWoman());
160 set(
"$psb_baseBounty", Misc.getWithDGS(
baseBounty));
162 set(
"$psb_systemName",
system.getNameWithLowercaseType());
163 set(
"$psb_systemNameShort",
system.getNameWithLowercaseTypeShort());
164 set(
"$psb_baseName",
market.getName());
165 set(
"$psb_dist", getDistanceLY(
market));
172 Color h = Misc.getHighlightColor();
173 Color tc = getBulletColorForMode(ListInfoMode.IN_DESC);
174 if (currentStage == Stage.BOUNTY) {
175 float elapsed = getElapsedInCurrentStage();
177 PersonAPI person = getPerson();
179 String locStr =
"in or near the " +
market.getStarSystem().getNameWithLowercaseType();
181 info.addPara(
"Applies to all %s fleets " + locStr +
", which is home to " +
market.getName() +
", a pirate base.",
182 opad,
enemy.getBaseUIColor(),
enemy.getPersonNamePrefix());
185 info.addPara(
"This bounty is no longer on offer.", opad);
190 info.addPara(
"%s base reward per frigate", opad, tc, h, Misc.getDGSCredits(
baseBounty));
191 addDays(info,
"remaining", d, tc);
194 info.addPara(
"Payment depends on the number and size of ships destroyed. " +
195 "Standing with " +
faction.getDisplayNameWithArticle() +
", as well as " +
196 "with " + person.getNameString() +
", will improve.",
199 }
else if (currentStage == Stage.DONE) {
200 info.addPara(
"This bounty is no longer on offer.", opad);
207 info.addPara(
"Most recent bounty payment:", opad);
209 info.addPara(
"%s received", pad, tc, h, Misc.getDGSCredits(
latestResult.payment));
211 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
212 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
216 null,
null, info, tc,
false, 0f);
220 null,
null, info, tc,
false, 0f);
228 Color h = Misc.getHighlightColor();
230 boolean isUpdate = getListInfoParam() !=
null;
232 info.addPara(
"%s received", pad, tc, h, Misc.getDGSCredits(
latestResult.payment));
234 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
235 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
239 null,
null, info, tc, isUpdate, 0f);
243 null,
null, info, tc, isUpdate, 0f);
248 if (currentStage == Stage.BOUNTY) {
249 float elapsed = getElapsedInCurrentStage();
252 info.addPara(
"%s base reward per frigate", pad, tc, h, Misc.getDGSCredits(
baseBounty));
253 addDays(info,
"remaining", d, tc);
255 }
else if (currentStage == Stage.DONE) {
262 if (currentStage == Stage.DONE)
return " - Over";
263 return super.getPostfixForState();
268 return "Pirate Fleet Bounty";
278 return getMapLocationFor(
market.getPrimaryEntity());
282 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
293 super.notifyEnding();
300 if (isEnded() || isEnding())
return;
302 if (!battle.isPlayerInvolved())
return;
304 if (!Misc.isNear(primaryWinner,
market.getLocationInHyperspace()))
return;
307 float fpDestroyed = 0;
308 for (CampaignFleetAPI otherFleet : battle.getNonPlayerSideSnapshot()) {
309 if (
enemy != otherFleet.getFaction())
continue;
312 for (FleetMemberAPI loss : Misc.getSnapshotMembersLost(otherFleet)) {
313 float mult = Misc.getSizeNum(loss.getHullSpec().getHullSize());
315 fpDestroyed += loss.getFleetPointCost();
318 payment += (int) (bounty * battle.getPlayerInvolvementFraction());
322 Global.
getSector().getPlayerFleet().getCargo().getCredits().add(payment);
324 float repFP = (int)(fpDestroyed * battle.getPlayerInvolvementFraction());
329 fDelta = RepRewards.TINY;
330 pDelta = RepRewards.TINY;
331 }
else if (repFP < 70) {
332 fDelta = RepRewards.SMALL;
333 pDelta = RepRewards.SMALL;
335 fDelta = RepRewards.SMALL;
336 pDelta = RepRewards.MEDIUM;
339 MissionCompletionRep completionRepPerson =
new MissionCompletionRep(
340 pDelta, getRewardLimitPerson(), 0,
null);
341 MissionCompletionRep completionRepFaction =
new MissionCompletionRep(
342 fDelta, getRewardLimitFaction(), 0,
null);
345 latestResult =
new BountyResult(payment, battle.getPlayerInvolvementFraction(),
null,
null);
347 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
348 new RepActionEnvelope(RepActions.MISSION_SUCCESS, completionRepPerson,
351 latestResult.repPerson = rep;
354 if (completionRepFaction.successDelta != 0) {
355 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
356 new RepActionEnvelope(RepActions.MISSION_SUCCESS, completionRepFaction,
358 getPerson().getFaction().getId());
359 latestResult.repFaction = rep;
365 addPotentialContacts(
null);
static SectorAPI getSector()
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
SectorEntityToken getMapLocation(SectorMapAPI map)
String getMissionTypeNoun()
BountyResult latestResult
boolean create(MarketAPI createdAt, boolean barEvent)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
void updateInteractionDataImpl()
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
void acceptImpl(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
void addDescriptionForCurrentStage(TooltipMakerAPI info, float width, float height)
String getPostfixForState()