Starsector API
Loading...
Searching...
No Matches
DisruptCompetitorMission.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.awt.Color;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.campaign.PersonImportance;
8import com.fs.starfarer.api.campaign.econ.MarketAPI;
9import com.fs.starfarer.api.characters.PersonAPI;
10import com.fs.starfarer.api.impl.campaign.ids.Factions;
11import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
12import com.fs.starfarer.api.impl.campaign.ids.Ranks;
13import com.fs.starfarer.api.impl.campaign.ids.Tags;
14import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
15import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
16import com.fs.starfarer.api.ui.TooltipMakerAPI;
17import com.fs.starfarer.api.util.Misc;
18
19public class DisruptCompetitorMission extends HubMissionWithBarEvent {
20
21 public static float PROB_COMPLICATIONS = 0.25f;
22
23 public static float MISSION_DAYS = 120f;
24
25 public static RaidDangerLevel RAID_DANGER = RaidDangerLevel.MEDIUM;
26
27 public static enum Stage {
28 DISRUPT,
29 COMPLETED,
30 FAILED,
31 }
32
33 protected MarketAPI market;
34
35 @Override
36 protected boolean create(MarketAPI createdAt, boolean barEvent) {
37 //genRandom = Misc.random;
38 if (barEvent) {
39 setGiverRank(Ranks.CITIZEN);
40 String post = pickOne(Ranks.POST_TRADER, Ranks.POST_COMMODITIES_AGENT,
41 Ranks.POST_MERCHANT, Ranks.POST_INVESTOR,
42 Ranks.POST_EXECUTIVE, Ranks.POST_SENIOR_EXECUTIVE,
43 Ranks.POST_PORTMASTER);
44 setGiverPost(post);
45 if (post.equals(Ranks.POST_SENIOR_EXECUTIVE)) {
46 setGiverImportance(pickHighImportance());
47 } else {
48 setGiverImportance(pickImportance());
49 }
50 setGiverTags(Tags.CONTACT_TRADE);
51 findOrCreateGiver(createdAt, false, false);
52 }
53
54 PersonAPI person = getPerson();
55 if (person == null) return false;
56
57
58 if (!setPersonMissionRef(person, "$dcom_ref")) {
59 return false;
60 }
61
62 if (barEvent) {
63 setGiverIsPotentialContactOnSuccess();
64 }
65
66 PersonImportance importance = person.getImportance();
67 int minMarketSize = 3;
68 int maxMarketSize = 9;
69 switch (importance) {
70 case VERY_LOW:
71 minMarketSize = 3;
72 maxMarketSize = 4;
73 break;
74 case LOW:
75 minMarketSize = 4;
76 maxMarketSize = 4;
77 break;
78 case MEDIUM:
79 minMarketSize = 5;
80 maxMarketSize = 5;
81 break;
82 case HIGH:
83 minMarketSize = 5;
84 maxMarketSize = 6;
85 break;
86 case VERY_HIGH:
87 minMarketSize = 6;
88 maxMarketSize = 8;
89 break;
90 }
91 requireMarketIsNot(createdAt);
92 requireMarketNotHidden();
93 requireMarketFactionNotPlayer();
94 requireMarketNotInHyperspace();
95 preferMarketSizeAtLeast(minMarketSize);
96 preferMarketSizeAtMost(maxMarketSize);
97 market = pickMarket();
98
99 if (market == null) return false;
100 if (!setMarketMissionRef(market, "$dcom_ref")) {
101 return false;
102 }
103
104 int marines = getMarinesRequiredForCustomObjective(market, RAID_DANGER);
105 if (!isOkToOfferMissionRequiringMarines(marines)) {
106 return false;
107 }
108
109 makeImportant(market, "$dcom_target", Stage.DISRUPT);
110
111 setStartingStage(Stage.DISRUPT);
112 setSuccessStage(Stage.COMPLETED);
113 setFailureStage(Stage.FAILED);
114
115 setStageOnMemoryFlag(Stage.COMPLETED, market, "$dcom_completed");
116 setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
117
118 //int sizeModifier = market.getSize() * 10000;
119 //setCreditReward(10000 + sizeModifier, 30000 + sizeModifier);
120 //setCreditReward(CreditReward.AVERAGE, market.getSize());
121
122 int bonus = getRewardBonusForMarines(getMarinesRequiredForCustomObjective(market, RAID_DANGER));
123 setCreditRewardWithBonus(CreditReward.AVERAGE, bonus);
124
125 return true;
126 }
127
128
129 @Override
130 protected void notifyEnding() {
131 super.notifyEnding();
132
133 if (isSucceeded() && (rollProbability(PROB_COMPLICATIONS))) {
134 DelayedFleetEncounter e = new DelayedFleetEncounter(genRandom, getMissionId());
135 //e.setDelay(0f);
136 e.setDelayMedium();
137 e.setLocationInnerSector(false, Factions.INDEPENDENT);
138 //e.setEncounterInHyper();
139 e.beginCreate();
140 e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.SMOD_1, Factions.MERCENARY, FleetTypes.PATROL_LARGE, new Vector2f());
141 e.triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
142 e.triggerFleetSetFaction(Factions.INDEPENDENT);
143 e.triggerSetAdjustStrengthBasedOnQuality(true, getQuality());
144 e.triggerSetStandardAggroNonPirateFlags();
146 e.triggerSetFleetMemoryValue("$dcom_marketName", market.getName());
147 e.triggerSetFleetMemoryValue("$dcom_marketOnOrAt", market.getOnOrAt());
148 e.triggerSetFleetGenericHailPermanent("DCOMMercHail");
149 e.endCreate();
150 }
151 }
152
153
154
155 protected void updateInteractionDataImpl() {
156 set("$dcom_barEvent", isBarEvent());
157 set("$dcom_manOrWoman", getPerson().getManOrWoman());
158 set("$dcom_hisOrHer", getPerson().getHisOrHer());
159 set("$dcom_reward", Misc.getWithDGS(getCreditsReward()));
160
161 set("$dcom_systemName", market.getStarSystem().getNameWithLowercaseTypeShort());
162 set("$dcom_marketName", market.getName());
163 set("$dcom_marketOnOrAt", market.getOnOrAt());
164 set("$dcom_dist", getDistanceLY(market));
165 set("$dcom_marketFactionArticle", market.getFaction().getPersonNamePrefixAOrAn());
166 set("$dcom_marketFaction", market.getFaction().getPersonNamePrefix());
167 set("$dcom_factionColor", market.getFaction().getBaseUIColor());
168 set("$dcom_danger", RAID_DANGER);
169
170 set("$dcom_marines", Misc.getWithDGS(getMarinesRequiredForCustomObjective(market, RAID_DANGER)));
171 }
172
173 @Override
174 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
175 float opad = 10f;
176 Color h = Misc.getHighlightColor();
177 if (currentStage == Stage.DISRUPT) {
178 info.addPara("Disrupt a competitor of " + getPerson().getNameString() + " by raiding their warehouse " +
179 market.getOnOrAt() + " " + market.getName() +
180 " in the " + market.getStarSystem().getNameWithLowercaseTypeShort() + ".", opad);
181
182 addCustomRaidInfo(market, RAID_DANGER, info, opad);
183 }
184 }
185
186 @Override
187 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
188 Color h = Misc.getHighlightColor();
189 if (currentStage == Stage.DISRUPT) {
190 info.addPara("Raid warehouse " +
191 market.getOnOrAt() + " " + market.getName() + " in the " +
192 market.getStarSystem().getNameWithLowercaseTypeShort(), tc, pad);
193 return true;
194 }
195 return false;
196 }
197
198 @Override
199 public String getBaseName() {
200 return "Disrupt Competitor";
201 }
202
203}
204
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
void setLocationInnerSector(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height)