1package com.fs.starfarer.api.impl.campaign.intel.bases;
3import java.util.LinkedHashMap;
5import java.util.Random;
10import org.apache.log4j.Logger;
11import org.json.JSONException;
12import org.json.JSONObject;
14import com.fs.starfarer.api.EveryFrameScript;
15import com.fs.starfarer.api.Global;
16import com.fs.starfarer.api.campaign.BattleAPI;
17import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
18import com.fs.starfarer.api.campaign.CampaignFleetAPI;
19import com.fs.starfarer.api.campaign.FactionAPI;
20import com.fs.starfarer.api.campaign.PersonImportance;
21import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin.ReputationAdjustmentResult;
22import com.fs.starfarer.api.campaign.SectorEntityToken;
23import com.fs.starfarer.api.campaign.StarSystemAPI;
24import com.fs.starfarer.api.campaign.TextPanelAPI;
25import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
26import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
27import com.fs.starfarer.api.campaign.econ.EconomyAPI.EconomyUpdateListener;
28import com.fs.starfarer.api.campaign.econ.Industry;
29import com.fs.starfarer.api.campaign.econ.MarketAPI;
30import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
31import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
32import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
33import com.fs.starfarer.api.characters.PersonAPI;
34import com.fs.starfarer.api.combat.MutableStat.StatMod;
35import com.fs.starfarer.api.fleet.FleetMemberAPI;
36import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
37import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
38import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
39import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
40import com.fs.starfarer.api.impl.campaign.DebugFlags;
41import com.fs.starfarer.api.impl.campaign.ids.Conditions;
42import com.fs.starfarer.api.impl.campaign.ids.Entities;
43import com.fs.starfarer.api.impl.campaign.ids.Factions;
44import com.fs.starfarer.api.impl.campaign.ids.Industries;
45import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
46import com.fs.starfarer.api.impl.campaign.ids.Ranks;
47import com.fs.starfarer.api.impl.campaign.ids.Stats;
48import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
49import com.fs.starfarer.api.impl.campaign.ids.Tags;
50import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
51import com.fs.starfarer.api.impl.campaign.intel.PersonBountyIntel.BountyResult;
52import com.fs.starfarer.api.impl.campaign.intel.PersonBountyIntel.BountyResultType;
53import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarData;
54import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicPathBaseBarEvent;
55import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel.BaseBountyData;
56import com.fs.starfarer.api.impl.campaign.intel.deciv.DecivTracker;
57import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel;
58import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidDelegate;
59import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidStageStatus;
60import com.fs.starfarer.api.impl.campaign.procgen.MarkovNames;
61import com.fs.starfarer.api.impl.campaign.procgen.MarkovNames.MarkovNameResult;
62import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
63import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.AddedEntity;
64import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.EntityLocation;
65import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.LocationType;
66import com.fs.starfarer.api.ui.Alignment;
67import com.fs.starfarer.api.ui.SectorMapAPI;
68import com.fs.starfarer.api.ui.TooltipMakerAPI;
69import com.fs.starfarer.api.util.IntervalUtil;
70import com.fs.starfarer.api.util.Misc;
71import com.fs.starfarer.api.util.WeightedRandomPicker;
74 EconomyUpdateListener, RaidDelegate {
78 public static String
MEM_FLAG =
"$core_luddicPathBase";
98 protected boolean large =
false;
144 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
145 weights.put(LocationType.IN_ASTEROID_BELT, 10f);
146 weights.put(LocationType.IN_ASTEROID_FIELD, 10f);
147 weights.put(LocationType.IN_RING, 10f);
148 weights.put(LocationType.IN_SMALL_NEBULA, 10f);
149 weights.put(LocationType.GAS_GIANT_ORBIT, 10f);
150 weights.put(LocationType.PLANET_ORBIT, 10f);
154 weights.put(LocationType.STAR_ORBIT, 10f);
155 weights.put(LocationType.OUTER_SYSTEM, 0.0001f);
158 EntityLocation loc = locs.
pick();
167 if (added ==
null || added.entity ==
null) {
223 log.info(String.format(
"Added luddic path base in [%s], isLarge: %s",
system.
getName(),
"" +
large));
229 if (super.isHidden())
return true;
243 if (status == RaidStageStatus.SUCCESS) {
314 for (String key : JSONObject.getNames(json)) {
315 stations.
add(key, (
float) json.optDouble(key, 0f));
320 }
catch (JSONException e) {
324 return stations.
pick();
339 String currIndId =
null;
340 if (stationInd !=
null) {
341 currIndId = stationInd.
getId();
346 if (currIndId ==
null) {
350 if (currIndId ==
null)
return;
354 if (stationInd ==
null)
return;
360 if (fleet ==
null)
return;
363 if (members.size() < 1)
return;
413 bountyData.bountyElapsedDays += days;
444 super.notifyEnding();
445 log.info(String.format(
"Removing luddic path base at [%s]",
system.
getName()));
470 result =
new BountyResult(BountyResultType.END_OTHER, 0,
null);
472 if (reason == FleetDespawnReason.DESTROYED_BY_BATTLE &&
483 CustomRepImpact impact =
new CustomRepImpact();
485 if (impact.delta < 0.01f) impact.delta = 0.01f;
487 new RepActionEnvelope(RepActions.CUSTOM,
488 impact,
null,
null,
false,
true),
491 result =
new BountyResult(BountyResultType.END_PLAYER_BOUNTY, payment, rep);
493 result =
new BountyResult(BountyResultType.END_PLAYER_NO_REWARD, 0,
null);
498 boolean sendUpdate = DebugFlags.SEND_UPDATES_WHEN_NO_COMM ||
499 result.type != BountyResultType.END_OTHER ||
535 if (mode == ListInfoMode.IN_DESC) initPad = opad;
545 if (isUpdate || mode != ListInfoMode.IN_DESC) {
558 case END_PLAYER_BOUNTY:
561 null,
null, info, tc, isUpdate, 0f);
587 return base +
" Base";
594 return base +
" Base - Bounty Posted";
596 return base +
" Base - Bounty Expired";
600 if (
result.type == BountyResultType.END_PLAYER_BOUNTY) {
601 return base +
" Base - Bounty Completed";
602 }
else if (
result.type == BountyResultType.END_PLAYER_NO_REWARD) {
603 return base +
" Base - Destroyed";
610 return base +
" Base - Abandoned";
613 return base +
" Base - Discovered";
616 return base +
" Base - Exact Location Unknown";
618 return base +
" Base - " + name;
645 " established a base in the " +
647 "The base serves to provide material support to active Pather cells on nearby colonies, enabling them " +
648 "to cause widespread damage and destruction.",
653 info.
addPara(
"It has extremely well-developed defensive capabilities " +
654 "and is protected by a large number of fleets.", opad);
656 info.
addPara(
"It has well-developed defensive capabilities " +
657 "and is protected by a large number of fleets.", opad);
660 info.
addPara(
"You have not yet discovered the exact location or capabilities of this base.", opad);
667 if (!cells.isEmpty()) {
668 float initPad = opad;
670 info.
addPara(
"This base is known to be providing support to active Pather cells at the following colonies:", opad);
677 info.
addPara(
"You do not know of any active pather cells this base might be providing support to.", opad);
684 " posted a bounty for the destruction of this base.",
688 if (
result !=
null &&
result.type == BountyResultType.END_PLAYER_BOUNTY) {
689 info.
addPara(
"You have successfully completed this bounty.", opad);
696 if (
result.type == BountyResultType.END_PLAYER_NO_REWARD) {
697 info.
addPara(
"You have destroyed this base.", opad);
698 }
else if (
result.type == BountyResultType.END_OTHER) {
699 info.
addPara(
"It is rumored that this base is no longer operational.", opad);
711 Set<String> tags = super.getIntelTags(map);
723 if (cell.getMarket().isPlayerOwned() && !cell.isSleeper()) {
749 MarkovNameResult gen =
null;
750 for (
int i = 0; i < 10; i++) {
753 String test = gen.name;
754 if (test.toLowerCase().startsWith(
"the "))
continue;
755 String p = pickPostfix();
756 if (p !=
null && !p.isEmpty()) {
759 if (test.length() > 22)
continue;
767 private String pickPostfix() {
779 post.
add(
"Sanctuary");
783 post.
add(
"Safehold");
784 post.
add(
"Terminus");
785 post.
add(
"Principle");
786 post.
add(
"Offering");
787 post.
add(
"Devotion");
788 post.
add(
"Atonement");
789 post.
add(
"Cleansing");
790 post.
add(
"Oblation");
791 post.
add(
"Sacrement");
801 curr = Math.round(mod.value);
806 if (m.value < 0)
continue;
807 avWithoutPenalties += (int) Math.round(m.value);
811 a = avWithoutPenalties - curr;
815 int supply = Math.max(1, d - a);
821 float qualityBonus = 0f;
840 "Development level");
842 float fleetSizeBonus = 0.5f;
843 if (
large) fleetSizeBonus = 1f;
846 "Development level");
868 if (intel !=
this && intel.
bountyData !=
null) {
874 float base = 100000f;
877 bountyData.repChange = 0.05f;
880 bountyData.repChange = 0.1f;
883 bountyData.baseBounty = base * (0.9f + (float) Math.random() * 0.2f);
884 bountyData.baseBounty = (int)(
bountyData.baseBounty / 10000) * 10000;
889 FactionAPI faction = cell.getMarket().getFaction();
891 picker.
add(faction, (
float) Math.pow(2f, cell.getMarket().getSize()));
901 bountyData.bountyFaction = faction;
902 bountyData.bountyDuration = 180f;
903 bountyData.bountyElapsedDays = 0f;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static Logger getLogger(Class c)
static SectorAPI getSector()
static void reportCellDisrupted(LuddicPathCellsIntel cell)
void modifyFlat(String source, float value)
StatMod getFlatStatMod(String source)
HashMap< String, StatMod > getFlatMods()
void modifyFlatAlways(String source, float value, String desc)
void modifyFlat(String source, float value)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
static boolean SEND_UPDATES_WHEN_NO_COMM
static boolean PATHER_BASE_DEBUG
static final String POPULATION_3
static final String MAKESHIFT_STATION
static final String LUDDIC_PATH
static final String CUSTOM_PATHER_BASES_LARGE
static final String CUSTOM_PATHER_BASES_SMALL
static final String TAG_STATION
static final String POPULATION
static final String SPACEPORT
static final String MILITARYBASE
static final String ORBITALSTATION
static String HIDDEN_BASE_MEM_FLAG
static String POST_STATION_COMMANDER
static String SPACE_CAPTAIN
static final String COMBAT_FLEET_SIZE_MULT
static final String PATROL_NUM_MEDIUM_MOD
static final String PATROL_NUM_LIGHT_MOD
static final String FLEET_QUALITY_MOD
static final String PATROL_NUM_HEAVY_MOD
static final String SUBMARKET_OPEN
static final String SUBMARKET_BLACK
Set< String > getTagsForSort()
String getSortStringNewestFirst()
void sendUpdate(Object listInfoParam, TextPanelAPI textPanel)
void unindent(TooltipMakerAPI info)
void addDays(TooltipMakerAPI info, String after, float days)
Long getPlayerVisibleTimestamp()
void sendUpdateIfPlayerHasIntel(Object listInfoParam, TextPanelAPI textPanel)
Object getListInfoParam()
Color getBulletColorForMode(ListInfoMode mode)
void bullet(TooltipMakerAPI info)
Color getTitleColor(ListInfoMode mode)
static void addMarketToList(TooltipMakerAPI info, MarketAPI market, float pad)
void notifyRaidEnded(RaidIntel raid, RaidStageStatus status)
static LuddicPathBaseIntel getIntelFor(MarketAPI market)
void addBulletPoints(TooltipMakerAPI info, ListInfoMode mode)
void setBaseCommander(PersonAPI baseCommander)
Set< String > getIntelTags(SectorMapAPI map)
String pickStationType(boolean large)
SectorEntityToken getEntity()
void updateStationIfNeeded(boolean large)
static final String PATHER_BASE_COMMANDER
BaseBountyData bountyData
CampaignFleetAPI addedListenerTo
void createSmallDescription(TooltipMakerAPI info, float width, float height)
LuddicPathBaseIntel(StarSystemAPI system, String factionId)
IntervalUtil monthlyInterval
float getTimeRemainingFraction()
boolean isEconomyListenerExpired()
void createIntelInfo(TooltipMakerAPI info, ListInfoMode mode)
Industry getStationIndustry()
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
static LuddicPathBaseIntel getIntelFor(StarSystemAPI system)
List< ArrowData > getArrowData(SectorMapAPI map)
static Object BOUNTY_EXPIRED_PARAM
String getSmallDescriptionTitle()
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
static Object DISCOVERED_PARAM
PersonAPI getBaseCommander()
void makeKnown(TextPanelAPI text)
SectorEntityToken getMapLocation(SectorMapAPI map)
void commodityUpdated(String commodityId)
void advanceImpl(float amount)
FactionAPI getFactionForUIColors()
StarSystemAPI getSystem()
static LuddicPathBaseManager getInstance()
static List< LuddicPathCellsIntel > getCellsForBase(LuddicPathBaseIntel base, boolean includeSleeper)
static Object UPDATE_DISRUPTED
static void markRecentlyUsedForBase(StarSystemAPI system)
static final String NO_DECIV_KEY
static MarkovNameResult generate(Random random)
static void loadIfNeeded()
static WeightedRandomPicker< EntityLocation > getLocations(Random random, StarSystemAPI system, float minGap, LinkedHashMap< LocationType, Float > weights)
static void convertOrbitWithSpin(SectorEntityToken entity, float spin)
static AddedEntity addNonSalvageEntity(LocationAPI system, EntityLocation loc, String type, String faction)
void advance(float amount)
static Color getTextColor()
static String getDGSCredits(float num)
static String ucFirst(String str)
static void removeRadioChatter(MarketAPI market)
static void makeImportant(SectorEntityToken entity, String reason)
static Color getGrayColor()
static void fadeAndExpire(SectorEntityToken entity)
static void makeUnimportant(SectorEntityToken entity, String reason)
static Color getHighlightColor()
static CampaignFleetAPI getStationFleet(MarketAPI market)
MarketAPI createMarket(String id, String name, int size)
String getSpriteName(String category, String id)
float getFloat(String key)
float getPlayerInvolvementFraction()
boolean isPlayerInvolved()
float convertToDays(float realSeconds)
FleetDataAPI getFleetData()
MutableValue getCredits()
String addPerson(PersonAPI person)
String getDisplayNameHasOrHave()
String getDisplayNameWithArticleWithoutArticle()
String getDisplayNameWithArticle()
PersonAPI createRandomPerson()
float getTariffFraction()
boolean isPlayerFaction()
List< FleetMemberAPI > getMembersListCopy()
void addEventListener(FleetEventListener listener)
void removeEventListener(FleetEventListener listener)
String getNameWithLowercaseType()
CampaignFleetAPI getPlayerFleet()
ReputationAdjustmentResult adjustPlayerReputation(Object action, String factionId)
CampaignClockAPI getClock()
IntelManagerAPI getIntelManager()
ListenerManagerAPI getListenerManager()
StatBonus getDetectedRangeMod()
boolean isInCurrentLocation()
void setSensorProfile(Float sensorProfile)
void setDiscoverable(Boolean discoverable)
void setName(String name)
void setMarket(MarketAPI market)
SectorEntityToken getCenter()
void addIntel(IntelInfoPlugin plugin)
void removeIntel(IntelInfoPlugin plugin)
List< IntelInfoPlugin > getIntel()
boolean isPlayerInRangeOfCommRelay()
MutableStatWithTempMods getAvailableStat()
void addUpdateListener(EconomyUpdateListener listener)
void addMarket(MarketAPI market, boolean withJunkAndChatter)
void removeMarket(MarketAPI market)
void removeUpdateListener(EconomyUpdateListener listener)
void finishBuildingOrUpgrading()
void setSurveyLevel(SurveyLevel surveyLevel)
LocationAPI getContainingLocation()
void setEconGroup(String econGroup)
void setFactionId(String factionId)
void addSubmarket(String specId)
void setHidden(Boolean hidden)
CommodityOnMarketAPI getCommodityData(String commodityId)
void setPrimaryEntity(SectorEntityToken primaryEntity)
MutableMarketStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
void setName(String name)
CommDirectoryAPI getCommDirectory()
void advance(float amount)
void removeIndustry(String id, MarketInteractionMode mode, boolean forUpgrade)
String addCondition(String id)
List< Industry > getIndustries()
SectorEntityToken getPrimaryEntity()
void addIndustry(String id)
void addListener(Object listener)
void removeListener(Object listener)
void set(String key, Object value)
void setImportance(PersonImportance importance)
void setImportanceAndVoice(PersonImportance importance, Random random)
void setRankId(String rank)
MemoryAPI getMemoryWithoutUpdate()
void setPostId(String postId)
DynamicStatsAPI getDynamic()
StatBonus getMod(String id)