1package com.fs.starfarer.api.impl.campaign.intel;
7import org.apache.log4j.Logger;
9import com.fs.starfarer.api.EveryFrameScript;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.BattleAPI;
12import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
13import com.fs.starfarer.api.campaign.CampaignFleetAPI;
14import com.fs.starfarer.api.campaign.FactionAPI;
15import com.fs.starfarer.api.campaign.LocationAPI;
16import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
17import com.fs.starfarer.api.campaign.SectorEntityToken;
18import com.fs.starfarer.api.campaign.StarSystemAPI;
19import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.ActionType;
20import com.fs.starfarer.api.campaign.econ.MarketAPI;
21import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
22import com.fs.starfarer.api.fleet.FleetMemberAPI;
23import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
24import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
25import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
26import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript;
27import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript.MilitaryResponseParams;
28import com.fs.starfarer.api.impl.campaign.econ.BaseMarketConditionPlugin;
29import com.fs.starfarer.api.impl.campaign.ids.Factions;
30import com.fs.starfarer.api.impl.campaign.ids.Tags;
31import com.fs.starfarer.api.ui.SectorMapAPI;
32import com.fs.starfarer.api.ui.TooltipMakerAPI;
33import com.fs.starfarer.api.util.Misc;
74 float marketSize =
market.getSize();
79 float highStabilityMult = BaseMarketConditionPlugin.getHighStabilityBonusMult(
market);
80 highStabilityMult = 1f + (highStabilityMult - 1f) * 0.5f;
90 log.info(String.format(
"Starting bounty at market [%s], %d credits per frigate",
market.getName(), (int)
baseBounty));
92 updateLikelyCauseFaction();
106 MilitaryResponseParams params =
new MilitaryResponseParams(ActionType.HOSTILE,
107 "system_bounty_" +
market.getId(),
109 market.getPrimaryEntity(),
149 private void updateLikelyCauseFaction() {
151 MarketAPI maxOther =
null;
152 for (MarketAPI other : Misc.getNearbyMarkets(
market.getLocationInHyperspace(), 0f)) {
153 if (
market.getFaction() == other.getFaction())
continue;
154 if (!
market.getFaction().isHostileTo(other.getFaction()))
continue;
156 int size = other.getSize();
157 if (size > maxSize) {
163 if (maxOther !=
null) {
201 super.notifyEnding();
202 log.info(String.format(
"Ending bounty at market [%s]",
market.getName()));
212 public static class SystemBountyResult {
214 public float fraction;
215 public ReputationAdjustmentResult rep;
216 public SystemBountyResult(
int payment,
float fraction, ReputationAdjustmentResult rep) {
217 this.payment = payment;
218 this.fraction = fraction;
230 if (!battle.isPlayerInvolved())
return;
232 if (!Misc.isNear(primaryWinner,
market.getLocationInHyperspace()))
return;
235 float fpDestroyed = 0;
236 for (CampaignFleetAPI otherFleet : battle.getNonPlayerSideSnapshot()) {
238 if (!
market.getFaction().isHostileTo(otherFleet.getFaction()) &&
239 !otherFleet.getFaction().isHostileTo(Factions.INDEPENDENT))
continue;
241 if (Misc.isTrader(otherFleet))
continue;
242 if (Factions.INDEPENDENT.equals(otherFleet.getFaction().getId()))
continue;
244 if (!
market.getFaction().isHostileTo(otherFleet.getFaction()))
continue;
248 for (FleetMemberAPI loss : Misc.getSnapshotMembersLost(otherFleet)) {
249 float mult = Misc.getSizeNum(loss.getHullSpec().getHullSize());
251 fpDestroyed += loss.getFleetPointCost();
254 payment += (int) (bounty * battle.getPlayerInvolvementFraction());
258 Global.
getSector().getPlayerFleet().getCargo().getCredits().add(payment);
260 float repFP = (int)(fpDestroyed * battle.getPlayerInvolvementFraction());
261 ReputationAdjustmentResult rep =
Global.
getSector().adjustPlayerReputation(
262 new RepActionEnvelope(RepActions.SYSTEM_BOUNTY_REWARD,
new Float(repFP),
null,
null,
true,
false),
263 market.getFaction().getId());
264 latestResult =
new SystemBountyResult(payment, battle.getPlayerInvolvementFraction(), rep);
274 Color h = Misc.getHighlightColor();
275 Color g = Misc.getGrayColor();
280 if (mode == ListInfoMode.IN_DESC) initPad = opad;
291 info.addPara(
"%s received", initPad, tc, h, Misc.getDGSCredits(
latestResult.payment));
293 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
294 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
297 null,
null, info, tc, isUpdate, 0f);
298 }
else if (mode == ListInfoMode.IN_DESC) {
299 info.addPara(
"%s base reward per frigate", initPad, tc, h, Misc.getDGSCredits(
baseBounty));
305 info.addPara(
"Faction: " +
faction.getDisplayName(), initPad, tc,
307 info.addPara(
"%s base reward per frigate", 0f, tc, h, Misc.getDGSCredits(
baseBounty));
319 Color h = Misc.getHighlightColor();
320 Color g = Misc.getGrayColor();
325 info.addPara(
getName(), c, 0f);
331 return "System Bounty";
335 String name =
market.getName();
336 StarSystemAPI system =
market.getStarSystem();
337 if (system !=
null) {
338 name = system.getBaseName();
341 return "Bounty Ended - " + name;
343 return "System Bounty - " + name;
360 boolean forMarketConditionTooltip) {
361 Color h = Misc.getHighlightColor();
362 Color g = Misc.getGrayColor();
363 Color tc = Misc.getTextColor();
371 if (!forMarketConditionTooltip) {
372 info.addImage(
faction.getLogo(), width, 128, opad);
375 String locStr =
"near " +
market.getName();
376 if (
market.getStarSystem() !=
null) {
377 locStr =
"in or near the " +
market.getStarSystem().getNameWithLowercaseType();
381 info.addPara(
"%s commercial concerns " +
market.getOnOrAt() +
" " +
market.getName() +
382 " have banded together and posted a modest but long-term bounty on all "
383 +
"hostile fleets " + locStr +
".",
384 opad,
faction.getBaseUIColor(), Misc.ucFirst(
faction.getPersonNamePrefix()));
385 info.addPara(
"The bounty stipulates that trade fleets are an exception - "
386 +
"attacking them will not result in a reward, regardless of their faction.", opad);
388 info.addPara(
"%s authorities " +
market.getOnOrAt() +
" " +
market.getName() +
389 " have posted a bounty on all hostile fleets " + locStr +
".",
390 opad,
faction.getBaseUIColor(), Misc.ucFirst(
faction.getPersonNamePrefix()));
394 info.addPara(
"This bounty is no longer on offer.", opad);
407 info.addPara(
"Likely triggered by %s activity.",
411 info.addPara(
"Triggered by the presence of Commerce on one of your colonies in-system, and by the "
412 +
"level of hostile activity.", opad);
416 info.addPara(
"Payment depends on the number and size of ships destroyed. " +
417 "Standing with " +
faction.getDisplayNameWithArticle() +
" may also improve.",
424 String isOrAre =
faction.getDisplayNameIsOrAre();
427 if (hostile.isEmpty()) {
428 info.addPara(Misc.ucFirst(
faction.getDisplayNameWithArticle()) +
" " + isOrAre +
" not currently hostile to any major factions.", 0f);
430 info.addPara(Misc.ucFirst(
faction.getDisplayNameWithArticle()) +
" " + isOrAre +
" currently hostile to:", opad);
432 info.setParaFontDefault();
436 for (FactionAPI other : hostile) {
437 info.addPara(Misc.ucFirst(other.getDisplayName()), other.getBaseUIColor(), initPad);
440 info.setBulletedListMode(
null);
448 info.addPara(
"Most recent bounty:", opad);
450 info.addPara(
"%s received", pad, tc, h, Misc.getDGSCredits(
latestResult.payment));
452 info.addPara(
"%s share based on damage dealt", 0f, tc, h,
453 "" + (
int) Math.round(
latestResult.fraction * 100f) +
"%");
456 null,
null, info, tc,
false, 0f);
467 Set<String> tags = super.getIntelTags(map);
468 tags.add(Tags.INTEL_BOUNTY);
475 return market.getPrimaryEntity();
static SettingsAPI getSettings()
static Logger getLogger(Class c)
static SectorAPI getSector()
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
void setElapsed(float elapsed)
Float endingTimeRemaining
void unindent(TooltipMakerAPI info)
void addDays(TooltipMakerAPI info, String after, float days)
void sendUpdateIfPlayerHasIntel(Object listInfoParam, TextPanelAPI textPanel)
Object getListInfoParam()
static final String INDENT
Color getBulletColorForMode(ListInfoMode mode)
void bullet(TooltipMakerAPI info)
Color getTitleColor(ListInfoMode mode)
List< FactionAPI > getHostileFactions()
float getTimeRemainingFraction()
void setCommerceMode(boolean commerceMode)
void setDuration(float duration)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
MilitaryResponseScript script
SystemBountyResult latestResult
void advanceImpl(float amount)
void reportMadeVisibleToPlayer()
void setElapsedDays(float elapsedDays)
Set< String > getIntelTags(SectorMapAPI map)
SectorEntityToken getMapLocation(SectorMapAPI map)
LocationAPI getLocation()
void setBaseBounty(float baseBounty)
void createSmallDescription(TooltipMakerAPI info, float width, float height, boolean forMarketConditionTooltip)
String getSmallDescriptionTitle()
void createSmallDescription(TooltipMakerAPI info, float width, float height)
void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
SystemBountyIntel(MarketAPI market)
SystemBountyIntel(MarketAPI market, int baseReward, boolean commerceMode)
FactionAPI getFactionForUIColors()
void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode)
static float MAX_DURATION
String getSpriteName(String category, String id)
float getFloat(String key)