1package com.fs.starfarer.api.impl.campaign.intel;
4import java.util.ArrayList;
5import java.util.LinkedHashMap;
6import java.util.LinkedHashSet;
10import org.apache.log4j.Logger;
12import com.fs.starfarer.api.EveryFrameScript;
13import com.fs.starfarer.api.Global;
14import com.fs.starfarer.api.campaign.BattleAPI;
15import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
16import com.fs.starfarer.api.campaign.CampaignFleetAPI;
17import com.fs.starfarer.api.campaign.FactionAPI;
18import com.fs.starfarer.api.campaign.InteractionDialogAPI;
19import com.fs.starfarer.api.campaign.RepLevel;
20import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
21import com.fs.starfarer.api.campaign.SectorEntityToken;
22import com.fs.starfarer.api.campaign.econ.MarketAPI;
23import com.fs.starfarer.api.campaign.econ.MonthlyReport;
24import com.fs.starfarer.api.campaign.econ.MonthlyReport.FDNode;
25import com.fs.starfarer.api.campaign.listeners.EconomyTickListener;
26import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
27import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
28import com.fs.starfarer.api.fleet.FleetMemberAPI;
29import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
30import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
31import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
32import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
33import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
34import com.fs.starfarer.api.impl.campaign.ids.Tags;
35import com.fs.starfarer.api.impl.campaign.rulecmd.missions.Commission;
36import com.fs.starfarer.api.impl.campaign.shared.SharedData;
37import com.fs.starfarer.api.ui.SectorMapAPI;
38import com.fs.starfarer.api.ui.TooltipMakerAPI;
39import com.fs.starfarer.api.ui.TooltipMakerAPI.TooltipCreator;
40import com.fs.starfarer.api.util.Misc;
43 FleetEventListener, EconomyTickListener {
48 public static class CommissionBountyResult
extends MissionResult {
49 public float fraction;
50 public CommissionBountyResult(
int payment,
float fraction, ReputationAdjustmentResult rep) {
52 this.fraction = fraction;
56 public static class RepChangeData {
57 public FactionAPI faction;
68 protected LinkedHashMap<String, RepChangeData>
repChanges =
new LinkedHashMap<String, RepChangeData>();
84 RepLevel level =
faction.getRelToPlayer().getLevel();
85 if (!level.isAtWorst(RepLevel.NEUTRAL)) {
98 log.info(String.format(
"Accepted commission with [%s]",
faction.getDisplayName(), (
int)
baseBounty));
107 Global.
getSector().getCharacterData().getMemoryWithoutUpdate().set(MemFlags.FCM_FACTION,
faction.getId());
108 Global.
getSector().getCharacterData().getMemoryWithoutUpdate().set(MemFlags.FCM_EVENT,
this);
116 log.info(String.format(
"Ending commission with [%s]",
faction.getDisplayName()));
120 Global.
getSector().getCharacterData().getMemoryWithoutUpdate().unset(MemFlags.FCM_FACTION);
121 Global.
getSector().getCharacterData().getMemoryWithoutUpdate().unset(MemFlags.FCM_EVENT);
128 ListenerUtil.reportCommissionEnded(
this);
134 RepChangeData change =
repChanges.get(other.getId());
136 boolean madeHostile = change !=
null;
137 boolean factionHostile =
faction.isHostileTo(other);
138 boolean playerHostile = player.isHostileTo(other);
140 if (factionHostile && !playerHostile && !madeHostile) {
144 if (!factionHostile && madeHostile) {
150 public void makeHostile(FactionAPI other, InteractionDialogAPI dialog) {
151 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
152 new RepActionEnvelope(RepActions.MAKE_HOSTILE_AT_BEST,
153 null,
null, dialog !=
null ? dialog.getTextPanel() :
null,
false,
true),
156 RepChangeData data =
new RepChangeData();
157 data.faction = other;
158 data.delta = rep.delta;
163 String
id = other.getId();
166 if (change ==
null)
return;
168 CustomRepImpact impact =
new CustomRepImpact();
169 impact.delta = -change.delta;
170 impact.delta = Math.max(0f, impact.delta -
Global.
getSettings().
getFloat(
"factionCommissionRestoredRelationshipPenalty"));
171 if (impact.delta > 0) {
173 new RepActionEnvelope(RepActions.CUSTOM,
174 impact,
null, dialog !=
null ? dialog.getTextPanel() :
null,
false,
true),
181 for (RepChangeData data :
new ArrayList<RepChangeData>(
repChanges.values())) {
188 Set<FactionAPI> factions =
new LinkedHashSet<FactionAPI>();
189 for (MarketAPI market :
Global.
getSector().getEconomy().getMarketsCopy()) {
190 if (market.isHidden())
continue;
191 FactionAPI curr = market.getFaction();
192 if (factions.contains(curr))
continue;
194 if (curr.isShowInIntelTab()) {
199 return new ArrayList<FactionAPI>(factions);
203 List<FactionAPI> hostile =
new ArrayList<FactionAPI>();
205 if (this.faction.isHostileTo(other)) {
214 float level =
Global.
getSector().getPlayerPerson().getStats().getLevel();
226 if (!battle.isPlayerInvolved())
return;
229 float fpDestroyed = 0;
230 for (CampaignFleetAPI otherFleet : battle.getNonPlayerSideSnapshot()) {
231 if (!
faction.isHostileTo(otherFleet.getFaction()))
continue;
234 for (FleetMemberAPI loss : Misc.getSnapshotMembersLost(otherFleet)) {
235 float mult = Misc.getSizeNum(loss.getHullSpec().getHullSize());
237 fpDestroyed += loss.getFleetPointCost();
240 payment += (int) (bounty * battle.getPlayerInvolvementFraction());
244 Global.
getSector().getPlayerFleet().getCargo().getCredits().add(payment);
246 float repFP = (int)(fpDestroyed * battle.getPlayerInvolvementFraction());
247 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
248 new RepActionEnvelope(RepActions.COMMISSION_BOUNTY_REWARD,
new Float(repFP),
null,
null,
true,
false),
250 latestResult =
new CommissionBountyResult(payment, battle.getPlayerInvolvementFraction(), rep);
257 Color h = Misc.getHighlightColor();
258 Color g = Misc.getGrayColor();
263 if (mode == ListInfoMode.IN_DESC) initPad = opad;
278 info.addPara(
"%s received", initPad, tc, h, Misc.getDGSCredits(
latestResult.payment));
280 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
281 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
284 null,
null, info, tc, isUpdate, 0f);
285 }
else if (mode == ListInfoMode.IN_DESC) {
286 info.addPara(
"%s base bounty per hostile frigate", initPad, tc, h, Misc.getDGSCredits(
baseBounty));
287 info.addPara(
"%s monthly stipend", 0f, tc, h, Misc.getDGSCredits(
computeStipend()));
292 info.addPara(
"%s base reward per frigate", initPad, tc, h, Misc.getDGSCredits(
baseBounty));
293 info.addPara(
"%s monthly stipend", 0f, tc, h, Misc.getDGSCredits(
computeStipend()));
300 Color h = Misc.getHighlightColor();
301 Color g = Misc.getGrayColor();
306 info.addPara(
getName(), c, 0f);
316 String prefix = Misc.ucFirst(
faction.getPersonNamePrefix()) +
" Commission";
326 return prefix +
" - Annulled";
328 return prefix +
" - Annulled";
332 return prefix +
" - Resigned";
336 return prefix +
" - Accepted";
358 boolean forMarketConditionTooltip) {
359 Color h = Misc.getHighlightColor();
360 Color g = Misc.getGrayColor();
361 Color tc = Misc.getTextColor();
365 info.addImage(
faction.getLogo(), width, 128, opad);
370 info.addPara(
"Your commission was annulled by " +
faction.getDisplayNameWithArticle() +
371 " due to your standing falling too low.",
372 opad,
faction.getBaseUIColor(),
373 faction.getDisplayNameWithArticleWithoutArticle());
378 info.addPara(
"You've resigned your commission with " +
faction.getDisplayNameWithArticle() +
380 opad,
faction.getBaseUIColor(),
381 faction.getDisplayNameWithArticleWithoutArticle());
384 info.addPara(
"You've accepted a %s commission.",
385 opad,
faction.getBaseUIColor(), Misc.ucFirst(
faction.getPersonNamePrefix()));
389 info.addPara(
"The combat bounty payment depends on the number and size of ships destroyed.", opad);
396 info.addPara(
"Most recent bounty:", opad);
398 info.addPara(
"%s received", opad, tc, h, Misc.getDGSCredits(
latestResult.payment));
400 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
401 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
404 null,
null, info, tc,
false, 0f);
413 info.addPara(
"You can not resign your commission while polities under your "
414 +
"control are members of the League.", opad);
424 Set<String> tags = super.getIntelTags(map);
425 tags.remove(Tags.INTEL_ACCEPTED);
426 tags.remove(Tags.INTEL_MISSIONS);
428 tags.add(Tags.INTEL_AGREEMENTS);
445 CustomRepImpact impact =
new CustomRepImpact();
450 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
451 new RepActionEnvelope(RepActions.CUSTOM,
452 impact,
null, dialog !=
null ? dialog.getTextPanel() :
null,
false,
true),
454 return new MissionResult();
456 return new MissionResult();
461 return new MissionResult();
485 float f = 1f / numIter;
488 MonthlyReport report = SharedData.getData().getCurrentReport();
490 FDNode fleetNode = report.getNode(MonthlyReport.FLEET);
491 fleetNode.name =
"Fleet";
492 fleetNode.custom = MonthlyReport.FLEET;
493 fleetNode.tooltipCreator = report.getMonthlyReportTooltip();
496 FDNode stipendNode = report.getNode(fleetNode,
"node_id_stipend_" +
faction.getId());
497 stipendNode.income += stipend * f;
499 if (stipendNode.name ==
null) {
500 stipendNode.name =
faction.getDisplayName() +
" Commission";
501 stipendNode.icon =
faction.getCrest();
502 stipendNode.tooltipCreator =
new TooltipCreator() {
503 public boolean isTooltipExpandable(Object tooltipParam) {
506 public float getTooltipWidth(Object tooltipParam) {
509 public void createTooltip(TooltipMakerAPI tooltip,
boolean expanded, Object tooltipParam) {
510 tooltip.addPara(
"Your monthly stipend for holding a " +
faction.getDisplayName() +
" commission", 0f);
static SettingsAPI getSettings()
static Logger getLogger(Class c)
static SectorAPI getSector()
static void addRequiredStanding(FactionAPI faction, RepLevel req, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad, boolean orBetter)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
static void addCurrentStanding(FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad)
boolean isSendingUpdate()
void unindent(TooltipMakerAPI info)
void sendUpdateIfPlayerHasIntel(Object listInfoParam, TextPanelAPI textPanel)
Object getListInfoParam()
Color getBulletColorForMode(ListInfoMode mode)
void setImportant(Boolean important)
void bullet(TooltipMakerAPI info)
Color getTitleColor(ListInfoMode mode)
void setMissionState(MissionState missionState)
MissionResult missionResult
void addAbandonButton(TooltipMakerAPI info, float width)
void setMissionResult(MissionResult missionResult)
void createSmallDescription(TooltipMakerAPI info, float width, float height)
void makeRepChanges(InteractionDialogAPI dialog)
void makeHostile(FactionAPI other, InteractionDialogAPI dialog)
SectorEntityToken getMapLocation(SectorMapAPI map)
void reportEconomyTick(int iterIndex)
void undoRepChange(FactionAPI other, InteractionDialogAPI dialog)
float getNoPenaltyAbandonDays()
LinkedHashMap< String, RepChangeData > repChanges
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
FactionAPI getFactionForUIColors()
String getMissionTypeNoun()
void advanceMission(float amount)
void createSmallDescription(TooltipMakerAPI info, float width, float height, boolean forMarketConditionTooltip)
void endMission(InteractionDialogAPI dialog)
List< FactionAPI > getRelevantFactions()
Set< String > getIntelTags(SectorMapAPI map)
void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode)
void reportEconomyMonthEnd()
MissionResult createAbandonedResult(boolean withPenalty)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
CommissionBountyResult latestResult
String getSmallDescriptionTitle()
MissionResult createTimeRanOutFailedResult()
void undoAllRepChanges(InteractionDialogAPI dialog)
void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode)
FactionCommissionIntel(FactionAPI faction)
List< FactionAPI > getHostileFactions()
MissionResult createResignedCommissionResult(boolean withPenalty, boolean inPerson, InteractionDialogAPI dialog)
static String UPDATE_PARAM_ACCEPTED
static boolean isLeagueMember()
float getFloat(String key)