001package com.fs.starfarer.api.impl.campaign;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.HashMap;
006import java.util.HashSet;
007import java.util.Iterator;
008import java.util.LinkedHashSet;
009import java.util.List;
010import java.util.Map;
011import java.util.Random;
012import java.util.Set;
013
014import com.fs.starfarer.api.BaseModPlugin;
015import com.fs.starfarer.api.EveryFrameScript;
016import com.fs.starfarer.api.Global;
017import com.fs.starfarer.api.PluginPick;
018import com.fs.starfarer.api.campaign.CampaignFleetAPI;
019import com.fs.starfarer.api.campaign.CampaignPlugin.PickPriority;
020import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
021import com.fs.starfarer.api.campaign.FactionAPI;
022import com.fs.starfarer.api.campaign.GenericPluginManagerAPI;
023import com.fs.starfarer.api.campaign.JumpPointAPI.JumpDestination;
024import com.fs.starfarer.api.campaign.LocationAPI;
025import com.fs.starfarer.api.campaign.PersonImportance;
026import com.fs.starfarer.api.campaign.PlayerMarketTransaction.TransactionLineItem;
027import com.fs.starfarer.api.campaign.SectorAPI;
028import com.fs.starfarer.api.campaign.SectorEntityToken;
029import com.fs.starfarer.api.campaign.SpecialItemData;
030import com.fs.starfarer.api.campaign.StarSystemAPI;
031import com.fs.starfarer.api.campaign.econ.Industry;
032import com.fs.starfarer.api.campaign.econ.MarketAPI;
033import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
034import com.fs.starfarer.api.campaign.econ.MonthlyReport;
035import com.fs.starfarer.api.campaign.econ.MonthlyReport.FDNode;
036import com.fs.starfarer.api.campaign.events.CampaignEventTarget;
037import com.fs.starfarer.api.campaign.listeners.CoreDiscoverEntityPlugin;
038import com.fs.starfarer.api.campaign.listeners.ListenerManagerAPI;
039import com.fs.starfarer.api.campaign.listeners.TestIndustryOptionProvider;
040import com.fs.starfarer.api.characters.AdminData;
041import com.fs.starfarer.api.characters.ImportantPeopleAPI;
042import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
043import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
044import com.fs.starfarer.api.characters.PersonAPI;
045import com.fs.starfarer.api.characters.SkillsChangeOfficerEffect;
046import com.fs.starfarer.api.characters.SkillsChangeRemoveExcessOPEffect;
047import com.fs.starfarer.api.characters.SkillsChangeRemoveSmodsEffect;
048import com.fs.starfarer.api.characters.SkillsChangeRemoveVentsCapsEffect;
049import com.fs.starfarer.api.combat.ShipAIConfig;
050import com.fs.starfarer.api.combat.ShipAIPlugin;
051import com.fs.starfarer.api.combat.ShipAPI;
052import com.fs.starfarer.api.fleet.FleetMemberAPI;
053import com.fs.starfarer.api.impl.PlayerFleetPersonnelTracker;
054import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.MissionCompletionRep;
055import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin.DerelictShipData;
056import com.fs.starfarer.api.impl.campaign.GateEntityPlugin.GateData;
057import com.fs.starfarer.api.impl.campaign.MilitaryResponseScript.MilitaryResponseParams;
058import com.fs.starfarer.api.impl.campaign.TowCable.TowCableBuff;
059import com.fs.starfarer.api.impl.campaign.abilities.BaseAbilityPlugin;
060import com.fs.starfarer.api.impl.campaign.abilities.BaseDurationAbility;
061import com.fs.starfarer.api.impl.campaign.abilities.BaseToggleAbility;
062import com.fs.starfarer.api.impl.campaign.abilities.DistressCallAbility;
063import com.fs.starfarer.api.impl.campaign.abilities.DistressCallAbility.AbilityUseData;
064import com.fs.starfarer.api.impl.campaign.abilities.DistressCallAbility.DistressCallOutcome;
065import com.fs.starfarer.api.impl.campaign.abilities.DistressCallAbility.DistressResponseData;
066import com.fs.starfarer.api.impl.campaign.abilities.DistressCallResponseAssignmentAI;
067import com.fs.starfarer.api.impl.campaign.abilities.DistressCallResponsePirateAssignmentAI;
068import com.fs.starfarer.api.impl.campaign.abilities.EmergencyBurnAbility;
069import com.fs.starfarer.api.impl.campaign.abilities.FractureJumpAbility;
070import com.fs.starfarer.api.impl.campaign.abilities.GoDarkAbility;
071import com.fs.starfarer.api.impl.campaign.abilities.GraviticScanAbility;
072import com.fs.starfarer.api.impl.campaign.abilities.GraviticScanData;
073import com.fs.starfarer.api.impl.campaign.abilities.GraviticScanData.GSPing;
074import com.fs.starfarer.api.impl.campaign.abilities.InterdictionPulseAbility;
075import com.fs.starfarer.api.impl.campaign.abilities.InterdictionPulseAbility.IPReactionScript;
076import com.fs.starfarer.api.impl.campaign.abilities.RemoteSurveyAbility;
077import com.fs.starfarer.api.impl.campaign.abilities.ScavengeAbility;
078import com.fs.starfarer.api.impl.campaign.abilities.SensorBurstAbility;
079import com.fs.starfarer.api.impl.campaign.abilities.SustainedBurnAbility;
080import com.fs.starfarer.api.impl.campaign.abilities.TransponderAbility;
081import com.fs.starfarer.api.impl.campaign.abilities.ai.BaseAbilityAI;
082import com.fs.starfarer.api.impl.campaign.abilities.ai.EmergencyBurnAbilityAI;
083import com.fs.starfarer.api.impl.campaign.abilities.ai.GoDarkAbilityAI;
084import com.fs.starfarer.api.impl.campaign.abilities.ai.InterdictionPulseAbilityAI;
085import com.fs.starfarer.api.impl.campaign.abilities.ai.SensorBurstAbilityAI;
086import com.fs.starfarer.api.impl.campaign.abilities.ai.SustainedBurnAbilityAI;
087import com.fs.starfarer.api.impl.campaign.abilities.ai.TransponderAbilityAI;
088import com.fs.starfarer.api.impl.campaign.command.WarSimScript;
089import com.fs.starfarer.api.impl.campaign.econ.AbandonedStation;
090import com.fs.starfarer.api.impl.campaign.econ.BaseHazardCondition;
091import com.fs.starfarer.api.impl.campaign.econ.BaseMarketConditionPlugin;
092import com.fs.starfarer.api.impl.campaign.econ.CottageIndustry;
093import com.fs.starfarer.api.impl.campaign.econ.Decivilized;
094import com.fs.starfarer.api.impl.campaign.econ.Dissident;
095import com.fs.starfarer.api.impl.campaign.econ.FoodShortage;
096import com.fs.starfarer.api.impl.campaign.econ.FreeMarket;
097import com.fs.starfarer.api.impl.campaign.econ.Frontier;
098import com.fs.starfarer.api.impl.campaign.econ.Headquarters;
099import com.fs.starfarer.api.impl.campaign.econ.Hydroponics;
100import com.fs.starfarer.api.impl.campaign.econ.LargeRefugeePopulation;
101import com.fs.starfarer.api.impl.campaign.econ.LuddicMajority;
102import com.fs.starfarer.api.impl.campaign.econ.OrbitalBurns;
103import com.fs.starfarer.api.impl.campaign.econ.OrganizedCrime;
104import com.fs.starfarer.api.impl.campaign.econ.Outpost;
105import com.fs.starfarer.api.impl.campaign.econ.Population;
106import com.fs.starfarer.api.impl.campaign.econ.RecentUnrest;
107import com.fs.starfarer.api.impl.campaign.econ.RegionalCapital;
108import com.fs.starfarer.api.impl.campaign.econ.ResourceDepositsCondition;
109import com.fs.starfarer.api.impl.campaign.econ.RuralPolity;
110import com.fs.starfarer.api.impl.campaign.econ.ShipbreakingCenter;
111import com.fs.starfarer.api.impl.campaign.econ.ShippingDisruption;
112import com.fs.starfarer.api.impl.campaign.econ.Smuggling;
113import com.fs.starfarer.api.impl.campaign.econ.StealthMinefields;
114import com.fs.starfarer.api.impl.campaign.econ.SystemBounty;
115import com.fs.starfarer.api.impl.campaign.econ.TradeCenter;
116import com.fs.starfarer.api.impl.campaign.econ.TradeDisruption;
117import com.fs.starfarer.api.impl.campaign.econ.UrbanizedPolity;
118import com.fs.starfarer.api.impl.campaign.econ.ViceDemand;
119import com.fs.starfarer.api.impl.campaign.econ.WorldArid;
120import com.fs.starfarer.api.impl.campaign.econ.WorldBarrenMarginal;
121import com.fs.starfarer.api.impl.campaign.econ.WorldDesert;
122import com.fs.starfarer.api.impl.campaign.econ.WorldIce;
123import com.fs.starfarer.api.impl.campaign.econ.WorldJungle;
124import com.fs.starfarer.api.impl.campaign.econ.WorldTerran;
125import com.fs.starfarer.api.impl.campaign.econ.WorldTundra;
126import com.fs.starfarer.api.impl.campaign.econ.WorldTwilight;
127import com.fs.starfarer.api.impl.campaign.econ.WorldUninhabitable;
128import com.fs.starfarer.api.impl.campaign.econ.WorldWater;
129import com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry;
130import com.fs.starfarer.api.impl.campaign.econ.impl.Cryorevival;
131import com.fs.starfarer.api.impl.campaign.econ.impl.Cryorevival.CryosleeperFactor;
132import com.fs.starfarer.api.impl.campaign.econ.impl.Cryosanctum;
133import com.fs.starfarer.api.impl.campaign.econ.impl.Farming;
134import com.fs.starfarer.api.impl.campaign.econ.impl.FuelProduction;
135import com.fs.starfarer.api.impl.campaign.econ.impl.GroundDefenses;
136import com.fs.starfarer.api.impl.campaign.econ.impl.HeavyIndustry;
137import com.fs.starfarer.api.impl.campaign.econ.impl.LightIndustry;
138import com.fs.starfarer.api.impl.campaign.econ.impl.LionsGuardHQ;
139import com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase;
140import com.fs.starfarer.api.impl.campaign.econ.impl.Mining;
141import com.fs.starfarer.api.impl.campaign.econ.impl.OrbitalStation;
142import com.fs.starfarer.api.impl.campaign.econ.impl.PlanetaryShield;
143import com.fs.starfarer.api.impl.campaign.econ.impl.PopulationAndInfrastructure;
144import com.fs.starfarer.api.impl.campaign.econ.impl.PopulationAndInfrastructure.CoronalTapFactor;
145import com.fs.starfarer.api.impl.campaign.econ.impl.Refining;
146import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
147import com.fs.starfarer.api.impl.campaign.econ.impl.Spaceport;
148import com.fs.starfarer.api.impl.campaign.econ.impl.TechMining;
149import com.fs.starfarer.api.impl.campaign.econ.impl.Waystation;
150import com.fs.starfarer.api.impl.campaign.enc.EncounterManager;
151import com.fs.starfarer.api.impl.campaign.enc.StrandedGiveTJScript;
152import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin;
153import com.fs.starfarer.api.impl.campaign.events.CoreEventProbabilityManager;
154import com.fs.starfarer.api.impl.campaign.events.FactionHostilityEvent;
155import com.fs.starfarer.api.impl.campaign.events.FactionHostilityEvent.FactionHostilityPairKey;
156import com.fs.starfarer.api.impl.campaign.events.FoodShortageEvent;
157import com.fs.starfarer.api.impl.campaign.events.InvestigationEventGoodRepWithOther;
158import com.fs.starfarer.api.impl.campaign.events.InvestigationEventSmugglingV2;
159import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent;
160import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent.AvailableOfficer;
161import com.fs.starfarer.api.impl.campaign.events.PriceUpdate;
162import com.fs.starfarer.api.impl.campaign.events.RecentUnrestEvent;
163import com.fs.starfarer.api.impl.campaign.events.RepTrackerEvent;
164import com.fs.starfarer.api.impl.campaign.events.RepTrackerEvent.FactionTradeRepData;
165import com.fs.starfarer.api.impl.campaign.events.TradeInfoUpdateEvent;
166import com.fs.starfarer.api.impl.campaign.events.nearby.DistressCallNormalAssignmentAI;
167import com.fs.starfarer.api.impl.campaign.events.nearby.DistressCallPirateAmbushAssignmentAI;
168import com.fs.starfarer.api.impl.campaign.events.nearby.DistressCallPirateAmbushTrapAssignmentAI;
169import com.fs.starfarer.api.impl.campaign.events.nearby.NearbyEventsEvent;
170import com.fs.starfarer.api.impl.campaign.events.nearby.NearbyEventsEvent.NESpawnData;
171import com.fs.starfarer.api.impl.campaign.fleets.BaseLimitedFleetManager.ManagedFleetData;
172import com.fs.starfarer.api.impl.campaign.fleets.BaseRouteFleetManager;
173import com.fs.starfarer.api.impl.campaign.fleets.CustomFleets;
174import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
175import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
176import com.fs.starfarer.api.impl.campaign.fleets.DisposableAggroAssignmentAI;
177import com.fs.starfarer.api.impl.campaign.fleets.DisposableFleetManager;
178import com.fs.starfarer.api.impl.campaign.fleets.DisposableLuddicPathFleetManager;
179import com.fs.starfarer.api.impl.campaign.fleets.DisposablePirateFleetManager;
180import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetAssignmentAI;
181import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetAssignmentAI.CargoQuantityData;
182import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetAssignmentAI.EconomyRouteData;
183import com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetRouteManager;
184import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
185import com.fs.starfarer.api.impl.campaign.fleets.MercAssignmentAIV2;
186import com.fs.starfarer.api.impl.campaign.fleets.MercFleetManagerV2;
187import com.fs.starfarer.api.impl.campaign.fleets.PatrolAssignmentAI;
188import com.fs.starfarer.api.impl.campaign.fleets.PatrolAssignmentAIV4;
189import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManager;
190import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManager.PatrolFleetData;
191import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManagerV2;
192import com.fs.starfarer.api.impl.campaign.fleets.PersonalFleetHoracioCaden;
193import com.fs.starfarer.api.impl.campaign.fleets.PersonalFleetOxanaHyder;
194import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
195import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
196import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
197import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteFleetSpawner;
198import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
199import com.fs.starfarer.api.impl.campaign.fleets.SDFHegemony;
200import com.fs.starfarer.api.impl.campaign.fleets.SDFLeague;
201import com.fs.starfarer.api.impl.campaign.fleets.SDFLuddicChurch;
202import com.fs.starfarer.api.impl.campaign.fleets.SDFTriTachyon;
203import com.fs.starfarer.api.impl.campaign.fleets.SeededFleetManager;
204import com.fs.starfarer.api.impl.campaign.fleets.SeededFleetManager.SeededFleet;
205import com.fs.starfarer.api.impl.campaign.fleets.SourceBasedFleetManager;
206import com.fs.starfarer.api.impl.campaign.fleets.misc.MiscFleetRouteManager;
207import com.fs.starfarer.api.impl.campaign.ghosts.SensorGhostManager;
208import com.fs.starfarer.api.impl.campaign.graid.StandardGroundRaidObjectivesCreator;
209import com.fs.starfarer.api.impl.campaign.ids.Commodities;
210import com.fs.starfarer.api.impl.campaign.ids.Conditions;
211import com.fs.starfarer.api.impl.campaign.ids.Factions;
212import com.fs.starfarer.api.impl.campaign.ids.Industries;
213import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
214import com.fs.starfarer.api.impl.campaign.ids.Missions;
215import com.fs.starfarer.api.impl.campaign.ids.People;
216import com.fs.starfarer.api.impl.campaign.ids.Personalities;
217import com.fs.starfarer.api.impl.campaign.ids.Ranks;
218import com.fs.starfarer.api.impl.campaign.ids.Skills;
219import com.fs.starfarer.api.impl.campaign.ids.Tags;
220import com.fs.starfarer.api.impl.campaign.intel.AnalyzeEntityIntelCreator;
221import com.fs.starfarer.api.impl.campaign.intel.AnalyzeEntityMissionIntel;
222import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
223import com.fs.starfarer.api.impl.campaign.intel.BaseMissionIntel;
224import com.fs.starfarer.api.impl.campaign.intel.BaseMissionIntel.MissionResult;
225import com.fs.starfarer.api.impl.campaign.intel.FactionCommissionIntel;
226import com.fs.starfarer.api.impl.campaign.intel.FactionCommissionIntel.RepChangeData;
227import com.fs.starfarer.api.impl.campaign.intel.FactionHostilityIntel;
228import com.fs.starfarer.api.impl.campaign.intel.FactionHostilityManager;
229import com.fs.starfarer.api.impl.campaign.intel.GenericMissionManager;
230import com.fs.starfarer.api.impl.campaign.intel.PersonBountyIntel;
231import com.fs.starfarer.api.impl.campaign.intel.PersonBountyManager;
232import com.fs.starfarer.api.impl.campaign.intel.ProcurementMissionCreator;
233import com.fs.starfarer.api.impl.campaign.intel.ProcurementMissionIntel;
234import com.fs.starfarer.api.impl.campaign.intel.SurveyPlanetIntelCreator;
235import com.fs.starfarer.api.impl.campaign.intel.SurveyPlanetMissionIntel;
236import com.fs.starfarer.api.impl.campaign.intel.SystemBountyIntel;
237import com.fs.starfarer.api.impl.campaign.intel.SystemBountyManager;
238import com.fs.starfarer.api.impl.campaign.intel.bar.PortsideBarData;
239import com.fs.starfarer.api.impl.campaign.intel.bar.events.BarEventManager;
240import com.fs.starfarer.api.impl.campaign.intel.bar.events.CorruptPLClerkSuppliesBarEvent;
241import com.fs.starfarer.api.impl.campaign.intel.bar.events.CorruptPLClerkSuppliesBarEventCreator;
242import com.fs.starfarer.api.impl.campaign.intel.bar.events.DeliveryBarEvent;
243import com.fs.starfarer.api.impl.campaign.intel.bar.events.DeliveryBarEventCreator;
244import com.fs.starfarer.api.impl.campaign.intel.bar.events.DeliveryFailureConsequences;
245import com.fs.starfarer.api.impl.campaign.intel.bar.events.DeliveryMissionIntel;
246import com.fs.starfarer.api.impl.campaign.intel.bar.events.DiktatLobsterBarEvent;
247import com.fs.starfarer.api.impl.campaign.intel.bar.events.DiktatLobsterBarEventCreator;
248import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicCraftBarEvent;
249import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicCraftBarEventCreator;
250import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicFarmerBarEvent;
251import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicFarmerBarEventCreator;
252import com.fs.starfarer.api.impl.campaign.intel.bar.events.LuddicPathBaseBarEvent;
253import com.fs.starfarer.api.impl.campaign.intel.bar.events.MercsOnTheRunBarEvent;
254import com.fs.starfarer.api.impl.campaign.intel.bar.events.MercsOnTheRunBarEventCreator;
255//import com.fs.starfarer.api.impl.campaign.intel.bar.events.MercsOnTheRunBarEventCreator;
256import com.fs.starfarer.api.impl.campaign.intel.bar.events.PirateBaseRumorBarEvent;
257import com.fs.starfarer.api.impl.campaign.intel.bar.events.PlanetaryShieldBarEventCreator;
258import com.fs.starfarer.api.impl.campaign.intel.bar.events.QuartermasterCargoSwapBarEvent;
259import com.fs.starfarer.api.impl.campaign.intel.bar.events.QuartermasterCargoSwapBarEventCreator;
260import com.fs.starfarer.api.impl.campaign.intel.bar.events.ScientistAICoreBarEvent;
261import com.fs.starfarer.api.impl.campaign.intel.bar.events.ScientistAICoreBarEventCreator;
262import com.fs.starfarer.api.impl.campaign.intel.bar.events.ScientistAICoreIntel;
263import com.fs.starfarer.api.impl.campaign.intel.bar.events.SpecBarEventCreator;
264import com.fs.starfarer.api.impl.campaign.intel.bar.events.TriTachLoanBarEvent;
265import com.fs.starfarer.api.impl.campaign.intel.bar.events.TriTachLoanBarEventCreator;
266import com.fs.starfarer.api.impl.campaign.intel.bar.events.TriTachLoanIncentiveScript;
267import com.fs.starfarer.api.impl.campaign.intel.bar.events.TriTachMajorLoanBarEvent;
268import com.fs.starfarer.api.impl.campaign.intel.bar.events.TriTachMajorLoanBarEventCreator;
269import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.DonationOfferCreator;
270import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.FighterBlueprintOfferCreator;
271import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.HistorianBarEvent;
272import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.HistorianBarEventCreator;
273import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.HistorianData;
274import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.ShipBlueprintOfferCreator;
275import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.SpecialItemOfferCreator;
276import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.WeaponBlueprintOffer;
277import com.fs.starfarer.api.impl.campaign.intel.bar.events.historian.WeaponBlueprintOfferCreator;
278import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseIntel;
279import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseManager;
280import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathCells;
281import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathCellsIntel;
282import com.fs.starfarer.api.impl.campaign.intel.bases.PirateActivity;
283import com.fs.starfarer.api.impl.campaign.intel.bases.PirateActivityIntel;
284import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel;
285import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel.BaseBountyData;
286import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseManager;
287import com.fs.starfarer.api.impl.campaign.intel.bases.PlayerRelatedPirateBaseManager;
288import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
289import com.fs.starfarer.api.impl.campaign.intel.deciv.DecivIntel;
290import com.fs.starfarer.api.impl.campaign.intel.deciv.DecivTracker;
291import com.fs.starfarer.api.impl.campaign.intel.deciv.DecivTracker.MarketDecivData;
292import com.fs.starfarer.api.impl.campaign.intel.events.BaseEventIntel;
293import com.fs.starfarer.api.impl.campaign.intel.events.BaseEventIntel.EventStageData;
294import com.fs.starfarer.api.impl.campaign.intel.events.CommerceBountyManager;
295import com.fs.starfarer.api.impl.campaign.intel.events.DisposableHostileActivityFleetManager;
296import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel;
297import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityManager;
298import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTFactorTracker;
299import com.fs.starfarer.api.impl.campaign.intel.inspection.HegemonyInspectionManager;
300import com.fs.starfarer.api.impl.campaign.intel.misc.BreadcrumbIntel;
301import com.fs.starfarer.api.impl.campaign.intel.misc.BreadcrumbIntelV2;
302import com.fs.starfarer.api.impl.campaign.intel.misc.CargoPodsIntel;
303import com.fs.starfarer.api.impl.campaign.intel.misc.CommSnifferIntel;
304import com.fs.starfarer.api.impl.campaign.intel.misc.CryosleeperIntel;
305import com.fs.starfarer.api.impl.campaign.intel.misc.DistressCallIntel;
306import com.fs.starfarer.api.impl.campaign.intel.misc.GateIntel;
307import com.fs.starfarer.api.impl.campaign.intel.misc.HypershuntIntel;
308import com.fs.starfarer.api.impl.campaign.intel.misc.LuddicShrineIntel;
309import com.fs.starfarer.api.impl.campaign.intel.misc.ProductionReportIntel;
310import com.fs.starfarer.api.impl.campaign.intel.misc.RemnantNexusIntel;
311import com.fs.starfarer.api.impl.campaign.intel.misc.SalvorsTallyIntel;
312import com.fs.starfarer.api.impl.campaign.intel.misc.SimUpdateIntel;
313import com.fs.starfarer.api.impl.campaign.intel.misc.TradeFleetDepartureIntel;
314import com.fs.starfarer.api.impl.campaign.intel.misc.WarningBeaconIntel;
315import com.fs.starfarer.api.impl.campaign.intel.misc.WormholeIntel;
316import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager;
317import com.fs.starfarer.api.impl.campaign.intel.punitive.PunitiveExpeditionManager.PunExData;
318import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel;
319import com.fs.starfarer.api.impl.campaign.missions.DelayedFleetEncounter;
320import com.fs.starfarer.api.impl.campaign.missions.academy.GAAtTheGates;
321import com.fs.starfarer.api.impl.campaign.missions.academy.GATransverseJump;
322import com.fs.starfarer.api.impl.campaign.missions.cb.BaseCustomBounty;
323import com.fs.starfarer.api.impl.campaign.missions.cb.BaseCustomBounty.AggregateBountyData;
324import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission;
325import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.DefeatTriggerAdded;
326import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.ImportanceData;
327import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.StageConnection;
328import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.StageData;
329import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.VariableSet;
330import com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMissionCreator;
331import com.fs.starfarer.api.impl.campaign.missions.hub.BaseMissionHub;
332import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionBarEventWrapper;
333import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers;
334import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.MakeNonStoryCriticalAction;
335import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.SetFleetFlagAction;
336import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn;
337import com.fs.starfarer.api.impl.campaign.missions.hub.MissionTrigger;
338import com.fs.starfarer.api.impl.campaign.missions.hub.TriggerFleetAssignmentAI;
339import com.fs.starfarer.api.impl.campaign.plog.OfficerSkillGainRecord;
340import com.fs.starfarer.api.impl.campaign.plog.PLStatCargo;
341import com.fs.starfarer.api.impl.campaign.plog.PLStatColonies;
342import com.fs.starfarer.api.impl.campaign.plog.PLStatCredits;
343import com.fs.starfarer.api.impl.campaign.plog.PLStatCrew;
344import com.fs.starfarer.api.impl.campaign.plog.PLStatFleet;
345import com.fs.starfarer.api.impl.campaign.plog.PLStatFuel;
346import com.fs.starfarer.api.impl.campaign.plog.PLStatLevel;
347import com.fs.starfarer.api.impl.campaign.plog.PLStatMarines;
348import com.fs.starfarer.api.impl.campaign.plog.PLStatSupplies;
349import com.fs.starfarer.api.impl.campaign.plog.PLTextEntry;
350import com.fs.starfarer.api.impl.campaign.plog.PlaythroughLog;
351import com.fs.starfarer.api.impl.campaign.plog.SModRecord;
352import com.fs.starfarer.api.impl.campaign.procgen.DefenderDataOverride;
353import com.fs.starfarer.api.impl.campaign.procgen.ProcgenUsedNames;
354import com.fs.starfarer.api.impl.campaign.procgen.SectorProcGen;
355import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
356import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseAssignmentAI;
357import com.fs.starfarer.api.impl.campaign.procgen.themes.OmegaOfficerGeneratorPlugin;
358import com.fs.starfarer.api.impl.campaign.procgen.themes.PKDefenderPluginImpl;
359import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantAssignmentAI;
360import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantOfficerGeneratorPlugin;
361import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantSeededFleetManager;
362import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantSeededFleetManager.RemnantFleetInteractionConfigGen;
363import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantStationFleetManager;
364import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantThemeGenerator.RemnantStationInteractionConfigGen;
365import com.fs.starfarer.api.impl.campaign.procgen.themes.RouteFleetAssignmentAI;
366import com.fs.starfarer.api.impl.campaign.procgen.themes.RuinsFleetRouteManager;
367import com.fs.starfarer.api.impl.campaign.procgen.themes.ScavengerFleetAssignmentAI;
368import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageGenFromSeed.SalvageDefenderModificationPluginImpl;
369import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BaseSalvageSpecial.ExtraSalvage;
370import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BlueprintSpecial.BlueprintSpecialData;
371import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BreadcrumbSpecial.BreadcrumbSpecialData;
372import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.CargoManifestSpecial.CargoManifestSpecialData;
373import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.DomainSurveyDerelictSpecial;
374import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.DomainSurveyDerelictSpecial.DomainSurveyDerelictSpecialData;
375import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.DomainSurveyDerelictSpecial.SpecialType;
376import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.PerShipData;
377import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.ShipCondition;
378import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.ShipRecoverySpecialData;
379import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.SleeperPodsSpecial.SleeperPodsSpecialData;
380import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.SleeperPodsSpecial.SleeperSpecialType;
381import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.SurveyDataSpecial.SurveyDataSpecialData;
382import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.SurveyDataSpecial.SurveyDataSpecialType;
383import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.TopographicDataSpecial.TopographicDataSpecialData;
384import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.TransmitterTrapSpecial.TransmitterTrapSpecialData;
385import com.fs.starfarer.api.impl.campaign.shared.CommodityStatTracker.CommodityStats;
386import com.fs.starfarer.api.impl.campaign.shared.PlayerTradeDataForSubmarket;
387import com.fs.starfarer.api.impl.campaign.shared.PlayerTradeProfitabilityData;
388import com.fs.starfarer.api.impl.campaign.shared.PlayerTradeProfitabilityData.CommodityData;
389import com.fs.starfarer.api.impl.campaign.shared.ReputationChangeTracker.ReputationChangeData;
390import com.fs.starfarer.api.impl.campaign.shared.SharedData;
391import com.fs.starfarer.api.impl.campaign.skills.FieldRepairsScript;
392import com.fs.starfarer.api.impl.campaign.submarkets.BlackMarketPlugin;
393import com.fs.starfarer.api.impl.campaign.submarkets.LocalResourcesSubmarketPlugin;
394import com.fs.starfarer.api.impl.campaign.submarkets.OpenMarketPlugin;
395import com.fs.starfarer.api.impl.campaign.terrain.AsteroidBeltTerrainPlugin;
396import com.fs.starfarer.api.impl.campaign.terrain.AsteroidBeltTerrainPlugin.AsteroidBeltParams;
397import com.fs.starfarer.api.impl.campaign.terrain.AsteroidFieldTerrainPlugin;
398import com.fs.starfarer.api.impl.campaign.terrain.AsteroidFieldTerrainPlugin.AsteroidFieldParams;
399import com.fs.starfarer.api.impl.campaign.terrain.AsteroidImpact;
400import com.fs.starfarer.api.impl.campaign.terrain.AsteroidSource;
401import com.fs.starfarer.api.impl.campaign.terrain.AuroraRenderer;
402import com.fs.starfarer.api.impl.campaign.terrain.BaseRingTerrain;
403import com.fs.starfarer.api.impl.campaign.terrain.BaseRingTerrain.RingParams;
404import com.fs.starfarer.api.impl.campaign.terrain.BaseTerrain;
405import com.fs.starfarer.api.impl.campaign.terrain.CRLossPerSecondBuff;
406import com.fs.starfarer.api.impl.campaign.terrain.CRRecoveryBuff;
407import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
408import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
409import com.fs.starfarer.api.impl.campaign.terrain.EventHorizonPlugin;
410import com.fs.starfarer.api.impl.campaign.terrain.FlareManager;
411import com.fs.starfarer.api.impl.campaign.terrain.FlareManager.Flare;
412import com.fs.starfarer.api.impl.campaign.terrain.HyperStormBoost;
413import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
414import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin.CellStateTracker;
415import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin;
416import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin.MagneticFieldParams;
417import com.fs.starfarer.api.impl.campaign.terrain.MaxBurnBuff;
418import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
419import com.fs.starfarer.api.impl.campaign.terrain.PeakPerformanceBuff;
420import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
421import com.fs.starfarer.api.impl.campaign.terrain.RadioChatterTerrainPlugin;
422import com.fs.starfarer.api.impl.campaign.terrain.RadioChatterTerrainPlugin.RadioChatterParams;
423import com.fs.starfarer.api.impl.campaign.terrain.RingSystemTerrainPlugin;
424import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaAkaMainyuTerrainPlugin;
425import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
426import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin.CoronaParams;
427import com.fs.starfarer.api.impl.campaign.tutorial.CampaignTutorialScript;
428import com.fs.starfarer.api.impl.campaign.tutorial.CampaignTutorialScript.CampaignTutorialStage;
429import com.fs.starfarer.api.impl.campaign.tutorial.GalatiaMarketScript;
430import com.fs.starfarer.api.impl.campaign.tutorial.GalatianAcademyStipend;
431import com.fs.starfarer.api.impl.campaign.tutorial.RogueMinerMiscFleetManager;
432import com.fs.starfarer.api.impl.campaign.tutorial.SaveNagScript;
433import com.fs.starfarer.api.impl.campaign.tutorial.TutorialLeashAssignmentAI;
434import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionEvent.TutorialMissionStage;
435import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
436import com.fs.starfarer.api.impl.campaign.velfield.BoundingBox;
437import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager;
438import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.AddedStream;
439import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.StreamData;
440import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
441import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamParams2;
442import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
443import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamVisibilityManager;
444import com.fs.starfarer.api.impl.campaign.world.GateHaulerLocation;
445import com.fs.starfarer.api.impl.campaign.world.Limbo;
446import com.fs.starfarer.api.impl.campaign.world.NamelessRock;
447import com.fs.starfarer.api.impl.campaign.world.TTBlackSite;
448import com.fs.starfarer.api.impl.campaign.world.TTBlackSite.ZigFIDConfig;
449import com.fs.starfarer.api.impl.campaign.world.ZigLeashAssignmentAI;
450import com.fs.starfarer.api.impl.codex.CodexUnlocker;
451import com.fs.starfarer.api.impl.combat.dweller.ShroudedEjectaAI;
452import com.fs.starfarer.api.impl.combat.dweller.ShroudedVortexAI;
453import com.fs.starfarer.api.impl.combat.threat.DisposableThreatFleetManager;
454import com.fs.starfarer.api.impl.combat.threat.ThreatSwarmAI;
455import com.fs.starfarer.api.loading.CampaignPingSpec;
456import com.fs.starfarer.api.plugins.impl.CoreBuildObjectiveTypePicker;
457import com.fs.starfarer.api.util.DelayedActionScript;
458import com.fs.starfarer.api.util.FaderUtil;
459import com.fs.starfarer.api.util.FlickerUtil;
460import com.fs.starfarer.api.util.IntervalUtil;
461import com.fs.starfarer.api.util.Misc;
462import com.fs.starfarer.api.util.RollingAverageTracker;
463import com.fs.starfarer.api.util.TimeoutTracker;
464import com.fs.starfarer.api.util.TimeoutTracker.ItemData;
465import com.thoughtworks.xstream.XStream;
466
467public class CoreLifecyclePluginImpl extends BaseModPlugin {
468
469        @Override
470        public void onGameLoad(boolean newGame) {
471                econPostSaveRestore();
472
473//              MarketAPI market =  Global.getSector().getEconomy().getMarket("eochu_bres");
474//              if (market != null) {
475//                      PersonAPI person = Global.getFactory().createPerson();
476//                      person.setId(People.GLAMOR_ROTANEV);
477//                      person.setFaction(Factions.TRITACHYON);
478//                      person.setGender(Gender.FEMALE);
479//                      person.setRankId(Ranks.SENIOR_EXECUTIVE);
480//                      person.setPostId(Ranks.POST_INTELLIGENCE_DIRECTOR);
481//                      person.setImportance(PersonImportance.VERY_HIGH);
482//                      person.getName().setFirst("Zunya");
483//                      person.getName().setLast("Glamor-Rotanev");
484//                      person.setPortraitSprite(Global.getSettings().getSpriteName("characters",  person.getId()));
485//                      person.getStats().setSkillLevel(Skills.BULK_TRANSPORT, 1);
486//                      person.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);
487//                      person.getStats().setSkillLevel(Skills.OFFICER_MANAGEMENT, 1);
488//                      person.addTag(Tags.CONTACT_TRADE);
489//                      person.addTag(Tags.CONTACT_MILITARY);
490//                      person.setVoice(Voices.BUSINESS);
491//                      
492//                      market.getCommDirectory().addPerson(person, 1); // second after Sun
493//                      market.getCommDirectory().getEntryForPerson(person).setHidden(true); // you'll hear from her people.
494//                      market.addPerson(person);
495//                      Global.getSector().getImportantPeople().addPerson(person);
496//              }
497                
498                
499                StarSystemAPI limbo = Global.getSector().getStarSystem("Limbo");
500                if (limbo == null || !limbo.hasTag(Tags.SYSTEM_ABYSSAL)) {
501                        new Limbo().generate(Global.getSector());
502                        new GateHaulerLocation().generate(Global.getSector());
503                        SectorProcGen.clearAbyssalHyperspaceAndSetSystemTags();
504                }
505                
506                if (Global.getSector().getStarSystem("nameless_rock_location") == null) {
507                        new NamelessRock().generate(Global.getSector());
508                }
509                
510                // the token replacement generators don't get saved
511                // add them on every game load
512                Global.getSector().getRules().addTokenReplacementGenerator(new CoreRuleTokenReplacementGeneratorImpl());
513                
514                if (!newGame) {
515                        addJunk();
516                        regenAsteroids();
517                }
518                
519                addScriptsIfNeeded();
520                
521                verifyFactionData();
522                
523//              for (CampaignFleetAPI fleet : Global.getSector().getCurrentLocation().getFleets()) {
524//                      if (fleet.isPlayerFleet()) continue;
525//                      VisibilityLevel level = fleet.getVisibilityLevelToPlayerFleet();
526//                      if (level == VisibilityLevel.NONE) {
527//                              fleet.forceSensorFaderBrightness(0f);
528//                      }
529//              }
530                
531                convertTo0951aSkillSystemIfNeeded();
532
533                addMissingPeople();
534        }
535        
536        public static void addMissingPeople() {
537                if (People.getPerson(People.REYNARD_HANNAN) == null) {
538                        People.addReynardHannan();
539                }
540        }
541        
542        public static void verifyFactionData() {
543                for (FactionAPI faction : Global.getSector().getAllFactions()) {
544                        verifyFactionData(faction);
545                }
546        }
547        
548        public static void verifyFactionData(FactionAPI faction) {
549                for (String id : faction.getKnownShips()) {
550                        if (Global.getSettings().getHullSpec(id) == null) {
551                                throw new RuntimeException("Hull with id [" + id + "] not found for faction [" + faction.getId() + "]");
552                        }
553                }
554                for (String id : faction.getKnownHullMods()) {
555                        if (Global.getSettings().getHullModSpec(id) == null) {
556                                throw new RuntimeException("Hullmod with id [" + id + "] not found for faction [" + faction.getId() + "]");
557                        }
558                }
559                for (String id : faction.getKnownIndustries()) {
560                        if (Global.getSettings().getIndustrySpec(id) == null) {
561                                throw new RuntimeException("Industry with id [" + id + "] not found for faction [" + faction.getId() + "]");
562                        }
563                }
564                for (String id : faction.getKnownFighters()) {
565                        if (Global.getSettings().getFighterWingSpec(id) == null) {
566                                throw new RuntimeException("Fighter wing with id [" + id + "] not found for faction [" + faction.getId() + "]");
567                        }
568                }
569                for (String id : faction.getKnownWeapons()) {
570                        if (Global.getSettings().getWeaponSpec(id) == null) {
571                                throw new RuntimeException("Weapon with id [" + id + "] not found for faction [" + faction.getId() + "]");
572                        }
573                }
574                
575                for (String id : new ArrayList<String>(faction.getDoctrine().getCommanderSkills())) {
576                        if (Global.getSettings().getSkillSpec(id) == null) {
577                                // making still-useful saves work... 9/15/2020
578                                if (id.equals("fighter_doctrine")) {
579                                        faction.getDoctrine().getCommanderSkills().remove(id);
580                                } else {
581                                        throw new RuntimeException("Commander skill with id [" + id + "] not found for faction [" + faction.getId() + "]");
582                                }
583                        }
584                }
585                for (String id : new ArrayList<String>(faction.getDoctrine().getOfficerSkills())) {
586                        if (Global.getSettings().getSkillSpec(id) == null) {
587                                throw new RuntimeException("Officer skill with id [" + id + "] not found for faction [" + faction.getId() + "]");
588                        }
589                }
590        }
591        
592        protected void addScriptsIfNeeded() {
593                ShipQuality.getInstance();
594                //ConditionManager.getInstance();
595                
596                SectorAPI sector = Global.getSector();
597                
598                
599                ListenerManagerAPI listeners = sector.getListenerManager();
600                
601                if (Global.getSettings().isDevMode()) {
602                        listeners.addListener(new TestIndustryOptionProvider(), true);
603                }
604                
605                if (!listeners.hasListenerOfClass(StandardGroundRaidObjectivesCreator.class)) {
606                        listeners.addListener(new StandardGroundRaidObjectivesCreator(), true);
607                }
608//              if (!listeners.hasListenerOfClass(FleetLogIntelCreator.class)) {
609//                      listeners.addListener(new FleetLogIntelCreator(), true);
610//              }
611                
612                if (!listeners.hasListenerOfClass(CryosleeperFactor.class)) {
613                        listeners.addListener(new CryosleeperFactor(), true);
614                }
615                if (!listeners.hasListenerOfClass(CoronalTapFactor.class)) {
616                        listeners.addListener(new CoronalTapFactor(), true);
617                }
618                if (!listeners.hasListenerOfClass(SlipstreamVisibilityManager.class)) {
619                        listeners.addListener(new SlipstreamVisibilityManager(), true);
620                }
621                if (!listeners.hasListenerOfClass(CodexUnlocker.class)) {
622                        listeners.addListener(new CodexUnlocker(), true);
623                }
624                
625//              if (!sector.hasScript(SlipstreamVisibilityManager.class)) {
626//              sector.addScript(new SlipstreamVisibilityManager());
627//      }
628
629                
630                GenericPluginManagerAPI plugins = sector.getGenericPlugins();
631                if (!plugins.hasPlugin(PKDefenderPluginImpl.class)) {
632                        plugins.addPlugin(new PKDefenderPluginImpl(), true);
633                }
634                if (!plugins.hasPlugin(SalvageDefenderModificationPluginImpl.class)) {
635                        plugins.addPlugin(new SalvageDefenderModificationPluginImpl(), true);
636                }
637                
638                CoreDiscoverEntityPlugin discoverPlugin = null;
639                if (!plugins.hasPlugin(CoreDiscoverEntityPlugin.class)) {
640                        discoverPlugin = new CoreDiscoverEntityPlugin();
641                        plugins.addPlugin(discoverPlugin, true);
642                } else {
643                        discoverPlugin = (CoreDiscoverEntityPlugin) plugins.getPluginsOfClass(CoreDiscoverEntityPlugin.class).get(0);
644                }
645                if (!listeners.hasListenerOfClass(CoreDiscoverEntityPlugin.class)) {
646                        listeners.addListener(discoverPlugin, true);
647                }
648                
649                
650                if (!plugins.hasPlugin(CoreBuildObjectiveTypePicker.class)) {
651                        plugins.addPlugin(new CoreBuildObjectiveTypePicker(), true);
652                }
653                if (!plugins.hasPlugin(AbandonMarketPluginImpl.class)) {
654                        plugins.addPlugin(new AbandonMarketPluginImpl(), true);
655                }
656                if (!plugins.hasPlugin(StabilizeMarketPluginImpl.class)) {
657                        plugins.addPlugin(new StabilizeMarketPluginImpl(), true);
658                }
659                if (!plugins.hasPlugin(RemnantOfficerGeneratorPlugin.class)) {
660                        plugins.addPlugin(new RemnantOfficerGeneratorPlugin(), true);
661                }
662                if (!plugins.hasPlugin(OmegaOfficerGeneratorPlugin.class)) {
663                        plugins.addPlugin(new OmegaOfficerGeneratorPlugin(), true);
664                }
665//              if (!plugins.hasPlugin(PlayerFleetPersonnelTracker.class)) {
666//                      plugins.addPlugin(new PlayerFleetPersonnelTracker(), false);
667//              }
668                
669                PlayerFleetPersonnelTracker.getInstance();
670                HullModItemManager.getInstance();
671                
672                
673                if (!sector.hasScript(StrandedGiveTJScript.class)) {
674                        sector.addScript(new StrandedGiveTJScript());
675                }
676                if (!sector.hasScript(PersonalFleetHoracioCaden.class)) {
677                        sector.addScript(new PersonalFleetHoracioCaden());
678                }
679                if (!sector.hasScript(PersonalFleetOxanaHyder.class)) {
680                        sector.addScript(new PersonalFleetOxanaHyder());
681                }
682                if (!sector.hasScript(SDFHegemony.class)) {
683                        sector.addScript(new SDFHegemony());
684                }
685                if (!sector.hasScript(SDFLeague.class)) {
686                        sector.addScript(new SDFLeague());
687                }
688                if (!sector.hasScript(SDFTriTachyon.class)) {
689                        sector.addScript(new SDFTriTachyon());
690                }
691                if (!sector.hasScript(SDFLuddicChurch.class)) {
692                        sector.addScript(new SDFLuddicChurch());
693                }
694//              if (!sector.hasScript(PilgrimageFleetRouteManager.class)) {
695//                      sector.addScript(new PilgrimageFleetRouteManager());
696//              }
697                if (!sector.hasScript(MiscFleetRouteManager.class)) {
698                        sector.addScript(new MiscFleetRouteManager());
699                }
700                if (!sector.hasScript(EncounterManager.class)) {
701                        sector.addScript(new EncounterManager());
702                }
703                if (!sector.hasScript(SlipstreamManager.class)) {
704                        sector.addScript(new SlipstreamManager());
705                }
706                if (!sector.hasScript(SensorGhostManager.class)) {
707                        sector.addScript(new SensorGhostManager());
708                }
709                if (!sector.hasScript(OfficerManagerEvent.class)) {
710                        sector.addScript(new OfficerManagerEvent());
711                }
712                if (!sector.hasScript(FieldRepairsScript.class)) {
713                        sector.addScript(new FieldRepairsScript());
714                }
715                if (!sector.hasScript(WarSimScript.class)) {
716                        sector.addScript(new WarSimScript());
717                }
718                if (!sector.hasScript(PersonBountyManager.class)) {
719                        sector.addScript(new PersonBountyManager());
720                }
721                if (!sector.hasScript(SystemBountyManager.class)) {
722                        sector.addScript(new SystemBountyManager());
723                }
724                
725                if (!sector.hasScript(PirateBaseManager.class)) {
726                        sector.addScript(new PirateBaseManager());
727                }
728                if (!sector.hasScript(PlayerRelatedPirateBaseManager.class)) {
729                        sector.addScript(new PlayerRelatedPirateBaseManager());
730                }
731                
732                if (!sector.hasScript(LuddicPathBaseManager.class)) {
733                        sector.addScript(new LuddicPathBaseManager());
734                }
735//              if (!sector.hasScript(HegemonyInspectionManager.class)) {
736//                      sector.addScript(new HegemonyInspectionManager());
737//              }
738                if (!sector.hasScript(PunitiveExpeditionManager.class)) {
739                        sector.addScript(new PunitiveExpeditionManager());
740                }
741                if (!sector.hasScript(DecivTracker.class)) {
742                        sector.addScript(new DecivTracker());
743                }
744                
745                if (!sector.hasScript(DisposableHostileActivityFleetManager.class)) {
746                        sector.addScript(new DisposableHostileActivityFleetManager());
747                }
748                if (!sector.hasScript(DisposableThreatFleetManager.class)) {
749                        sector.addScript(new DisposableThreatFleetManager());
750                }
751                if (!sector.hasScript(HostileActivityManager.class)) {
752                        sector.addScript(new HostileActivityManager());
753                }
754                if (!sector.hasScript(HTFactorTracker.class)) {
755                        sector.addScript(new HTFactorTracker());
756                }
757                if (!sector.hasScript(CommerceBountyManager.class)) {
758                        sector.addScript(new CommerceBountyManager());
759                }
760                
761                if (!sector.hasScript(FactionHostilityManager.class)) {
762                        sector.addScript(new FactionHostilityManager());
763                        
764                        FactionHostilityManager.getInstance().startHostilities(Factions.HEGEMONY, Factions.TRITACHYON);
765                        FactionHostilityManager.getInstance().startHostilities(Factions.HEGEMONY, Factions.PERSEAN);
766                        FactionHostilityManager.getInstance().startHostilities(Factions.TRITACHYON, Factions.LUDDIC_CHURCH);
767                }
768                
769                
770                if (!sector.hasScript(GenericMissionManager.class)) {
771                        sector.addScript(new GenericMissionManager());
772                }
773                GenericMissionManager manager = GenericMissionManager.getInstance();
774//              Replaced with bar/contact com.fs.starfarer.api.impl.campaign.missions.ProcurementMission                
775//              if (!manager.hasMissionCreator(ProcurementMissionCreator.class)) {
776//                      manager.addMissionCreator(new ProcurementMissionCreator());
777//              }
778                if (!manager.hasMissionCreator(AnalyzeEntityIntelCreator.class)) {
779                        manager.addMissionCreator(new AnalyzeEntityIntelCreator());
780                }
781                if (!manager.hasMissionCreator(SurveyPlanetIntelCreator.class)) {
782                        manager.addMissionCreator(new SurveyPlanetIntelCreator());
783                }
784                
785                addBarEvents();
786                
787                if (!sector.hasScript(SmugglingScanScript.class)) {
788                        sector.addScript(new SmugglingScanScript());
789                }
790                if (!sector.hasScript(HasslePlayerScript.class)) {
791                        sector.addScript(new HasslePlayerScript());
792                }
793                
794                PlaythroughLog.getInstance();
795                
796                sector.getListenerManager().addListener(new SkillsChangeRemoveExcessOPEffect(), true);
797                sector.getListenerManager().addListener(new SkillsChangeRemoveVentsCapsEffect(), true);
798                sector.getListenerManager().addListener(new SkillsChangeRemoveSmodsEffect(), true);
799                sector.getListenerManager().addListener(new SkillsChangeOfficerEffect(), true);
800
801        }
802        
803        protected void addBarEvents() {
804                SectorAPI sector = Global.getSector();
805                if (!sector.hasScript(PortsideBarData.class)) {
806                        sector.addScript(new PortsideBarData());
807                }
808                if (!sector.hasScript(BarEventManager.class)) {
809                        sector.addScript(new BarEventManager());
810                }
811                
812                BarEventManager bar = BarEventManager.getInstance();
813                if (!bar.hasEventCreator(LuddicFarmerBarEventCreator.class)) {
814                        bar.addEventCreator(new LuddicFarmerBarEventCreator());
815                }
816                if (!bar.hasEventCreator(LuddicCraftBarEventCreator.class)) {
817                        bar.addEventCreator(new LuddicCraftBarEventCreator());
818                }
819                if (!bar.hasEventCreator(DiktatLobsterBarEventCreator.class)) {
820                        bar.addEventCreator(new DiktatLobsterBarEventCreator());
821                }
822                //if (!bar.hasEventCreator(MercsOnTheRunBarEventCreator.class)) {
823                //      bar.addEventCreator(new MercsOnTheRunBarEventCreator());
824                //}
825                if (!bar.hasEventCreator(CorruptPLClerkSuppliesBarEventCreator.class)) {
826                        bar.addEventCreator(new CorruptPLClerkSuppliesBarEventCreator());
827                }
828                if (!bar.hasEventCreator(QuartermasterCargoSwapBarEventCreator.class)) {
829                        bar.addEventCreator(new QuartermasterCargoSwapBarEventCreator());
830                }
831                if (!bar.hasEventCreator(TriTachLoanBarEventCreator.class)) {
832                        bar.addEventCreator(new TriTachLoanBarEventCreator());
833                }
834                if (!bar.hasEventCreator(TriTachMajorLoanBarEventCreator.class)) {
835                        bar.addEventCreator(new TriTachMajorLoanBarEventCreator());
836                }
837                if (!bar.hasEventCreator(ScientistAICoreBarEventCreator.class)) {
838                        bar.addEventCreator(new ScientistAICoreBarEventCreator());
839                }
840                if (!bar.hasEventCreator(DeliveryBarEventCreator.class)) {
841                        bar.addEventCreator(new DeliveryBarEventCreator());
842                }
843                if (!bar.hasEventCreator(PlanetaryShieldBarEventCreator.class)) {
844                        bar.addEventCreator(new PlanetaryShieldBarEventCreator());
845                }
846                if (!bar.hasEventCreator(HistorianBarEventCreator.class)) {
847                        bar.addEventCreator(new HistorianBarEventCreator());
848                }
849                
850        }
851
852        @Override
853        public void onNewGame() {
854                junkList.clear();
855                
856                new TTBlackSite().generate(Global.getSector());
857                new Limbo().generate(Global.getSector());
858                new GateHaulerLocation().generate(Global.getSector());
859                // sensor array is added in a procgen system, so have to do it after procgen
860                //new NamelessRock().generate(Global.getSector());
861        }
862        
863        
864        @Override
865        public void onNewGameAfterTimePass() {
866                
867                // sensor array is added in a procgen system, so have to do it here 
868                new NamelessRock().generate(Global.getSector());
869                
870                new CustomFleets().spawn();
871                
872                EveryFrameScript script = new AnalyzeEntityIntelCreator().createMissionIntel();
873                if (script instanceof BaseIntelPlugin) {
874                        ((BaseIntelPlugin)script).setPostingLocation(null);
875                        GenericMissionManager.getInstance().addActive(script);
876                }
877                
878                script = new SurveyPlanetIntelCreator().createMissionIntel();
879                if (script instanceof BaseIntelPlugin) {
880                        ((BaseIntelPlugin)script).setPostingLocation(null);
881                        GenericMissionManager.getInstance().addActive(script);
882                }
883                
884                        
885                
886                for (EveryFrameScript s : PersonBountyManager.getInstance().getActive()) {
887                        PersonBountyIntel intel = (PersonBountyIntel) s;
888                        intel.setElapsedDays(intel.getElapsedDays() * (float) Math.random() * 0.25f);
889                }
890                
891                // only leave bounties at ancyra, jangala, and one other market at game start
892                boolean first = true;
893                for (EveryFrameScript s : SystemBountyManager.getInstance().getActive()) {
894                        SystemBountyIntel intel = (SystemBountyIntel) s;
895                        if (intel.getMarket().getId().equals("ancyra_market") ||
896                                        intel.getMarket().getId().equals("jangala")) {
897                                intel.setElapsedDays(intel.getElapsedDays() * (float) Math.random() * 0.25f);
898                                continue;
899                        }
900                        
901                        if (first) {
902                                first = false;
903                                intel.setElapsedDays(intel.getElapsedDays() * (float) Math.random() * 0.25f);
904                                continue;
905                        }
906                        
907                        intel.endImmediately();
908                }
909                
910                
911                MarketAPI jangala = Global.getSector().getEconomy().getMarket("jangala");
912                if (jangala != null) {
913                        SystemBountyManager.getInstance().addOrResetBounty(jangala);
914                }
915                
916                
917//              CampaignEventManagerAPI eventManager = Global.getSector().getEventManager();
918                
919
920                
921//              SectorEntityToken jangalaPlanet = Global.getSector().getEntityById("jangala");
922//              Global.getSector().getMissionBoard().makeAvailableAt(new TestCampaignMission(jangalaPlanet), "jangala");
923//              FactionAPI hegemony = Global.getSector().getFaction(Factions.HEGEMONY);
924//              jangalaPlanet.initCommDirectory();
925//              jangalaPlanet.getCommDirectory().addPerson(hegemony.createRandomPerson());
926//              jangalaPlanet.getCommDirectory().addPerson(hegemony.createRandomPerson());
927//              jangalaPlanet.getCommDirectory().addPerson(hegemony.createRandomPerson());
928//              jangalaPlanet.getCommDirectory().addPerson(hegemony.createRandomPerson());
929
930//              WeightedRandomPicker<MarketAPI> picker = new WeightedRandomPicker<MarketAPI>();
931//              for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
932//                      //if (market.getFactionId().equals(Factions.PIRATES)) {
933//                      if (market.getFaction().getCustom().optBoolean(Factions.CUSTOM_EXEMPT_FOOD_SHORTAGES)) {
934//                              continue;
935//                      }
936//                      EventProbabilityAPI ep = eventManager.getProbability(Events.FOOD_SHORTAGE, market);
937//                      if (eventManager.isOngoing(ep)) continue;
938//                      if (ep.getProbability() < 0.05f) continue;
939//                      
940//                      picker.add(market, ep.getProbability());
941//              }
942//              
943//              MarketAPI pick = picker.pick();
944//              if (pick != null) {
945//                      eventManager.startEvent(new CampaignEventTarget(pick), Events.FOOD_SHORTAGE, null);
946//              }
947
948//              if (Global.getSettings().getBoolean("runDefaultEasyStartScript") && Misc.isEasy()) {
949//                      easyStart();
950//              }
951                
952//              SectorAPI sector = Global.getSector();  
953//              if (Global.getSector().isInNewGameAdvance()) return;  
954//
955//              // teleport player to start on top of the planet  
956//              SectorEntityToken entity = sector.getEntityById("culann");  
957//              CampaignFleetAPI playerFleet = sector.getPlayerFleet();  
958//              Vector2f loc = entity.getLocation();  
959//              playerFleet.setLocation(loc.x, loc.y);  
960        }
961        
962//      protected void easyStart() {
963//              PersonAPI officer = OfficerManagerEvent.createOfficer(Global.getSector().getPlayerFaction(), 1, true);
964//              officer.setPersonality(Personalities.CAUTIOUS);
965//              CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
966//              playerFleet.getFleetData().addOfficer(officer);
967//              for (FleetMemberAPI member : playerFleet.getFleetData().getMembersListCopy()) {
968//                      if (!member.isFlagship() && member.getCaptain().isDefault()) {
969//                              member.setCaptain(officer);
970//                              break;
971//                      }
972//              }
973//      }
974
975        @Override
976        public void onNewGameAfterEconomyLoad() {
977                //SharedData.getData().getMarketsWithoutPatrolSpawn().add("jangala");
978//              for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
979//                      SharedData.getData().getMarketsWithoutPatrolSpawn().add(market.getId());
980//              }
981
982                addJunk();
983                
984                // Do not need to regen asteroids - they've already been generated during sector generation
985                // Only need to regenerate on game load, since they're (mostly) not persisted.
986                //regenAsteroids();
987                
988                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
989                        //market.getCommDirectory().addMissionBoard();
990                        
991                        if (market.getContainingLocation() != null && market.getPrimaryEntity() != null) {
992                                float radius = 300f + market.getSize() * 200f;
993                                market.getContainingLocation().addRadioChatter(market.getPrimaryEntity(), radius);
994                        }
995                }
996                
997                MarketAPI umbra = Global.getSector().getEconomy().getMarket("umbra");
998                if (umbra != null && umbra.hasIndustry(Industries.SPACEPORT)) {
999                        umbra.getIndustry(Industries.SPACEPORT).setImproved(true);
1000                }
1001                
1002                
1003                createInitialPeople();
1004                
1005                addScriptsIfNeeded();
1006                
1007                updateKnownPlanets();
1008                
1009                markStoryCriticalMarketsEtc();
1010                
1011                tagLuddicShrines();
1012                
1013//              Global.getSector().getStarSystem("hybrasil").getLocation().set(-10000, -10000);
1014//              Global.getSector().getHyperspace().updateAllOrbits();
1015                
1016                //addBaseBlueprints();
1017        }
1018        
1019        public void markStoryCriticalMarketsEtc() {
1020                String id = Missions.KALLICHORE;
1021                Misc.makeStoryCritical("eochu_bres", id);
1022                Misc.makeStoryCritical("port_tse", id);
1023                Misc.makeStoryCritical("new_maxios", id);
1024                Misc.makeStoryCritical("coatl", id);
1025                
1026                id = Missions.COUREUSE;
1027                Misc.makeStoryCritical("laicaille_habitat", id);
1028                Misc.makeStoryCritical("eochu_bres", id);
1029                Misc.makeStoryCritical("fikenhild", id);
1030                Misc.makeStoryCritical("station_kapteyn", id);
1031                
1032                id = Missions.ZIGGURAT;
1033                Misc.makeStoryCritical("culann", id);
1034                Misc.makeStoryCritical("donn", id);
1035                Misc.makeStoryCritical("agreus", id);
1036                Misc.makeStoryCritical("eochu_bres", id);
1037                Misc.makeStoryCritical("port_tse", id);
1038                
1039                id = Missions.GATES;
1040                Misc.makeStoryCritical("kazeron", id);
1041                Misc.makeStoryCritical("chicomoztoc", id);
1042                Misc.makeStoryCritical("epiphany", id);
1043                Misc.makeStoryCritical("fikenhild", id);
1044                Misc.makeStoryCritical("kantas_den", id);
1045                
1046                id = Missions.THE_USURPERS;
1047                Misc.makeStoryCritical("sindria", id);
1048                Misc.makeStoryCritical("volturn", id);
1049                Misc.makeStoryCritical("umbra", id);
1050                
1051                id = Missions.PILGRIMS_PATH;
1052                Misc.makeStoryCritical("jangala", id);
1053                Misc.makeStoryCritical("hesperus", id);
1054                Misc.makeStoryCritical("gilead", id);
1055                Misc.makeStoryCritical("volturn", id);
1056                
1057                id = Missions.KNIGHT_ERRANT;
1058                Misc.makeStoryCritical("gilead", id);
1059                Misc.makeStoryCritical("chalcedon", id);
1060                Misc.makeStoryCritical("mazalot", id);
1061                
1062                id = Missions.FALSE_IDOLS;
1063                Misc.makeStoryCritical("asher", id);
1064                Misc.makeStoryCritical("chalcedon", id);
1065                Misc.makeStoryCritical("olinadu", id);
1066                Misc.makeStoryCritical("kazeron", id);
1067                Misc.makeStoryCritical("gilead", id);
1068                Misc.makeStoryCritical("hesperus", id);
1069                Misc.makeStoryCritical("tartessus", id);
1070                
1071                id = Missions.ABYSSAL_SPACE_ODDITY;
1072                //Misc.makeStoryCritical("galatia_academy", id); // n/a
1073                
1074                id = Missions.KANTA_LIBRE; // Like, not a real mission. Yet? Set so Kanta's Den doesn't deciv and break Stuff. -dgb
1075                Misc.makeStoryCritical("kantas_den", id);
1076        }
1077        
1078        public void tagLuddicShrines() {
1079                // for LPP missions (and general interest, I'm sure.)
1080                Global.getSector().getEconomy().getMarket("volturn").addTag(Tags.LUDDIC_SHRINE);
1081                Global.getSector().getEconomy().getMarket("hesperus").addTag(Tags.LUDDIC_SHRINE);
1082                Global.getSector().getEconomy().getMarket("gilead").addTag(Tags.LUDDIC_SHRINE);
1083                Global.getSector().getEconomy().getMarket("jangala").addTag(Tags.LUDDIC_SHRINE);
1084                
1085                SectorEntityToken beholderStation = Global.getSector().getEntityById("beholder_station");
1086                if (beholderStation != null) {
1087                        beholderStation.addTag(Tags.LUDDIC_SHRINE);
1088                }
1089                
1090                SectorEntityToken killa = Global.getSector().getEntityById("killa");
1091                if (killa != null) {
1092                        killa.addTag(Tags.LUDDIC_SHRINE);
1093                }
1094                                 
1095        }
1096        
1097//      protected void addBaseBlueprints() {
1098//              
1099//              Set<String> tags = new HashSet<String>();
1100//              tags.add(Items.TAG_BASE_BP);
1101//              
1102//              List<String> ships = MultiBlueprintItemPlugin.getShipIds(tags);
1103//              List<String> weapons = MultiBlueprintItemPlugin.getWeaponIds(tags);
1104//              List<String> fighters = MultiBlueprintItemPlugin.getWingIds(tags);
1105//              
1106//              FactionAPI pf = Global.getSector().getPlayerFaction();
1107//              for (String id : ships) {
1108//                      pf.addKnownShip(id);
1109//              }
1110//              for (String id : weapons) {
1111//                      pf.addKnownWeapon(id);
1112//              }
1113//              for (String id : fighters) {
1114//                      pf.addKnownFighter(id);
1115//              }
1116//      }
1117
1118        protected void updateKnownPlanets() {
1119                //Set<String> seen = new HashSet<String>();
1120                //Set<SectorEntityToken> gates = new LinkedHashSet<SectorEntityToken>();
1121                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1122                        if (market.isPlanetConditionMarketOnly()) continue; // shouldn't be in the markets list in this case, but, well.
1123                        if (market.getContainingLocation() instanceof StarSystemAPI) {
1124                                StarSystemAPI system = (StarSystemAPI) market.getContainingLocation();
1125                                system.setEnteredByPlayer(true);
1126                                //String name = system.getName();
1127                                //Misc.setAllPlanetsKnown(system);
1128                                Misc.setAllPlanetsSurveyed(system, true);
1129                                market.setSurveyLevel(SurveyLevel.FULL); // could also be a station, not a planet
1130                        }
1131                        
1132//                      for (SectorEntityToken gate : market.getContainingLocation().getEntitiesWithTag(Tags.GATE)) {
1133//                              gates.add(gate);
1134//                      }
1135                        
1136                }
1137                
1138                //for (SectorEntityToken gate : gates) {
1139//              for (SectorEntityToken gate : Global.getSector().getEntitiesWithTag(Tags.GATE)) {
1140//                      if (gate.getCustomPlugin() instanceof GateEntityPlugin) {
1141//                              Global.getSector().getIntelManager().addIntel(new GateIntel(gate), true);
1142//                      }
1143//              }
1144                
1145                
1146//              for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1147//                      if (market.getContainingLocation() instanceof StarSystemAPI) {
1148//                              StarSystemAPI system = (StarSystemAPI) market.getContainingLocation();
1149//                              CoreScript.markSystemAsEntered(system, false);
1150//                      }
1151//              }
1152                
1153                
1154                for (StarSystemAPI system : Global.getSector().getStarSystems()) {
1155//                      if (system.getName().toLowerCase().contains("galatia")) {
1156//                              System.out.println("wfwefwe234234");
1157//                      }
1158                        boolean galatia = system.getBaseName().toLowerCase().equals("galatia");
1159                        if (system.getTags().isEmpty() || galatia) {
1160                                if (Misc.getMarketsInLocation(system).isEmpty() && !galatia) {
1161                                        system.addTag(Tags.THEME_CORE_UNPOPULATED);
1162                                } else {
1163                                        system.addTag(Tags.THEME_CORE_POPULATED);
1164                                }
1165                                system.addTag(Tags.THEME_CORE);
1166                        }
1167                }
1168        }
1169        
1170        
1171        public static void addJunk(MarketAPI market) {
1172                SectorEntityToken entity = market.getPrimaryEntity();
1173                if (entity == null) return;
1174                LocationAPI location = entity.getContainingLocation();
1175                if (location == null) return;
1176                
1177                int numJunk = 5 + market.getSize() * 5;
1178                if (market.getSize() < 5) {
1179                        numJunk = (int) Math.max(1, numJunk * 0.5f);
1180                }
1181                float radius = entity.getRadius() + 100f;
1182                float minOrbitDays = radius / 20;
1183                float maxOrbitDays = minOrbitDays + 10f;
1184                
1185                location.addOrbitalJunk(entity,
1186                                 "orbital_junk", // from custom_entities.json 
1187                                 numJunk, // num of junk
1188                                 12, 20, // min/max sprite size (assumes square)
1189                                 radius, // orbit radius
1190                                 //70, // orbit width
1191                                 110, // orbit width
1192                                 minOrbitDays, // min orbit days
1193                                 maxOrbitDays, // max orbit days
1194                                 60f, // min spin (degress/day)
1195                                 360f); // max spin (degrees/day)
1196        }
1197        
1198        public static void addRuinsJunk(SectorEntityToken planet) {
1199                boolean r1 = planet.getMarket().hasCondition(Conditions.RUINS_SCATTERED);
1200                boolean r2 = planet.getMarket().hasCondition(Conditions.RUINS_WIDESPREAD);
1201                boolean r3 = planet.getMarket().hasCondition(Conditions.RUINS_EXTENSIVE);
1202                boolean r4 = planet.getMarket().hasCondition(Conditions.RUINS_VAST);
1203                
1204                if (!(r1 || r2 || r3 || r4)) return;
1205                
1206                int numJunk = 5;
1207                if (r2) numJunk += 5;
1208                if (r3) numJunk += 15;
1209                if (r4) numJunk += 40;
1210                
1211                //System.out.println("With ruins: " + planet.getName() + ", " + location.getNameWithLowercaseType());
1212                
1213                float radius = planet.getRadius() + 100f;
1214                float minOrbitDays = radius / 20;
1215                float maxOrbitDays = minOrbitDays + 10f;
1216                
1217                planet.getContainingLocation().addOrbitalJunk(planet,
1218                                 "orbital_junk", // from custom_entities.json 
1219                                 numJunk, // num of junk
1220                                 12, 20, // min/max sprite size (assumes square)
1221                                 radius, // orbit radius
1222                                 //70, // orbit width
1223                                 110, // orbit width
1224                                 minOrbitDays, // min orbit days
1225                                 maxOrbitDays, // max orbit days
1226                                 60f, // min spin (degress/day)
1227                                 360f); // max spin (degrees/day)
1228        }
1229        
1230        protected void addJunk() {
1231                junkList.clear();
1232                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1233                        addJunk(market);
1234                }
1235                
1236                for (SectorEntityToken planet : Global.getSector().getEntitiesWithTag(Tags.PLANET)) {
1237                        LocationAPI location = planet.getContainingLocation();
1238                        if (location == null) continue;
1239                        
1240                        if (planet.getMarket() == null || !planet.getMarket().isPlanetConditionMarketOnly()) continue;
1241                        
1242                        addRuinsJunk(planet);
1243                }
1244        }
1245        
1246        protected void regenAsteroids() {
1247                for (LocationAPI loc : Global.getSector().getAllLocations()) {
1248                        for (CampaignTerrainAPI terrain : loc.getTerrainCopy()) {
1249                                if (terrain.getPlugin() instanceof AsteroidSource) {
1250                                        AsteroidSource source = (AsteroidSource) terrain.getPlugin();
1251                                        source.regenerateAsteroids();
1252                                }
1253                        }
1254                }
1255        }
1256        
1257        
1258        protected Map<SectorEntityToken, LocationAPI> asteroidList = new HashMap<SectorEntityToken, LocationAPI>();
1259        protected Map<SectorEntityToken, LocationAPI> junkList = new HashMap<SectorEntityToken, LocationAPI>();
1260        @Override
1261        public void beforeGameSave() {
1262                junkList.clear();
1263//              Set<LocationAPI> seen = new HashSet<LocationAPI>();
1264//              for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1265//                      LocationAPI loc = market.getContainingLocation();
1266//                      if (loc == null || seen.contains(loc)) continue;
1267//                      seen.add(loc);
1268                for (LocationAPI loc : Global.getSector().getAllLocations()) {
1269                        for (SectorEntityToken junk : loc.getEntitiesWithTag(Tags.ORBITAL_JUNK)) {
1270                                loc.removeEntity(junk);
1271                                junkList.put(junk, loc);
1272                        }
1273                }
1274                
1275                //int count = 0;
1276                asteroidList.clear();
1277                for (LocationAPI loc : Global.getSector().getAllLocations()) {
1278                        for (SectorEntityToken asteroid : new ArrayList<SectorEntityToken>(loc.getAsteroids())) {
1279                                //count++;
1280                                AsteroidSource source = Misc.getAsteroidSource(asteroid);
1281                                if (source == null || !asteroid.getMemoryWithoutUpdate().isEmpty()) {
1282                                        if (source != null) {
1283                                                source.reportAsteroidPersisted(asteroid);
1284                                                Misc.clearAsteroidSource(asteroid);
1285                                        }
1286                                        continue;
1287                                } else {
1288                                        asteroidList.put(asteroid, loc);
1289                                        loc.removeEntity(asteroid);
1290                                }
1291                        }
1292                }
1293                //System.out.println("COUNT: " + count);
1294                //Global.getSector().getEntityById(new ArrayList<SectorEntityToken>(asteroidList.keySet()).get(4000).getId())
1295                econPreSaveCleanup();
1296        }
1297        
1298        
1299        protected void econPreSaveCleanup() {
1300                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1301                        for (Industry ind : market.getIndustries()) {
1302                                ind.doPreSaveCleanup();
1303                        }
1304                }
1305        }
1306        public static void econPostSaveRestore() {
1307                
1308                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1309                        for (Industry ind : market.getIndustries()) {
1310                                ind.doPostSaveRestore();
1311                        }
1312                }
1313                
1314                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1315                        market.reapplyConditions();
1316                        market.reapplyIndustries();
1317                }
1318        }
1319        
1320        @Override
1321        public void afterGameSave() {
1322                restoreRemovedEntities();
1323                econPostSaveRestore();
1324        }
1325        
1326        @Override
1327        public void onGameSaveFailed() {
1328                restoreRemovedEntities();
1329                econPostSaveRestore();
1330        }
1331        
1332        
1333        
1334        protected void restoreRemovedEntities() {
1335                for (SectorEntityToken junk : junkList.keySet()) {
1336                        ((LocationAPI)junkList.get(junk)).addEntity(junk);
1337                }
1338                junkList.clear();
1339                for (SectorEntityToken asteroid : asteroidList.keySet()) {
1340                        ((LocationAPI)asteroidList.get(asteroid)).addEntity(asteroid);
1341                }
1342                asteroidList.clear();
1343        }
1344        
1345        
1346
1347        private void initSlipstream() {
1348//              for (StarSystemAPI system : Global.getSector().getStarSystems()) {
1349//                      SectorEntityToken slipstream = system.addTerrain(Terrain.SLIPSTREAM, null);
1350//                      slipstream.getLocation().set(0, 0);
1351//                      system.getPersistentData().put(SlipstreamTerrainPlugin.LOCATION_SLIPSTREAM_KEY, slipstream);
1352//              }
1353//              SectorEntityToken slipstream = Global.getSector().getHyperspace().addTerrain(Terrain.SLIPSTREAM, null);
1354//              slipstream.getLocation().set(0, 0);
1355//              Global.getSector().getHyperspace().getPersistentData().put(SlipstreamTerrainPlugin.LOCATION_SLIPSTREAM_KEY, slipstream);
1356        }
1357        
1358        public static void createInitialPeople(MarketAPI market, Random random) {
1359                ImportantPeopleAPI ip = Global.getSector().getImportantPeople();
1360                
1361                boolean addedPerson = false;
1362                
1363                PersonAPI admin = null;
1364                
1365                LinkedHashSet<PersonAPI> randomPeople = new LinkedHashSet<PersonAPI>();
1366                
1367                
1368                if (market.hasIndustry(Industries.MILITARYBASE) || market.hasIndustry(Industries.HIGHCOMMAND)) {
1369                        PersonAPI person = market.getFaction().createRandomPerson(StarSystemGenerator.random);
1370                        String rankId = Ranks.GROUND_MAJOR;
1371                        if (market.getSize() >= 6) {
1372                                rankId = Ranks.GROUND_GENERAL;
1373                        } else if (market.getSize() >= 4) {
1374                                rankId = Ranks.GROUND_COLONEL;
1375                        }
1376                        person.setRankId(rankId);
1377                        person.setPostId(Ranks.POST_BASE_COMMANDER);
1378                        if (market.getSize() >= 8) {
1379                                person.setImportanceAndVoice(PersonImportance.VERY_HIGH, StarSystemGenerator.random);
1380                        } else if (market.getSize() >= 6) {
1381                                person.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);
1382                        } else {
1383                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1384                        }
1385                        person.addTag(Tags.CONTACT_MILITARY);
1386                        
1387                        market.getCommDirectory().addPerson(person);
1388                        market.addPerson(person);
1389                        ip.addPerson(person);
1390                        ip.getData(person).getLocation().setMarket(market);
1391                        ip.checkOutPerson(person, "permanent_staff");
1392                        addedPerson = true;
1393                        randomPeople.add(person);
1394                }
1395                
1396                boolean hasStation = false;
1397                for (Industry curr : market.getIndustries()) {
1398                        if (curr.getSpec().hasTag(Industries.TAG_STATION)) {
1399                                hasStation = true;
1400                                break;
1401                        }
1402                }
1403                if (hasStation) {
1404                        PersonAPI person = market.getFaction().createRandomPerson(StarSystemGenerator.random);
1405                        String rankId = Ranks.SPACE_COMMANDER;
1406                        if (market.getSize() >= 6) {
1407                                rankId = Ranks.SPACE_ADMIRAL;
1408                        } else if (market.getSize() >= 4) {
1409                                rankId = Ranks.SPACE_CAPTAIN;
1410                        }
1411                        person.setRankId(rankId);
1412                        person.setPostId(Ranks.POST_STATION_COMMANDER);
1413                        
1414                        if (market.getSize() >= 8) {
1415                                person.setImportanceAndVoice(PersonImportance.VERY_HIGH, StarSystemGenerator.random);
1416                        } else if (market.getSize() >= 6) {
1417                                person.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);
1418                        } else {
1419                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1420                        }
1421                        
1422                        person.addTag(Tags.CONTACT_MILITARY);
1423                        
1424                        market.getCommDirectory().addPerson(person);
1425                        market.addPerson(person);
1426                        ip.addPerson(person);
1427                        ip.getData(person).getLocation().setMarket(market);
1428                        ip.checkOutPerson(person, "permanent_staff");
1429                        addedPerson = true;
1430                        randomPeople.add(person);
1431                        
1432                        if (market.getPrimaryEntity().hasTag(Tags.STATION)) {
1433                                admin = person;
1434                        }
1435                }
1436                
1437                if (market.hasSpaceport()) {
1438                        PersonAPI person = market.getFaction().createRandomPerson(StarSystemGenerator.random);
1439                        //person.setRankId(Ranks.SPACE_CAPTAIN);
1440                        person.setPostId(Ranks.POST_PORTMASTER);
1441                        
1442                        if (market.getSize() >= 8) {
1443                                person.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);
1444                        } else if (market.getSize() >= 6) {
1445                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1446                        } else if (market.getSize() >= 4) {
1447                                person.setImportanceAndVoice(PersonImportance.LOW, StarSystemGenerator.random);
1448                        } else {
1449                                person.setImportanceAndVoice(PersonImportance.VERY_LOW, StarSystemGenerator.random);
1450                        }
1451                        
1452                        person.addTag(Tags.CONTACT_TRADE);
1453                        
1454                        market.getCommDirectory().addPerson(person);
1455                        market.addPerson(person);
1456                        ip.addPerson(person);
1457                        ip.getData(person).getLocation().setMarket(market);
1458                        ip.checkOutPerson(person, "permanent_staff");
1459                        addedPerson = true;
1460                        randomPeople.add(person);
1461                }
1462                
1463                if (addedPerson) {
1464                        PersonAPI person = market.getFaction().createRandomPerson(StarSystemGenerator.random);
1465                        person.setRankId(Ranks.SPACE_COMMANDER);
1466                        person.setPostId(Ranks.POST_SUPPLY_OFFICER);
1467                        
1468                        if (market.getSize() >= 6) {
1469                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1470                        } else if (market.getSize() >= 4) {
1471                                person.setImportanceAndVoice(PersonImportance.LOW, StarSystemGenerator.random);
1472                        } else {
1473                                person.setImportanceAndVoice(PersonImportance.VERY_LOW, StarSystemGenerator.random);
1474                        }
1475                        
1476                        person.addTag(Tags.CONTACT_MILITARY);
1477                        person.addTag(Tags.CONTACT_TRADE);
1478                        if (StarSystemGenerator.random.nextFloat() < 0.2f) {
1479                                person.addTag(Tags.CONTACT_UNDERWORLD);
1480                        }
1481                        
1482                        market.getCommDirectory().addPerson(person);
1483                        market.addPerson(person);
1484                        ip.addPerson(person);
1485                        ip.getData(person).getLocation().setMarket(market);
1486                        ip.checkOutPerson(person, "permanent_staff");
1487                        addedPerson = true;
1488                        randomPeople.add(person);
1489                }
1490                
1491                if (!addedPerson || admin == null) {
1492                        PersonAPI person = market.getFaction().createRandomPerson(StarSystemGenerator.random);
1493                        person.setRankId(Ranks.CITIZEN);
1494                        person.setPostId(Ranks.POST_ADMINISTRATOR);
1495                        
1496                        if (market.getSize() >= 8) {
1497                                person.setImportanceAndVoice(PersonImportance.VERY_HIGH, StarSystemGenerator.random);
1498                        } else if (market.getSize() >= 6) {
1499                                person.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);
1500                        } else {
1501                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1502                        }
1503                        
1504                        person.addTag(Tags.CONTACT_TRADE);
1505                        
1506                        market.getCommDirectory().addPerson(person);
1507                        market.addPerson(person);
1508                        ip.addPerson(person);
1509                        ip.getData(person).getLocation().setMarket(market);
1510                        ip.checkOutPerson(person, "permanent_staff");
1511                        admin = person;
1512                        randomPeople.add(person);
1513                }
1514                
1515                if (admin != null) {
1516                        addSkillsAndAssignAdmin(market, admin);
1517                }
1518                
1519                List<PersonAPI> people = new ArrayList<PersonAPI>(randomPeople);
1520                Iterator<PersonAPI> iter = people.iterator();
1521                while (iter.hasNext()) {
1522                        PersonAPI curr = iter.next();
1523                        if (curr == null || curr.getFaction() == null) {
1524                                iter.remove();
1525                                continue;
1526                        }
1527                        if (curr.isDefault() || curr.isAICore() || curr.isPlayer()) {
1528                                iter.remove();
1529                                continue;
1530                        }
1531                }
1532                dedupePortraits(people);
1533        }
1534        
1535        private void createInitialPeople() {
1536                
1537                //List<MarketAPI> withAutoAdmins = new ArrayList<MarketAPI>();
1538                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1539                        if (market.getMemoryWithoutUpdate().getBoolean(MemFlags.MARKET_DO_NOT_INIT_COMM_LISTINGS)) continue;
1540                        createInitialPeople(market, StarSystemGenerator.random);
1541                }
1542                
1543                assignCustomAdmins();
1544                
1545
1546//              List<PersonAPI> people = new ArrayList<PersonAPI>(randomPeople);
1547//              Iterator<PersonAPI> iter = people.iterator();
1548//              while (iter.hasNext()) {
1549//                      PersonAPI curr = iter.next();
1550//                      if (curr == null || curr.getFaction() == null) {
1551//                              iter.remove();
1552//                              continue;
1553//                      }
1554//                      if (curr.isDefault() || curr.isAICore() || curr.isPlayer()) {
1555//                              iter.remove();
1556//                              continue;
1557//                      }
1558//              }
1559//              
1560//              dedupePortraits(people);
1561                
1562//              List<PersonAPI> admins = new ArrayList<PersonAPI>();
1563//              for (MarketAPI market : withAutoAdmins) {
1564//                      PersonAPI admin = market.getAdmin();
1565//                      if (admin == null || admin.getFaction() == null) continue;
1566//                      if (admin.isDefault() || admin.isAICore() || admin.isPlayer()) continue;
1567//                      admins.add(admin);
1568//              }
1569//              dedupePortraits(admins);
1570                
1571                // this assigns faction leaders etc; important that it happen after deduping
1572                // so there's no chance the deduping messes up a custom character's portrait
1573                People.create();
1574        }
1575        
1576        
1577        public static void dedupePortraits(List<PersonAPI> people) {
1578                for (int i = 0; i < 10 * people.size(); i++) {
1579                        if (hasDuplicatePortraits(people)) {
1580                                for (PersonAPI person : people) {
1581//                                      if (person.getNameString().equals("Abasi Ganymede")) {
1582//                                              System.out.println("efwfwef");
1583//                                      }
1584                                        if (person.isDefault() || person.isAICore() || person.isPlayer()) continue;
1585                                        int num = getPortraitCount(people, person);
1586                                        if (num > 1) {
1587                                                for (int j = 0; j < 10; j++) {
1588                                                        regenPortrait(person);
1589                                                        num = getPortraitCount(people, person);
1590                                                        if (num <= 1) break;
1591                                                }
1592                                                Collections.shuffle(people, StarSystemGenerator.random);
1593                                                break;
1594                                        }
1595                                }
1596                        }
1597                }
1598        }
1599        
1600        public static void regenPortrait(PersonAPI person) {
1601                if (person == null || person.getFaction() == null) return;
1602                
1603                String curr = person.getPortraitSprite();
1604                if (curr == null) curr = "";
1605                for (int i = 0; i < 10; i++) {
1606                        String other = person.getFaction().createRandomPerson(person.getGender(), StarSystemGenerator.random).getPortraitSprite();
1607                        if (!curr.equals(other)) {
1608                                person.setPortraitSprite(other);
1609                                break;
1610                        }
1611                }
1612        }
1613        
1614        public static int getPortraitCount(List<PersonAPI> people, PersonAPI person) {
1615                String curr = person.getPortraitSprite();
1616                int count = 0;
1617                for (PersonAPI other : people) {
1618                        String str = other.getPortraitSprite();
1619                        if (str == null) continue;
1620                        if (curr.equals(str)) count++;
1621                }
1622                return count;
1623        }
1624        
1625        public static boolean hasDuplicatePortraits(List<PersonAPI> people) {
1626                Set<String> used = new LinkedHashSet<String>();
1627                for (PersonAPI person : people) {
1628                        String str = person.getPortraitSprite();
1629                        if (used.contains(str)) return true;
1630                        used.add(str);
1631                }
1632                return false;
1633        }
1634        
1635        protected void assignCustomAdmins() {
1636                ImportantPeopleAPI ip = Global.getSector().getImportantPeople();
1637                
1638                {
1639                MarketAPI market =  Global.getSector().getEconomy().getMarket("station_kapteyn");
1640                if (market != null) {
1641                        PersonAPI person = market.getFaction().createRandomPerson();
1642                        person.setRankId(Ranks.CITIZEN);
1643                        person.setPostId(Ranks.POST_ADMINISTRATOR);
1644                        person.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);
1645                        
1646                        person.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);
1647                        //person.getStats().setSkillLevel(Skills.SPACE_OPERATIONS, 1);
1648                        
1649                        for (PersonAPI p : market.getPeopleCopy()) {
1650                                if (Ranks.POST_ADMINISTRATOR.equals(p.getPostId())) {
1651                                        market.removePerson(p);
1652                                        ip.removePerson(p);
1653                                        market.getCommDirectory().removePerson(p);
1654                                        break;
1655                                }
1656                        }
1657                        
1658                        market.setAdmin(person);
1659                        market.getCommDirectory().addPerson(person, 0);
1660                        market.addPerson(person);
1661                        
1662                        ip.addPerson(person);
1663                        ip.getData(person).getLocation().setMarket(market);
1664                        ip.checkOutPerson(person, "permanent_staff");
1665                }
1666                }
1667                
1668                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
1669                        if (Factions.TRITACHYON.equals(market.getFactionId()) &&
1670                                        //(market.getId().equals("eochu_bres") ||
1671                                                        (market.getId().equals("culann"))) {
1672                                PersonAPI person = market.getFaction().createRandomPerson();
1673                                person.setRankId(Ranks.CITIZEN);
1674                                person.setPostId(Ranks.POST_ADMINISTRATOR);
1675                                
1676                                // totally not a front for an Alpha Core
1677                                person.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);
1678                                person.getStats().setSkillLevel(Skills.HYPERCOGNITION, 1);
1679//                              person.getStats().setSkillLevel(Skills.SPACE_OPERATIONS, 1);
1680//                              person.getStats().setSkillLevel(Skills.PLANETARY_OPERATIONS, 1);
1681                                person.setAICoreId(Commodities.ALPHA_CORE);
1682                                person.getMemoryWithoutUpdate().set(MemFlags.SUSPECTED_AI, true);
1683                                person.setImportanceAndVoice(PersonImportance.MEDIUM, StarSystemGenerator.random);
1684                                
1685                                for (PersonAPI p : market.getPeopleCopy()) {
1686                                        if (Ranks.POST_ADMINISTRATOR.equals(p.getPostId())) {
1687                                                market.removePerson(p);
1688                                                ip.removePerson(p);
1689                                                market.getCommDirectory().removePerson(p);
1690                                                break;
1691                                        }
1692                                }
1693                                
1694                                market.setAdmin(person);
1695                                market.getCommDirectory().addPerson(person, 0);
1696                                market.addPerson(person);
1697                                
1698                                ip.addPerson(person);
1699                                ip.getData(person).getLocation().setMarket(market);
1700                                ip.checkOutPerson(person, "permanent_staff");
1701                        }
1702                }
1703                
1704        }
1705
1706        public static void addSkillsAndAssignAdmin(MarketAPI market, PersonAPI admin) {
1707                List<String> skills = Global.getSettings().getSortedSkillIds();
1708//              if (!skills.contains(Skills.PLANETARY_OPERATIONS) ||
1709//                              !skills.contains(Skills.SPACE_OPERATIONS) ||
1710//                              !skills.contains(Skills.INDUSTRIAL_PLANNING)) {
1711//                      return;
1712//              }
1713                if (!skills.contains(Skills.INDUSTRIAL_PLANNING)) {
1714                        return;
1715                }
1716                
1717                int size = market.getSize();
1718                //if (size <= 4) return;
1719                
1720                int industries = 0;
1721                
1722                for (Industry curr : market.getIndustries()) {
1723                        if (curr.isIndustry()) {
1724                                industries++;
1725                        }
1726                }
1727                
1728                
1729                admin.getStats().setSkipRefresh(true);
1730                
1731                if (industries >= 2 || size >= 6) {
1732                        admin.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);
1733                }
1734                
1735                admin.getStats().setSkipRefresh(false);
1736                admin.getStats().refreshCharacterStatsEffects();
1737                
1738                market.setAdmin(admin);
1739        }
1740        
1741        
1742        
1743        
1744
1745        @Override
1746        public void configureXStream(XStream x) {
1747                x.alias("AssignmentModulePlugin", com.fs.starfarer.api.campaign.ai.AssignmentModulePlugin.class);
1748                x.alias("ModularFleetAIAPI", com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI.class);
1749                x.alias("NavigationModulePlugin", com.fs.starfarer.api.campaign.ai.NavigationModulePlugin.class);
1750                x.alias("StrategicModulePlugin", com.fs.starfarer.api.campaign.ai.StrategicModulePlugin.class);
1751                x.alias("TacticalModulePlugin", com.fs.starfarer.api.campaign.ai.TacticalModulePlugin.class);
1752                
1753                x.alias("NTP", NebulaTerrainPlugin.class);
1754                x.alias("AuroraRenderer", AuroraRenderer.class);
1755                x.alias("CRLPSBuff", CRLossPerSecondBuff.class);
1756                x.aliasAttribute(CRLossPerSecondBuff.class, "id", "id");
1757                x.aliasAttribute(CRLossPerSecondBuff.class, "mult", "m");
1758                x.aliasAttribute(CRLossPerSecondBuff.class, "dur", "d");
1759                
1760                x.alias("PPBuff", PeakPerformanceBuff.class);
1761                x.aliasAttribute(PeakPerformanceBuff.class, "id", "id");
1762                x.aliasAttribute(PeakPerformanceBuff.class, "mult", "m");
1763                x.aliasAttribute(PeakPerformanceBuff.class, "dur", "d");
1764                
1765                
1766//              x.alias("FParams", FleetParams.class);
1767//              x.aliasAttribute(FleetParams.class, "hyperspaceLocation", "hL");
1768//              x.aliasAttribute(FleetParams.class, "market", "m");
1769//              x.aliasAttribute(FleetParams.class, "factionId", "fId");
1770//              x.aliasAttribute(FleetParams.class, "fleetType", "fT");
1771//              x.aliasAttribute(FleetParams.class, "combatPts", "cP");
1772//              x.aliasAttribute(FleetParams.class, "freighterPts", "fP");
1773//              x.aliasAttribute(FleetParams.class, "tankerPts", "taP");
1774//              x.aliasAttribute(FleetParams.class, "transportPts", "trP");
1775//              x.aliasAttribute(FleetParams.class, "linerPts", "lP");
1776//              x.aliasAttribute(FleetParams.class, "civilianPts", "civP");
1777//              x.aliasAttribute(FleetParams.class, "utilityPts", "uP");
1778//              x.aliasAttribute(FleetParams.class, "qualityBonus", "qB");
1779//              x.aliasAttribute(FleetParams.class, "qualityOverride", "qO");
1780//              x.aliasAttribute(FleetParams.class, "officerNumMult", "oNM");
1781//              x.aliasAttribute(FleetParams.class, "officerLevelBonus", "oLB");
1782//              x.aliasAttribute(FleetParams.class, "levelLimit", "lL");
1783//              x.aliasAttribute(FleetParams.class, "commander", "c");
1784//              x.aliasAttribute(FleetParams.class, "factionIdForShipPicking", "fIDSP");
1785//              x.aliasAttribute(FleetParams.class, "random", "r");
1786//              x.aliasAttribute(FleetParams.class, "withOfficers", "wO");
1787//              x.aliasAttribute(FleetParams.class, "maxShipSize", "mSS");
1788                
1789                x.alias("SlipParams", SlipstreamParams2.class);
1790                x.aliasAttribute(SlipstreamParams2.class, "spriteKey1", "sK1");
1791                x.aliasAttribute(SlipstreamParams2.class, "spriteKey2", "sK2");
1792                x.aliasAttribute(SlipstreamParams2.class, "spriteKey3", "sK3");
1793                x.aliasAttribute(SlipstreamParams2.class, "edgeKey", "eK");
1794                x.aliasAttribute(SlipstreamParams2.class, "spriteColor", "sC");
1795                x.aliasAttribute(SlipstreamParams2.class, "windGlowColor", "wGC");
1796                x.aliasAttribute(SlipstreamParams2.class, "edgeColor", "eC");
1797                x.aliasAttribute(SlipstreamParams2.class, "baseWidth", "bW");
1798                x.aliasAttribute(SlipstreamParams2.class, "widthForMaxSpeed", "wFMS");
1799                x.aliasAttribute(SlipstreamParams2.class, "edgeWidth", "eW");
1800                x.aliasAttribute(SlipstreamParams2.class, "areaPerParticle", "aPP");
1801                x.aliasAttribute(SlipstreamParams2.class, "maxParticles", "maxP");
1802                x.aliasAttribute(SlipstreamParams2.class, "minSpeed", "minS");
1803                x.aliasAttribute(SlipstreamParams2.class, "maxSpeed", "maxS");
1804                x.aliasAttribute(SlipstreamParams2.class, "minColor", "minC");
1805                x.aliasAttribute(SlipstreamParams2.class, "maxColor", "maxC");
1806                x.aliasAttribute(SlipstreamParams2.class, "mapColor", "mCol");
1807                x.aliasAttribute(SlipstreamParams2.class, "minDur", "minD");
1808                x.aliasAttribute(SlipstreamParams2.class, "maxDur", "maxD");
1809                x.aliasAttribute(SlipstreamParams2.class, "particleFadeInTime", "pFIT");
1810                x.aliasAttribute(SlipstreamParams2.class, "lineLengthFractionOfSpeed", "lLFOS");
1811                x.aliasAttribute(SlipstreamParams2.class, "burnLevel", "bL");
1812                x.aliasAttribute(SlipstreamParams2.class, "maxBurnLevelForTextureScroll", "mBLFTS");
1813                x.aliasAttribute(SlipstreamParams2.class, "slowDownInWiderSections", "slow");
1814                x.aliasAttribute(SlipstreamParams2.class, "widthForMaxSpeedMinMult", "wFMSMin");
1815                x.aliasAttribute(SlipstreamParams2.class, "widthForMaxSpeedMaxMult", "wFMSMax");
1816                x.aliasAttribute(SlipstreamParams2.class, "name", "name");
1817                x.aliasAttribute(SlipstreamParams2.class, "texScrollMult0", "tSM0");
1818                x.aliasAttribute(SlipstreamParams2.class, "texScrollMult1", "tSM1");
1819                x.aliasAttribute(SlipstreamParams2.class, "texScrollMult2", "tSM2");
1820                
1821                
1822                x.alias("SSeg", SlipstreamSegment.class);
1823                x.aliasAttribute(SlipstreamSegment.class, "locB", "B");
1824                x.aliasAttribute(SlipstreamSegment.class, "loc", "l");
1825                x.aliasAttribute(SlipstreamSegment.class, "width", "w");
1826                x.aliasAttribute(SlipstreamSegment.class, "bMult", "m");
1827                x.aliasAttribute(SlipstreamSegment.class, "discovered", "d");
1828                x.aliasAttribute(SlipstreamSegment.class, "fader", "f");
1829                
1830                
1831                x.alias("SlipTP2", SlipstreamTerrainPlugin2.class);
1832                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "params", "p");
1833                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "segments", "s");
1834                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "totalLength", "tL");
1835                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "needsRecompute", "nR");
1836                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "bounds", "b");
1837                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "segmentsPerBox", "sPB");
1838                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "texProgress0", "tP0");
1839                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "texProgress1", "tP1");
1840                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "texProgress2", "tP2");
1841                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "despawnNoise", "dN");
1842                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "despawnDelay", "dDe");
1843                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "despawnDays", "dDa");
1844                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "despawnElapsed", "dE");
1845                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "spawnNoise", "sN");
1846                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "spawnDays", "sD");
1847                x.aliasAttribute(SlipstreamTerrainPlugin2.class, "spawnElapsed", "sE");
1848                
1849                x.alias("BBox", BoundingBox.class);
1850                x.aliasAttribute(BoundingBox.class, "box", "b");
1851                x.aliasAttribute(BoundingBox.class, "padding", "p");
1852                x.aliasAttribute(BoundingBox.class, "rotatedBox", "rB");
1853                x.aliasAttribute(BoundingBox.class, "angle", "a");
1854                x.aliasAttribute(BoundingBox.class, "boxComputed", "bC");
1855                x.aliasAttribute(BoundingBox.class, "center", "c");
1856                x.aliasAttribute(BoundingBox.class, "radius", "r");
1857                
1858                
1859                x.alias("FParams", FleetParamsV3.class);
1860                x.aliasAttribute(FleetParamsV3.class, "source", "srcL");
1861                x.aliasAttribute(FleetParamsV3.class, "locInHyper", "lIH");
1862                x.aliasAttribute(FleetParamsV3.class, "quality", "q");
1863                x.aliasAttribute(FleetParamsV3.class, "qualityMod", "qMod");
1864                x.aliasAttribute(FleetParamsV3.class, "qualityOverride", "qO");
1865                x.aliasAttribute(FleetParamsV3.class, "factionId", "fId");
1866                x.aliasAttribute(FleetParamsV3.class, "fleetType", "fT");
1867                x.aliasAttribute(FleetParamsV3.class, "combatPts", "cP");
1868                x.aliasAttribute(FleetParamsV3.class, "freighterPts", "fP");
1869                x.aliasAttribute(FleetParamsV3.class, "tankerPts", "taP");
1870                x.aliasAttribute(FleetParamsV3.class, "transportPts", "trP");
1871                x.aliasAttribute(FleetParamsV3.class, "linerPts", "lP");
1872                x.aliasAttribute(FleetParamsV3.class, "utilityPts", "uP");
1873                x.aliasAttribute(FleetParamsV3.class, "withOfficers", "wO");
1874                x.aliasAttribute(FleetParamsV3.class, "maxShipSize", "mSS");
1875                x.aliasAttribute(FleetParamsV3.class, "minShipSize", "minSS");
1876                x.aliasAttribute(FleetParamsV3.class, "averageSMods", "aSM");
1877                x.aliasAttribute(FleetParamsV3.class, "commander", "c");
1878                x.aliasAttribute(FleetParamsV3.class, "random", "r");
1879                x.aliasAttribute(FleetParamsV3.class, "ignoreMarketFleetSizeMult", "iMFSM");
1880                x.aliasAttribute(FleetParamsV3.class, "onlyApplyFleetSizeToCombatShips", "oAFSTCS");
1881                x.aliasAttribute(FleetParamsV3.class, "doNotPrune", "dNP");
1882                x.aliasAttribute(FleetParamsV3.class, "modeOverride", "mO");
1883                x.aliasAttribute(FleetParamsV3.class, "officerLevelBonus", "oLB");
1884                x.aliasAttribute(FleetParamsV3.class, "officerNumberBonus", "oNB");
1885                x.aliasAttribute(FleetParamsV3.class, "officerNumberMult", "oNM");
1886                x.aliasAttribute(FleetParamsV3.class, "officerLevelLimit", "oLL");
1887                x.aliasAttribute(FleetParamsV3.class, "commanderLevelLimit", "cLL");
1888                x.aliasAttribute(FleetParamsV3.class, "forceAllowPhaseShipsEtc", "fAPSE");
1889                x.aliasAttribute(FleetParamsV3.class, "treatCombatFreighterSettingAsFraction", "tCFSAF");
1890                x.aliasAttribute(FleetParamsV3.class, "doctrineOverride", "dOv");
1891                x.aliasAttribute(FleetParamsV3.class, "doctrineOverride", "ts");
1892                x.aliasAttribute(FleetParamsV3.class, "maxNumShips", "mNS");
1893                x.aliasAttribute(FleetParamsV3.class, "onlyRetainFlagship", "oRF");
1894                x.aliasAttribute(FleetParamsV3.class, "flagshipVariantId", "fVI");
1895                x.aliasAttribute(FleetParamsV3.class, "flagshipVariant", "fV");
1896                x.aliasAttribute(FleetParamsV3.class, "aiCores", "aiC");
1897                x.aliasAttribute(FleetParamsV3.class, "doNotIntegrateAICores", "dNIAIC");
1898                x.aliasAttribute(FleetParamsV3.class, "allWeapons", "aW");
1899
1900                
1901                x.alias("MaxBurnBuff", MaxBurnBuff.class);
1902                x.alias("PeakPerformanceBuff", PeakPerformanceBuff.class);
1903                x.alias("RingSystemTerrainPlugin", RingSystemTerrainPlugin.class);
1904                x.alias("StarCoronaAkaMainyuTerrainPlugin", StarCoronaAkaMainyuTerrainPlugin.class);
1905                x.alias("StarCoronaTerrainPlugin", StarCoronaTerrainPlugin.class);
1906                
1907                x.alias("PulsarBeamTerrainPlugin", PulsarBeamTerrainPlugin.class);
1908                x.alias("EventHorizonPlugin", EventHorizonPlugin.class);
1909                
1910                x.alias("FlareManager", FlareManager.class);
1911                x.aliasAttribute(FlareManager.class, "flareTracker", "fT");
1912                x.aliasAttribute(FlareManager.class, "flares", "f");
1913                x.aliasAttribute(FlareManager.class, "delegate", "d");
1914                
1915                x.alias("Flare", Flare.class);
1916                x.aliasAttribute(Flare.class, "direction", "d");
1917                x.aliasAttribute(Flare.class, "arc", "a");
1918                x.aliasAttribute(Flare.class, "extraLengthMult", "eLM");
1919                x.aliasAttribute(Flare.class, "extraLengthFlat", "eLF");
1920                x.aliasAttribute(Flare.class, "shortenFlatMod", "sFM");
1921                x.aliasAttribute(Flare.class, "c", "c");
1922                x.aliasAttribute(Flare.class, "fader", "f");
1923                
1924                
1925                
1926                x.alias("MagneticFieldTerrainPlugin", MagneticFieldTerrainPlugin.class);
1927                x.aliasAttribute(MagneticFieldTerrainPlugin.class, "entity", "e");
1928                //x.aliasAttribute(MagneticFieldTerrainPlugin.class, "params", "p");
1929                x.aliasAttribute(MagneticFieldTerrainPlugin.class, "renderer", "r");
1930                x.aliasAttribute(MagneticFieldTerrainPlugin.class, "flareManager", "fM");
1931                
1932                x.alias("MagneticFieldParams", MagneticFieldParams.class);
1933                x.aliasAttribute(MagneticFieldParams.class, "baseColor", "bC");
1934                x.aliasAttribute(MagneticFieldParams.class, "c", "c");
1935                x.aliasAttribute(MagneticFieldParams.class, "auroraFrequency", "aF");
1936                x.aliasAttribute(MagneticFieldParams.class, "innerRadius", "iR");
1937                x.aliasAttribute(MagneticFieldParams.class, "outerRadius", "oR");
1938                
1939                x.alias("", AuroraRenderer.class);
1940                x.aliasAttribute(AuroraRenderer.class, "phaseAngle", "a");
1941                x.aliasAttribute(AuroraRenderer.class, "delegate", "d");
1942                
1943                
1944                x.alias("FlickerUtil", FlickerUtil.class);
1945                x.aliasAttribute(FlickerUtil.class, "angle", "a");
1946                x.aliasAttribute(FlickerUtil.class, "brightness", "b");
1947                x.aliasAttribute(FlickerUtil.class, "currTime", "c");
1948                x.aliasAttribute(FlickerUtil.class, "currMaxBurstTime", "cMBT");
1949                x.aliasAttribute(FlickerUtil.class, "currMaxBrightness", "cMB");
1950                x.aliasAttribute(FlickerUtil.class, "maxBurstTime", "mBT");
1951                x.aliasAttribute(FlickerUtil.class, "peakTime", "pT");
1952                x.aliasAttribute(FlickerUtil.class, "peakDur", "pD");
1953                x.aliasAttribute(FlickerUtil.class, "stop", "s");
1954                
1955//              x.alias("FTr", FlickerTracker.class);
1956//      
1957//              x.aliasAttribute(FlickerTracker.class, "leadTime", "f");
1958//              x.aliasAttribute(FlickerTracker.class, "shiver", "sh");
1959//              x.aliasAttribute(FlickerTracker.class, "highlight", "hi");
1960//              x.aliasAttribute(FlickerTracker.class, "flicker", "f");
1961//              x.aliasAttribute(FlickerTracker.class, "stopped", "s");
1962//              x.aliasAttribute(FlickerTracker.class, "checkedBurst", "cB");
1963                
1964                x.alias("FUtil", FaderUtil.class);
1965                x.aliasAttribute(FaderUtil.class, "currBrightness", "b");
1966                x.aliasAttribute(FaderUtil.class, "durationIn", "i");
1967                x.aliasAttribute(FaderUtil.class, "durationOut", "o");
1968                x.aliasAttribute(FaderUtil.class, "state", "s");
1969                x.aliasAttribute(FaderUtil.class, "bounceDown", "d");
1970                x.aliasAttribute(FaderUtil.class, "bounceUp", "u");
1971                
1972                
1973                x.alias("IUtil", IntervalUtil.class);
1974                x.aliasAttribute(IntervalUtil.class, "minInterval", "i");
1975                x.aliasAttribute(IntervalUtil.class, "maxInterval", "a");
1976                x.aliasAttribute(IntervalUtil.class, "currInterval", "c");
1977                x.aliasAttribute(IntervalUtil.class, "elapsed", "e");
1978                x.aliasAttribute(IntervalUtil.class, "intervalElapsed", "ie");
1979                
1980                x.alias("TimeoutTracker", TimeoutTracker.class);
1981                //x.aliasAttribute(TimeoutTracker.class, "items", "itms");
1982                
1983                x.alias("IDt", TimeoutTracker.ItemData.class);
1984                x.aliasAttribute(ItemData.class, "item", "i");
1985                x.aliasAttribute(ItemData.class, "remaining", "r");
1986                
1987                
1988                x.alias("TrA", TransponderAbility.class);
1989                x.alias("TrAI", TransponderAbilityAI.class);
1990                
1991                x.alias("EmB", EmergencyBurnAbility.class);
1992                x.alias("EmBAI", EmergencyBurnAbilityAI.class);
1993                
1994                x.alias("GoDA", GoDarkAbility.class);
1995                x.alias("GoDAAI", GoDarkAbilityAI.class);
1996                
1997                x.alias("SeBA", SensorBurstAbility.class);
1998                x.alias("SeBAAI", SensorBurstAbilityAI.class);
1999                
2000                x.alias("SuBA", SustainedBurnAbility.class);
2001                x.alias("SuBAAI", SustainedBurnAbilityAI.class);
2002                
2003                x.alias("InPA", InterdictionPulseAbility.class);
2004                x.alias("InPAAI", InterdictionPulseAbilityAI.class);
2005                
2006                x.alias("IPReactionScript", IPReactionScript.class);
2007                x.aliasAttribute(IPReactionScript.class, "delay", "e");
2008                x.aliasAttribute(IPReactionScript.class, "done", "d");
2009                x.aliasAttribute(IPReactionScript.class, "other", "o");
2010                x.aliasAttribute(IPReactionScript.class, "fleet", "f");
2011                x.aliasAttribute(IPReactionScript.class, "activationDays", "aD");
2012                
2013                x.alias("ScA", ScavengeAbility.class);
2014                x.alias("FJA", FractureJumpAbility.class);
2015                x.alias("RSA", RemoteSurveyAbility.class);
2016                
2017                x.alias("GScan", GraviticScanAbility.class);
2018                x.alias("GSDat", GraviticScanData.class);
2019                x.alias("GSPing", GSPing.class);
2020                x.aliasAttribute(GSPing.class, "arc", "a");
2021                x.aliasAttribute(GSPing.class, "angle", "n");
2022                x.aliasAttribute(GSPing.class, "grav", "g");
2023                x.aliasAttribute(GSPing.class, "fader", "f");
2024                x.aliasAttribute(GSPing.class, "withSound", "s");
2025                
2026                
2027                x.alias("ProcgenUsedNames", ProcgenUsedNames.class);
2028                x.alias("SmugglingScanScript", SmugglingScanScript.class);
2029                x.alias("HasslePlayerScript", HasslePlayerScript.class);
2030                
2031                //x.alias("BaseToggleAbility", BaseToggleAbility.class);
2032                
2033                
2034                x.aliasAttribute(BaseAbilityPlugin.class, "entity", "e");
2035                x.aliasAttribute(BaseAbilityPlugin.class, "id", "id");
2036                x.aliasAttribute(BaseAbilityPlugin.class, "disableFrames", "dF");
2037                
2038                x.aliasAttribute(BaseToggleAbility.class, "turnedOn", "tO");
2039                x.aliasAttribute(BaseToggleAbility.class, "cooldownLeft", "cL");
2040                x.aliasAttribute(BaseToggleAbility.class, "isActivateCooldown", "iAC");
2041                x.aliasAttribute(BaseToggleAbility.class, "level", "l");
2042                
2043                x.aliasAttribute(BaseDurationAbility.class, "turnedOn", "tO");
2044                x.aliasAttribute(BaseDurationAbility.class, "activeDaysLeft", "aDL");
2045                x.aliasAttribute(BaseDurationAbility.class, "cooldownLeft", "cL");
2046                x.aliasAttribute(BaseDurationAbility.class, "level", "l");
2047                x.aliasAttribute(BaseDurationAbility.class, "loopFadeLeft", "lFF");
2048                x.aliasAttribute(BaseDurationAbility.class, "fadingOut", "fO");
2049                
2050                x.aliasAttribute(BaseAbilityAI.class, "fleet", "f");
2051                x.aliasAttribute(BaseAbilityAI.class, "ability", "a");
2052                
2053                x.aliasAttribute(GoDarkAbilityAI.class, "interval", "i");
2054                x.aliasAttribute(TransponderAbilityAI.class, "interval", "i");
2055                x.aliasAttribute(EmergencyBurnAbilityAI.class, "interval", "i");
2056                x.aliasAttribute(SensorBurstAbilityAI.class, "interval", "i");
2057                
2058                
2059                x.alias("RAT", RollingAverageTracker.class);
2060                x.aliasAttribute(RollingAverageTracker.class, "timer", "t");
2061                x.aliasAttribute(RollingAverageTracker.class, "f", "f");
2062                x.aliasAttribute(RollingAverageTracker.class, "elaspedFractionOverride", "e");
2063                x.aliasAttribute(RollingAverageTracker.class, "curr", "c");
2064                x.aliasAttribute(RollingAverageTracker.class, "avg", "a");
2065                
2066                
2067//              x.alias("SSAT", StarSystemActivityTracker.class);
2068//              x.aliasAttribute(StarSystemActivityTracker.class, "econInterval", "eI");
2069//              x.aliasAttribute(StarSystemActivityTracker.class, "timer", "t");
2070//              x.aliasAttribute(StarSystemActivityTracker.class, "seen", "sn");
2071//              x.aliasAttribute(StarSystemActivityTracker.class, "system", "sy");
2072//              x.aliasAttribute(StarSystemActivityTracker.class, "points", "pt");
2073//              x.aliasAttribute(StarSystemActivityTracker.class, "fleets", "fl");
2074//              x.aliasAttribute(StarSystemActivityTracker.class, "ships", "sh");
2075                
2076                x.alias("PTDFS", PlayerTradeDataForSubmarket.class);
2077                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "playerBought", "pB");
2078                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "playerSold", "pS");
2079                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "accumulatedPlayerTradeValueForPositive", "accP");
2080                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "accumulatedPlayerTradeValueForNegative", "accN");
2081                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "totalPlayerTradeValue", "tPV");
2082                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "tracker", "t");
2083                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "playerBoughtShips", "pBS");
2084                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "playerSoldShips", "pSS");
2085                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "market", "m");
2086                x.aliasAttribute(PlayerTradeDataForSubmarket.class, "submarket", "s");
2087                
2088                
2089                x.alias("MPFD", com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase.PatrolFleetData.class);
2090                x.aliasAttribute( com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase.PatrolFleetData.class, "type", "t");
2091                x.aliasAttribute( com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase.PatrolFleetData.class, "spawnFP", "fp");
2092                
2093                x.alias("PatrolFleetData", PatrolFleetData.class);
2094                x.alias("PatrolFleetManager", PatrolFleetManager.class);
2095                x.alias("PatrolFleetManagerV2", PatrolFleetManagerV2.class);
2096                x.alias("PatrolAssignmentAI", PatrolAssignmentAI.class);
2097                x.alias("SharedData", SharedData.class);
2098                x.alias("HyperspaceTerrainPlugin", HyperspaceTerrainPlugin.class);
2099                x.alias("FoodShortageEvent", FoodShortageEvent.class);
2100                x.alias("CoreEventProbabilityManager", CoreEventProbabilityManager.class);
2101                x.alias("BlackMarketPlugin", BlackMarketPlugin.class);
2102                x.alias("PlayerTradeDataForSubmarket", PlayerTradeDataForSubmarket.class);
2103                x.alias("PriceUpdate", PriceUpdate.class);
2104                x.alias("JumpDestination", JumpDestination.class);
2105                x.alias("OpenMarketPlugin", OpenMarketPlugin.class);
2106                x.alias("CampaignEventTarget", CampaignEventTarget.class);
2107                //x.alias("EconomyFleetManager", EconomyFleetManager.class);
2108                //x.alias("StarSystemActivityTracker", StarSystemActivityTracker.class);
2109//              x.alias("StoragePlugin", StoragePlugin.class);
2110//              x.alias("MilitarySubmarketPlugin", MilitarySubmarketPlugin.class);
2111                x.alias("OfficerManagerEvent", OfficerManagerEvent.class);
2112                x.alias("AvailableOfficer", AvailableOfficer.class);
2113                x.alias("ManagedFleetData", ManagedFleetData.class);
2114                
2115                x.alias("TradeDisruption", TradeDisruption.class);
2116                x.alias("CommodityStats", CommodityStats.class);
2117                x.alias("TradeInfoUpdateEvent", TradeInfoUpdateEvent.class);
2118                x.alias("TransactionLineItem", TransactionLineItem.class);
2119                x.alias("Population", Population.class);
2120                //x.alias("MagneticFieldParams", MagneticFieldParams.class);
2121                //x.alias("MercFleetManager", MercFleetManager.class);
2122                x.alias("MercFleetManagerV2", MercFleetManagerV2.class);
2123                x.alias("InvestigationEventGoodRepWithOther", InvestigationEventGoodRepWithOther.class);
2124                //x.alias("SmugglingFactionChangeScript", SmugglingFactionChangeScript.class);
2125                x.alias("RepTrackerEvent", RepTrackerEvent.class);
2126                x.alias("Hydroponics", Hydroponics.class);
2127                x.alias("WorldUninhabitable", WorldUninhabitable.class);
2128                x.alias("ReputationChangeData", ReputationChangeData.class);
2129                x.alias("FactionTradeRepData", FactionTradeRepData.class);
2130                x.alias("RecentUnrest", RecentUnrest.class);
2131                x.alias("Outpost", Outpost.class);
2132                x.alias("CellStateTracker", CellStateTracker.class);
2133                x.alias("CoreScript", CoreScript.class);
2134                
2135                x.alias("CoronaParams", CoronaParams.class);
2136                x.aliasAttribute(CoronaParams.class, "windBurnLevel", "wBL");
2137                x.aliasAttribute(CoronaParams.class, "flareProbability", "fP");
2138                x.aliasAttribute(CoronaParams.class, "crLossMult", "crLM");
2139                
2140                x.alias("RingParams", RingParams.class);
2141                x.aliasAttribute(RingParams.class, "bandWidthInEngine", "bWIE");
2142                x.aliasAttribute(RingParams.class, "middleRadius", "mR");
2143                x.aliasAttribute(RingParams.class, "name", "n");
2144                x.aliasAttribute(RingParams.class, "relatedEntity", "e");
2145                
2146                x.alias("AsteroidBeltParams", AsteroidBeltParams.class);
2147                x.aliasAttribute(AsteroidBeltParams.class, "numAsteroids", "nA");
2148                x.aliasAttribute(AsteroidBeltParams.class, "minOrbitDays", "minO");
2149                x.aliasAttribute(AsteroidBeltParams.class, "maxOrbitDays", "maxO");
2150                x.aliasAttribute(AsteroidBeltParams.class, "minSize", "minS");
2151                x.aliasAttribute(AsteroidBeltParams.class, "maxSize", "maxS");
2152                
2153                x.alias("AsteroidFieldParams", AsteroidFieldParams.class);
2154                x.aliasAttribute(AsteroidFieldParams.class, "minRadius", "minR");
2155                x.aliasAttribute(AsteroidFieldParams.class, "maxRadius", "maxR");
2156                x.aliasAttribute(AsteroidFieldParams.class, "numAsteroids", "nA");
2157                x.aliasAttribute(AsteroidFieldParams.class, "minAsteroids", "minA");
2158                x.aliasAttribute(AsteroidFieldParams.class, "maxAsteroids", "maxA");
2159                x.aliasAttribute(AsteroidFieldParams.class, "minSize", "minS");
2160                x.aliasAttribute(AsteroidFieldParams.class, "maxSize", "maxS");
2161                
2162                x.alias("AsteroidBeltTerrainPlugin", AsteroidBeltTerrainPlugin.class);
2163                x.aliasAttribute(AsteroidBeltTerrainPlugin.class, "needToCreateAsteroids", "nTCA");
2164                
2165                x.alias("AsteroidFieldTerrainPlugin", AsteroidFieldTerrainPlugin.class);
2166                
2167                
2168                x.alias("BaseTerrain", BaseTerrain.class);
2169                x.aliasAttribute(BaseTerrain.class, "terrainId", "tid");
2170                x.aliasAttribute(BaseTerrain.class, "name", "n");
2171                
2172                x.alias("BaseRingTerrain", BaseRingTerrain.class);
2173                x.alias("AbandonedStation", AbandonedStation.class);
2174                x.alias("WorldTundra", WorldTundra.class);
2175                x.alias("Frontier", Frontier.class);
2176                x.alias("RadioChatterTerrainPlugin", RadioChatterTerrainPlugin.class);
2177                x.alias("RadioChatterParams", RadioChatterParams.class);
2178                x.alias("WorldBarrenMarginal", WorldBarrenMarginal.class);
2179                x.alias("UrbanizedPolity", UrbanizedPolity.class);
2180                x.alias("OrganizedCrime", OrganizedCrime.class);
2181                x.alias("Headquarters", Headquarters.class);
2182                x.alias("ViceDemand", ViceDemand.class);
2183                x.alias("SystemBounty", SystemBounty.class);
2184                x.alias("WorldTwilight", WorldTwilight.class);
2185                x.alias("RuralPolity", RuralPolity.class);
2186                x.alias("FreeMarket", FreeMarket.class);
2187                x.alias("WorldIce", WorldIce.class);
2188                x.alias("Dissident", Dissident.class);
2189                x.alias("TradeCenter", TradeCenter.class);
2190                x.alias("CottageIndustry", CottageIndustry.class);
2191                x.alias("LuddicMajority", LuddicMajority.class);
2192                x.alias("WorldArid", WorldArid.class);
2193                x.alias("Decivilized", Decivilized.class);
2194                x.alias("StealthMinefields", StealthMinefields.class);
2195                x.alias("Smuggling", Smuggling.class);
2196                x.alias("ShipbreakingCenter", ShipbreakingCenter.class);
2197                x.alias("FoodShortage", FoodShortage.class);
2198                x.alias("CRRecoveryBuff", CRRecoveryBuff.class);
2199                x.alias("LargeRefugeePopulation", LargeRefugeePopulation.class);
2200                x.alias("WorldWater", WorldWater.class);
2201                x.alias("RegionalCapital", RegionalCapital.class);
2202                x.alias("OrbitalBurns", OrbitalBurns.class);
2203                x.alias("WorldJungle", WorldJungle.class);
2204                x.alias("WorldDesert", WorldDesert.class);
2205                
2206                x.alias("BaseHazardCondition", BaseHazardCondition.class);
2207                x.alias("WorldTerran", WorldTerran.class);
2208                
2209                x.alias("DebrisFieldTerrainPlugin", DebrisFieldTerrainPlugin.class);
2210                x.alias("DebrisFieldParams", DebrisFieldParams.class);
2211                x.aliasAttribute(DebrisFieldParams.class, "density", "d");
2212                x.aliasAttribute(DebrisFieldParams.class, "baseDensity", "bD");
2213                x.aliasAttribute(DebrisFieldParams.class, "glowsDays", "gD");
2214                x.aliasAttribute(DebrisFieldParams.class, "lastsDays", "lD");
2215                x.aliasAttribute(DebrisFieldParams.class, "minSize", "min1");
2216                x.aliasAttribute(DebrisFieldParams.class, "maxSize", "max1");
2217                x.aliasAttribute(DebrisFieldParams.class, "glowColor", "gC");
2218                x.aliasAttribute(DebrisFieldParams.class, "defFaction", "dF");
2219                x.aliasAttribute(DebrisFieldParams.class, "defenderProb", "dP");
2220                x.aliasAttribute(DebrisFieldParams.class, "minStr", "min2");
2221                x.aliasAttribute(DebrisFieldParams.class, "maxStr", "max2");
2222                x.aliasAttribute(DebrisFieldParams.class, "maxDefenderSize", "mDS");
2223                x.aliasAttribute(DebrisFieldParams.class, "baseSalvageXP", "xp");
2224                x.aliasAttribute(DebrisFieldParams.class, "source", "s");
2225                
2226                
2227                
2228                x.alias("PlayerTradeProfitabilityData", PlayerTradeProfitabilityData.class);
2229                x.alias("CommodityData", CommodityData.class);
2230                x.alias("CoreCampaignPluginImpl", CoreCampaignPluginImpl.class);
2231                x.alias("FactionHostilityEvent", FactionHostilityEvent.class);
2232                x.alias("FactionHostilityPairKey", FactionHostilityPairKey.class);
2233                x.alias("InvestigationEventSmugglingV2", InvestigationEventSmugglingV2.class);
2234                x.alias("RecentUnrestEvent", RecentUnrestEvent.class);
2235                //x.alias("BountyPirateFleetManager", BountyPirateFleetManager.class);
2236                
2237                
2238                
2239                x.alias("AsteroidBeltParams", AsteroidBeltParams.class);
2240                
2241                
2242                x.alias("DomainSurveyDerelictSpecial", DomainSurveyDerelictSpecial.class);
2243                
2244                x.alias("BaseCustomEntityPlugin", BaseCustomEntityPlugin.class);
2245                x.aliasAttribute(BaseCustomEntityPlugin.class, "entity", "e");
2246                
2247                x.alias("DerelictShipEntityPlugin", DerelictShipEntityPlugin.class);
2248                x.aliasAttribute(DerelictShipEntityPlugin.class, "data", "d");
2249                x.aliasAttribute(DerelictShipEntityPlugin.class, "elapsed", "el");
2250                x.aliasAttribute(DerelictShipEntityPlugin.class, "angVel", "aV");
2251                
2252                x.alias("DerelictShipData", DerelictShipData.class);
2253                x.aliasAttribute(DerelictShipData.class, "ship", "s");
2254                x.aliasAttribute(DerelictShipData.class, "durationDays", "d");
2255                x.aliasAttribute(DerelictShipData.class, "canHaveExtraCargo", "c");
2256                
2257                x.alias("PerShipData", PerShipData.class);
2258                x.aliasAttribute(PerShipData.class, "condition", "c");
2259                x.aliasAttribute(PerShipData.class, "variantId", "vId");
2260                x.aliasAttribute(PerShipData.class, "variant", "v");
2261                x.aliasAttribute(PerShipData.class, "shipName", "sN");
2262                x.aliasAttribute(PerShipData.class, "addDmods", "d");
2263                x.aliasAttribute(PerShipData.class, "pruneWeapons", "p");
2264                x.aliasAttribute(PerShipData.class, "sModProb", "sMP");
2265                
2266                
2267                x.alias("ShipCondition", ShipCondition.class);
2268                
2269                
2270                x.alias("ShipRecoverySpecialData", ShipRecoverySpecialData.class);
2271                x.aliasAttribute(ShipRecoverySpecialData.class, "ships", "s");
2272                x.aliasAttribute(ShipRecoverySpecialData.class, "desc", "d");
2273                
2274                x.alias("BreadcrumbSpecialData", BreadcrumbSpecialData.class);
2275                x.aliasAttribute(BreadcrumbSpecialData.class, "targetId", "tI");
2276                x.aliasAttribute(BreadcrumbSpecialData.class, "targetName", "tN");
2277                        
2278                x.alias("DerSpecialType", SpecialType.class);
2279                x.alias("DomainSurveyDerelictSpecialData", DomainSurveyDerelictSpecialData.class);
2280                x.aliasAttribute(DomainSurveyDerelictSpecialData.class, "type", "t");
2281                x.aliasAttribute(DomainSurveyDerelictSpecialData.class, "entityId", "eI");
2282                x.aliasAttribute(DomainSurveyDerelictSpecialData.class, "secondaryId", "sI");
2283                
2284                
2285                x.alias("SleeperSpecialType", SleeperSpecialType.class);
2286                x.alias("SleeperPodsSpecialData", SleeperPodsSpecialData.class);
2287                x.aliasAttribute(SleeperPodsSpecialData.class, "type", "t");
2288                //x.aliasAttribute(SleeperPodsSpecialData.class, "quantity", "q");
2289                x.aliasAttribute(SleeperPodsSpecialData.class, "officer", "o");
2290                
2291                
2292                x.alias("SDSpecialType", SurveyDataSpecialType.class);
2293                x.alias("SurveyDataSpecialData", SurveyDataSpecialData.class);
2294                x.aliasAttribute(SurveyDataSpecialData.class, "type", "t");
2295                x.aliasAttribute(SurveyDataSpecialData.class, "entityId", "eI");
2296                x.aliasAttribute(SurveyDataSpecialData.class, "secondaryId", "sI");
2297                x.aliasAttribute(SurveyDataSpecialData.class, "includeRuins", "r");
2298                
2299                
2300                x.alias("TransmitterTrapSpecialData", TransmitterTrapSpecialData.class);
2301                x.aliasAttribute(TransmitterTrapSpecialData.class, "prob", "c");
2302                x.aliasAttribute(TransmitterTrapSpecialData.class, "fleetId", "fID");
2303                x.aliasAttribute(TransmitterTrapSpecialData.class, "nearbyFleetFaction", "nFF");
2304                x.aliasAttribute(TransmitterTrapSpecialData.class, "useClosestFleetInRange", "uCFIR");
2305                x.aliasAttribute(TransmitterTrapSpecialData.class, "useAllFleetsInRange", "uAFIR");
2306                x.aliasAttribute(TransmitterTrapSpecialData.class, "params", "p");
2307                x.aliasAttribute(TransmitterTrapSpecialData.class, "minRange", "min");
2308                x.aliasAttribute(TransmitterTrapSpecialData.class, "maxRange", "max");
2309                
2310                
2311                x.alias("CargoManifestSpecialData", CargoManifestSpecialData.class);
2312                x.aliasAttribute(CargoManifestSpecialData.class, "commodityId", "c");
2313                
2314                
2315                
2316                x.alias("DDOv", DefenderDataOverride.class);
2317                x.aliasAttribute(DefenderDataOverride.class, "probDefenders", "p");
2318                x.aliasAttribute(DefenderDataOverride.class, "minStr", "i");
2319                x.aliasAttribute(DefenderDataOverride.class, "maxStr", "a");
2320                x.aliasAttribute(DefenderDataOverride.class, "maxDefenderSize", "d");
2321                x.aliasAttribute(DefenderDataOverride.class, "minDefenderSize", "m");
2322                x.aliasAttribute(DefenderDataOverride.class, "probStation", "t");
2323                x.aliasAttribute(DefenderDataOverride.class, "stationRole", "s");
2324                x.aliasAttribute(DefenderDataOverride.class, "defFaction", "f");
2325
2326                
2327                x.alias("SeededFleetManager", SeededFleetManager.class);
2328                x.aliasAttribute(SeededFleetManager.class, "fleets", "f");
2329                x.aliasAttribute(SeededFleetManager.class, "inflateRangeLY", "iRLY");
2330                x.aliasAttribute(SeededFleetManager.class, "system", "s");
2331                
2332                x.alias("SeededFleet", SeededFleet.class);
2333                x.aliasAttribute(SeededFleet.class, "seed", "s");
2334                x.aliasAttribute(SeededFleet.class, "points", "p");
2335                x.aliasAttribute(SeededFleet.class, "fleet", "f");
2336                
2337                x.alias("RemnantSeededFleetManager", RemnantSeededFleetManager.class);
2338                x.aliasAttribute(RemnantSeededFleetManager.class, "minPts", "i");
2339                x.aliasAttribute(RemnantSeededFleetManager.class, "maxPts", "a");
2340                x.aliasAttribute(RemnantSeededFleetManager.class, "activeChance", "c");
2341
2342                x.alias("RFICGen", RemnantFleetInteractionConfigGen.class);
2343                x.alias("RSICGen", RemnantStationInteractionConfigGen.class);
2344                
2345                x.alias("SourceBasedFleetManager", SourceBasedFleetManager.class);
2346                x.aliasAttribute(SourceBasedFleetManager.class, "fleets", "f");
2347                x.aliasAttribute(SourceBasedFleetManager.class, "thresholdLY", "t");
2348                x.aliasAttribute(SourceBasedFleetManager.class, "source", "s");
2349                x.aliasAttribute(SourceBasedFleetManager.class, "minFleets", "i");
2350                x.aliasAttribute(SourceBasedFleetManager.class, "maxFleets", "a");
2351                x.aliasAttribute(SourceBasedFleetManager.class, "respawnDelay", "r");
2352                x.aliasAttribute(SourceBasedFleetManager.class, "destroyed", "d");
2353                x.aliasAttribute(SourceBasedFleetManager.class, "sourceLocation", "sL");
2354
2355                x.alias("RemnantStationFleetManager", RemnantStationFleetManager.class);
2356                x.aliasAttribute(RemnantStationFleetManager.class, "minPts", "iA");
2357                x.aliasAttribute(RemnantStationFleetManager.class, "maxPts", "aA");
2358                x.aliasAttribute(RemnantStationFleetManager.class, "totalLost", "tL");
2359                
2360                x.alias("RemnantAssignmentAI", RemnantAssignmentAI.class);
2361                x.aliasAttribute(RemnantAssignmentAI.class, "homeSystem", "h");
2362                x.aliasAttribute(RemnantAssignmentAI.class, "fleet", "f");
2363                x.aliasAttribute(RemnantAssignmentAI.class, "source", "s");
2364
2365                
2366                x.alias("WarningBeaconEntityPlugin", WarningBeaconEntityPlugin.class);
2367                x.aliasAttribute(WarningBeaconEntityPlugin.class, "phase", "p");
2368                x.aliasAttribute(WarningBeaconEntityPlugin.class, "freqMult", "f");
2369                x.aliasAttribute(WarningBeaconEntityPlugin.class, "sincePing", "s");
2370                
2371                
2372                
2373                x.alias("RouteManager", RouteManager.class);
2374                x.aliasAttribute(RouteManager.class, "routes", "r");
2375                
2376                x.alias("RouteData", RouteData.class);
2377                x.aliasAttribute(RouteData.class, "extra", "x");
2378                x.aliasAttribute(RouteData.class, "delay", "a");
2379                x.aliasAttribute(RouteData.class, "source", "o");
2380                x.aliasAttribute(RouteData.class, "market", "m");
2381                x.aliasAttribute(RouteData.class, "seed", "s");
2382                x.aliasAttribute(RouteData.class, "timestamp", "t");
2383                x.aliasAttribute(RouteData.class, "segments", "e");
2384                x.aliasAttribute(RouteData.class, "activeFleet", "f");
2385                x.aliasAttribute(RouteData.class, "daysSinceSeenByPlayer", "d");
2386                x.aliasAttribute(RouteData.class, "custom", "c");
2387                x.aliasAttribute(RouteData.class, "current", "r");
2388                x.aliasAttribute(RouteData.class, "spawner", "p");
2389                
2390                x.alias("RouteFleetSpawner", RouteFleetSpawner.class);
2391                
2392                x.alias("BaseRouteFleetManager", BaseRouteFleetManager.class);
2393                x.aliasAttribute(BaseRouteFleetManager.class, "interval", "i");
2394                x.alias("RuinsFleetRouteManager", RuinsFleetRouteManager.class);
2395                x.aliasAttribute(RuinsFleetRouteManager.class, "system", "s");
2396                //x.aliasAttribute(RuinsFleetRouteManager.class, "interval", "i");
2397
2398                
2399                x.alias("BaseAssignmentAI", BaseAssignmentAI.class);
2400                x.aliasAttribute(BaseAssignmentAI.class, "capTracker", "cT");
2401                x.aliasAttribute(BaseAssignmentAI.class, "buildTracker", "bT");
2402                
2403                x.alias("RouteFleetAssignmentAI", RouteFleetAssignmentAI.class);
2404                x.aliasAttribute(RouteFleetAssignmentAI.class, "gaveReturnAssignments", "gRA");
2405                
2406                x.alias("ScavengerFleetAssignmentAI", ScavengerFleetAssignmentAI.class);
2407                x.alias("DistressCallNormalAssignmentAI", DistressCallNormalAssignmentAI.class);
2408                x.alias("DistressCallPirateAmbushAssignmentAI", DistressCallPirateAmbushAssignmentAI.class);
2409                x.alias("DistressCallPirateAmbushTrapAssignmentAI", DistressCallPirateAmbushTrapAssignmentAI.class);
2410                x.alias("DistressCallResponsePirateAssignmentAI", DistressCallResponsePirateAssignmentAI.class);
2411                x.alias("DistressCallResponseAssignmentAI", DistressCallResponseAssignmentAI.class);
2412                x.alias("TutorialLeashAssignmentAI", TutorialLeashAssignmentAI.class);
2413                
2414                x.alias("DistressResponseData", DistressResponseData.class);
2415                x.alias("NESpawnData", NESpawnData.class);
2416                
2417                x.alias("OptionalFleetData", OptionalFleetData.class);
2418                x.aliasAttribute(OptionalFleetData.class, "strength", "s");
2419                x.aliasAttribute(OptionalFleetData.class, "quality", "q");
2420                x.aliasAttribute(OptionalFleetData.class, "factionId", "f");
2421                x.aliasAttribute(OptionalFleetData.class, "fleetType", "t");
2422                x.aliasAttribute(OptionalFleetData.class, "damage", "d");
2423                
2424                
2425                x.aliasAttribute(BaseAssignmentAI.class, "fleet", "f");
2426                x.aliasAttribute(BaseAssignmentAI.class, "done", "d");
2427                //x.aliasAttribute(BaseAssignmentAI.class, "giveInitial", "gI");
2428                x.aliasAttribute(RouteFleetAssignmentAI.class, "route", "r");
2429                x.aliasAttribute(ScavengerFleetAssignmentAI.class, "pirate", "p");
2430                x.aliasAttribute(ScavengerFleetAssignmentAI.class, "piracyCheck", "pC");
2431                
2432                x.aliasAttribute(DistressCallNormalAssignmentAI.class, "system", "s");
2433                x.aliasAttribute(DistressCallNormalAssignmentAI.class, "jumpPoint", "jP");
2434                x.aliasAttribute(DistressCallNormalAssignmentAI.class, "elapsed", "e");
2435                x.aliasAttribute(DistressCallNormalAssignmentAI.class, "dur", "dur");
2436                x.aliasAttribute(DistressCallNormalAssignmentAI.class, "contactedPlayer", "cP");
2437                
2438                x.aliasAttribute(DistressCallPirateAmbushAssignmentAI.class, "system", "s");
2439                x.aliasAttribute(DistressCallPirateAmbushAssignmentAI.class, "jumpPoint", "jP");
2440                x.aliasAttribute(DistressCallPirateAmbushAssignmentAI.class, "elapsed", "e");
2441                x.aliasAttribute(DistressCallPirateAmbushAssignmentAI.class, "dur", "dur");
2442                
2443                x.aliasAttribute(DistressCallPirateAmbushTrapAssignmentAI.class, "system", "s");
2444                x.aliasAttribute(DistressCallPirateAmbushTrapAssignmentAI.class, "jumpPoint", "jP");
2445                x.aliasAttribute(DistressCallPirateAmbushTrapAssignmentAI.class, "elapsed", "e");
2446                x.aliasAttribute(DistressCallPirateAmbushTrapAssignmentAI.class, "dur", "dur");
2447                
2448                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "system", "s");
2449                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "elapsed", "e");
2450                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "dur", "dur");
2451                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "contactedPlayer", "cP");
2452                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "inner", "i");
2453                x.aliasAttribute(DistressCallResponsePirateAssignmentAI.class, "outer", "o");
2454                
2455                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "system", "s");
2456                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "elapsed", "e");
2457                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "dur", "dur");
2458                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "contactedPlayer", "cP");
2459                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "inner", "i");
2460                x.aliasAttribute(DistressCallResponseAssignmentAI.class, "outer", "o");
2461                
2462                x.aliasAttribute(TutorialLeashAssignmentAI.class, "system", "s");
2463                x.aliasAttribute(TutorialLeashAssignmentAI.class, "jumpPoint", "jP");
2464                x.aliasAttribute(TutorialLeashAssignmentAI.class, "elapsed", "e");
2465                x.aliasAttribute(TutorialLeashAssignmentAI.class, "dur", "dur");
2466                x.aliasAttribute(TutorialLeashAssignmentAI.class, "toGuard", "tG");
2467                
2468                
2469                x.alias("RtSeg", RouteSegment.class);
2470                x.aliasAttribute(RouteSegment.class, "id", "i");
2471                x.aliasAttribute(RouteSegment.class, "elapsed", "e");
2472                x.aliasAttribute(RouteSegment.class, "daysMax", "d");
2473                x.aliasAttribute(RouteSegment.class, "from", "f");
2474                x.aliasAttribute(RouteSegment.class, "to", "t");
2475                
2476//              x.alias("RPt", RoutePoint.class);
2477//              x.aliasAttribute(RoutePoint.class, "x", "x");
2478//              x.aliasAttribute(RoutePoint.class, "y", "y");
2479//              x.aliasAttribute(RoutePoint.class, "system", "s");
2480                
2481//              x.aliasAttribute(RouteSegment.class, "systemFrom", "sF");
2482//              x.aliasAttribute(RouteSegment.class, "systemTo", "sT");
2483//              x.aliasAttribute(RouteSegment.class, "custom", "c");
2484//              x.aliasAttribute(RouteSegment.class, "entityFrom", "eF");
2485//              x.aliasAttribute(RouteSegment.class, "entityTo", "eT");
2486                //x.aliasAttribute(RouteSegment.class, "vectorLocation", "vL");
2487                
2488
2489                
2490                x.alias("TowCable", TowCable.class);
2491                x.alias("TowCableBuff", TowCableBuff.class);
2492                x.aliasAttribute(TowCableBuff.class, "buffId", "b");
2493                x.aliasAttribute(TowCableBuff.class, "frames", "f");
2494                
2495                x.alias("TowCable", TowCable.class);
2496                
2497                x.alias("BaseEventPlugin", BaseEventPlugin.class);
2498                x.aliasAttribute(BaseEventPlugin.class, "id", "id");
2499                x.aliasAttribute(BaseEventPlugin.class, "eventType", "eTp");
2500                x.aliasAttribute(BaseEventPlugin.class, "eventTarget", "eTg");
2501                x.aliasAttribute(BaseEventPlugin.class, "market", "mk");
2502                x.aliasAttribute(BaseEventPlugin.class, "entity", "en");
2503                x.aliasAttribute(BaseEventPlugin.class, "faction", "fa");
2504                x.aliasAttribute(BaseEventPlugin.class, "statModId", "sMI");
2505                x.aliasAttribute(BaseEventPlugin.class, "started", "st");
2506                x.aliasAttribute(BaseEventPlugin.class, "memory", "mem");
2507                x.aliasAttribute(BaseEventPlugin.class, "startProbability", "sP");
2508                
2509
2510                x.alias("MissionCompletionRep", MissionCompletionRep.class);
2511                x.aliasAttribute(MissionCompletionRep.class, "successDelta", "sD");
2512                x.aliasAttribute(MissionCompletionRep.class, "successLimit", "sL");
2513                x.aliasAttribute(MissionCompletionRep.class, "failureDelta", "fD");
2514                x.aliasAttribute(MissionCompletionRep.class, "failureLimit", "fL");
2515                
2516                x.alias("NearbyEventsEvent", NearbyEventsEvent.class);
2517                x.aliasAttribute(NearbyEventsEvent.class, "derelictShipInterval", "dSI");
2518                x.aliasAttribute(NearbyEventsEvent.class, "distressCallInterval", "dCI");
2519                x.aliasAttribute(NearbyEventsEvent.class, "skipForDistressCalls", "sFDC");
2520                
2521                x.alias("CargoPodsEntityPlugin", CargoPodsEntityPlugin.class);
2522                x.aliasAttribute(CargoPodsEntityPlugin.class, "elapsed", "el");
2523                x.aliasAttribute(CargoPodsEntityPlugin.class, "maxDays", "mD");
2524                x.aliasAttribute(CargoPodsEntityPlugin.class, "extraDays", "eD");
2525                x.aliasAttribute(CargoPodsEntityPlugin.class, "neverExpire", "nE");
2526                
2527                
2528                x.alias("DistressCallAbility", DistressCallAbility.class);
2529                x.aliasAttribute(DistressCallAbility.class, "performed", "p");
2530                x.aliasAttribute(DistressCallAbility.class, "numTimesUsed", "nTU");
2531                x.aliasAttribute(DistressCallAbility.class, "lastUsed", "lU");
2532                x.aliasAttribute(DistressCallAbility.class, "uses", "u");
2533                
2534                x.alias("AbilityUseData", AbilityUseData.class);
2535                x.aliasAttribute(AbilityUseData.class, "timestamp", "t");
2536                x.aliasAttribute(AbilityUseData.class, "location", "l");
2537
2538                x.alias("DistressCallOutcome", DistressCallOutcome.class);
2539                
2540                x.alias("DelayedActionScript", DelayedActionScript.class);
2541                x.aliasAttribute(DelayedActionScript.class, "daysLeft", "dL");
2542                x.aliasAttribute(DelayedActionScript.class, "done", "d");
2543                
2544                
2545                x.alias("GalatiaMarketScript", GalatiaMarketScript.class);
2546                x.aliasAttribute(GalatiaMarketScript.class, "market", "m");
2547                x.aliasAttribute(GalatiaMarketScript.class, "interval", "i");
2548                
2549                
2550                x.alias("CampaignTutorialStage", CampaignTutorialStage.class);
2551                
2552                x.alias("CampaignTutorialScript", CampaignTutorialScript.class);
2553                x.aliasAttribute(CampaignTutorialScript.class, "askedPlayerToSave", "aPTS");
2554                x.aliasAttribute(CampaignTutorialScript.class, "playerSaved", "pS");
2555                x.aliasAttribute(CampaignTutorialScript.class, "elapsed", "e");
2556                x.aliasAttribute(CampaignTutorialScript.class, "lastCheckDistToAncyra", "lCDTA");
2557                x.aliasAttribute(CampaignTutorialScript.class, "system", "s");
2558                x.aliasAttribute(CampaignTutorialScript.class, "ancyra", "a");
2559                x.aliasAttribute(CampaignTutorialScript.class, "derinkuyu", "d");
2560                x.aliasAttribute(CampaignTutorialScript.class, "stage", "st");
2561                x.aliasAttribute(CampaignTutorialScript.class, "orbitalResetDone", "oRD");
2562                x.aliasAttribute(CampaignTutorialScript.class, "debrisField", "dF");
2563                x.aliasAttribute(CampaignTutorialScript.class, "pirateFleet", "pF");
2564                x.aliasAttribute(CampaignTutorialScript.class, "detachment", "det");
2565                x.aliasAttribute(CampaignTutorialScript.class, "intel", "i");
2566                
2567                
2568                x.alias("TutorialMissionIntel", TutorialMissionIntel.class);
2569                x.alias("TutorialMissionStage", TutorialMissionStage.class);
2570
2571                
2572                x.alias("RogueMinerMiscFleetManager", RogueMinerMiscFleetManager.class);
2573                x.alias("SaveNagScript", SaveNagScript.class);
2574                
2575                
2576                x.alias("ExSalv", ExtraSalvage.class);
2577                x.aliasAttribute(ExtraSalvage.class, "cargo", "c");
2578                
2579                x.alias("SpID", SpecialItemData.class);
2580                x.aliasAttribute(SpecialItemData.class, "id", "i");
2581                x.aliasAttribute(SpecialItemData.class, "data", "d");
2582                
2583                
2584                x.alias("BaseGenericPlugin", BaseGenericPlugin.class);
2585                x.alias("SalvageDefenderModificationPluginImpl", SalvageDefenderModificationPluginImpl.class);
2586                x.alias("PKDefenderPluginImpl", PKDefenderPluginImpl.class);
2587                
2588                x.alias("CampaignPingSpec", CampaignPingSpec.class);
2589                x.aliasAttribute(CampaignPingSpec.class, "id", "id");
2590                x.aliasAttribute(CampaignPingSpec.class, "sounds", "s");
2591                x.aliasAttribute(CampaignPingSpec.class, "color", "c");
2592                x.aliasAttribute(CampaignPingSpec.class, "minRange", "mR");
2593                x.aliasAttribute(CampaignPingSpec.class, "range", "r");
2594                x.aliasAttribute(CampaignPingSpec.class, "duration", "d");
2595                x.aliasAttribute(CampaignPingSpec.class, "delay", "de");
2596                x.aliasAttribute(CampaignPingSpec.class, "width", "w");
2597                x.aliasAttribute(CampaignPingSpec.class, "alphaMult", "aM");
2598                x.aliasAttribute(CampaignPingSpec.class, "inFraction", "iF");
2599                x.aliasAttribute(CampaignPingSpec.class, "useFactionColor", "uFC");
2600                x.aliasAttribute(CampaignPingSpec.class, "invert", "i");
2601                x.aliasAttribute(CampaignPingSpec.class, "num", "n");
2602                
2603                
2604//              <c cl="com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetFleetAssignmentAI$EconomyRouteData" z="7570">
2605//              <cargoCap>3220.0</cargoCap>
2606//              <fuelCap>1685.0</fuelCap>
2607//              <personnelCap>485.0</personnelCap>
2608//              <size>6.0</size>
2609//              <smuggling>false</smuggling>
2610//              <from cl="Market" ref="435"></from>
2611//              <to cl="Market" ref="410"></to>
2612//              <cargoDeliver z="7571">
2613//              <com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetFleetAssignmentAI_-CargoQuantityData z="7572">
2614//              <cargo>organics</cargo>
2615//              <units>5</units>
2616//              </com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetFleetAssignmentAI_-CargoQuantityData>
2617                x.alias("ERDat", EconomyRouteData.class);
2618                x.aliasAttribute(EconomyRouteData.class, "cargoCap", "c");
2619                x.aliasAttribute(EconomyRouteData.class, "fuelCap", "f");
2620                x.aliasAttribute(EconomyRouteData.class, "personnelCap", "p");
2621                x.aliasAttribute(EconomyRouteData.class, "size", "s");
2622                x.aliasAttribute(EconomyRouteData.class, "smuggling", "m");
2623                x.aliasAttribute(EconomyRouteData.class, "from", "r");
2624                x.aliasAttribute(EconomyRouteData.class, "to", "t");
2625                x.aliasAttribute(EconomyRouteData.class, "cargoDeliver", "d");
2626                x.aliasAttribute(EconomyRouteData.class, "cargoReturn", "u");
2627                
2628                
2629                x.alias("CQD", CargoQuantityData.class);
2630                x.aliasAttribute(CargoQuantityData.class, "cargo", "c");
2631                x.aliasAttribute(CargoQuantityData.class, "units", "u");
2632                
2633                
2634                x.alias("CommRelayEP", CommRelayEntityPlugin.class);
2635                x.alias("NavBuoyEP", NavBuoyEntityPlugin.class);
2636                x.alias("SensorArrayEP", SensorArrayEntityPlugin.class);
2637                
2638                x.alias("PopulationAndInfrastructure", PopulationAndInfrastructure.class);
2639                x.aliasAttribute(BaseIndustry.class, "supply", "s");
2640                x.aliasAttribute(BaseIndustry.class, "demand", "d");
2641                x.aliasAttribute(BaseIndustry.class, "income", "i");
2642                x.aliasAttribute(BaseIndustry.class, "upkeep", "u");
2643                x.aliasAttribute(BaseIndustry.class, "market", "m");
2644                x.aliasAttribute(BaseIndustry.class, "id", "id");
2645                x.aliasAttribute(BaseIndustry.class, "buildProgress", "bP");
2646                x.aliasAttribute(BaseIndustry.class, "building", "b");
2647                x.aliasAttribute(BaseIndustry.class, "upgradeId", "uI");
2648                x.aliasAttribute(BaseIndustry.class, "aiCoreId", "aCI");
2649                x.aliasAttribute(BaseIndustry.class, "demandReduction", "dR");
2650                x.aliasAttribute(BaseIndustry.class, "supplyBonus", "sB");
2651                x.aliasAttribute(BaseIndustry.class, "wasDisrupted", "wD");
2652                
2653                
2654                x.alias("DFInfl", DefaultFleetInflater.class);
2655                x.alias("DFInflP", DefaultFleetInflaterParams.class);
2656                x.aliasAttribute(DefaultFleetInflaterParams.class, "seed", "s");
2657                x.aliasAttribute(DefaultFleetInflaterParams.class, "timestamp", "t");
2658                x.aliasAttribute(DefaultFleetInflaterParams.class, "persistent", "p");
2659                x.aliasAttribute(DefaultFleetInflaterParams.class, "quality", "q");
2660                x.aliasAttribute(DefaultFleetInflaterParams.class, "mode", "m");
2661                
2662                
2663                x.alias("MilRespScr", MilitaryResponseScript.class);
2664                x.aliasAttribute(MilitaryResponseScript.class, "tracker", "t");
2665                x.aliasAttribute(MilitaryResponseScript.class, "params", "p");
2666                x.aliasAttribute(MilitaryResponseScript.class, "elapsed", "e");
2667                
2668                
2669                x.alias("MilRespP", MilitaryResponseParams.class);
2670                x.aliasAttribute(MilitaryResponseParams.class, "type", "t");
2671                x.aliasAttribute(MilitaryResponseParams.class, "responseReason", "rR");
2672                x.aliasAttribute(MilitaryResponseParams.class, "faction", "f");
2673                x.aliasAttribute(MilitaryResponseParams.class, "actor", "a");
2674                x.aliasAttribute(MilitaryResponseParams.class, "target", "t");
2675                x.aliasAttribute(MilitaryResponseParams.class, "responseFraction", "rF");
2676                x.aliasAttribute(MilitaryResponseParams.class, "responseDuration", "rD");
2677                x.aliasAttribute(MilitaryResponseParams.class, "travelText", "tT");
2678                x.aliasAttribute(MilitaryResponseParams.class, "actionText", "aT");
2679                
2680                x.alias("BaseMarketConditionPlugin", BaseMarketConditionPlugin.class);
2681                x.aliasAttribute(BaseMarketConditionPlugin.class, "market", "m");
2682                x.aliasAttribute(BaseMarketConditionPlugin.class, "condition", "c");
2683                
2684                x.alias("ResourceDepositsMC", ResourceDepositsCondition.class);
2685                
2686                
2687                
2688                x.alias("LuddicPathCells", LuddicPathCells.class);
2689                x.aliasAttribute(LuddicPathCells.class, "intel", "i");
2690                
2691                x.alias("LuddicPathCellsIntel", LuddicPathCellsIntel.class);
2692                x.aliasAttribute(LuddicPathCellsIntel.class, "sleeper", "s");
2693                x.aliasAttribute(LuddicPathCellsIntel.class, "sleeperTimeout", "sT");
2694                x.aliasAttribute(LuddicPathCellsIntel.class, "market", "m");
2695                x.aliasAttribute(LuddicPathCellsIntel.class, "incidentTracker", "iT");
2696                x.aliasAttribute(LuddicPathCellsIntel.class, "random", "r");
2697                x.aliasAttribute(LuddicPathCellsIntel.class, "numIncidentAttempts", "nIA");
2698                x.aliasAttribute(LuddicPathCellsIntel.class, "incidentDelay", "iD");
2699                x.aliasAttribute(LuddicPathCellsIntel.class, "incidentType", "iTy");
2700                x.aliasAttribute(LuddicPathCellsIntel.class, "smuggler", "sm");
2701                x.aliasAttribute(LuddicPathCellsIntel.class, "prevIncident", "pI");
2702                x.aliasAttribute(LuddicPathCellsIntel.class, "sincePrevIncident", "sPI");
2703                x.aliasAttribute(LuddicPathCellsIntel.class, "prevIncidentData", "pID");
2704                x.aliasAttribute(LuddicPathCellsIntel.class, "inertiaTime", "iTi");
2705                
2706                
2707                
2708                x.alias("Spaceport", Spaceport.class);
2709                x.alias("Mining", Mining.class);
2710                x.alias("GroundDefenses", GroundDefenses.class);
2711                x.alias("Refining", Refining.class);
2712                x.alias("MilitaryBase", MilitaryBase.class);
2713                x.alias("Farming", Farming.class);
2714                x.alias("LightIndustry", LightIndustry.class);
2715                x.alias("FuelProduction", FuelProduction.class);
2716                x.alias("HeavyIndustry", HeavyIndustry.class);
2717                x.alias("PlanetaryShield", PlanetaryShield.class);
2718                x.alias("TechMining", TechMining.class);
2719                x.alias("TradeCenter", TradeCenter.class);
2720                x.alias("LionsGuardHQ", LionsGuardHQ.class);
2721                x.alias("Waystation", Waystation.class);
2722                x.alias("Cryosanctum", Cryosanctum.class);
2723                x.alias("Cryorevival", Cryorevival.class);
2724                x.alias("TradeCenter2", com.fs.starfarer.api.impl.campaign.econ.impl.TradeCenter.class);
2725                
2726                x.alias("OrbitalStation", OrbitalStation.class);
2727                x.aliasAttribute(OrbitalStation.class, "stationFleet", "sF");
2728                x.aliasAttribute(OrbitalStation.class, "usingExistingStation", "uES");
2729                x.aliasAttribute(OrbitalStation.class, "stationEntity", "sE");
2730                
2731                
2732                x.alias("EconomyFleetAssignmentAI", EconomyFleetAssignmentAI.class);
2733                x.aliasAttribute(EconomyFleetAssignmentAI.class, "origFaction", "oF");
2734                x.aliasAttribute(EconomyFleetAssignmentAI.class, "factionChangeTracker", "fCT");
2735                
2736                x.alias("MercAssignmentAIV2", MercAssignmentAIV2.class);
2737                x.alias("PatrolAssignmentAIV4", PatrolAssignmentAIV4.class);
2738                x.alias("DisposableAggroAssignmentAI", DisposableAggroAssignmentAI.class);
2739                
2740                x.alias("DisposableFleetManager", DisposableFleetManager.class);
2741                x.alias("DisposablePirateFleetManager", DisposablePirateFleetManager.class);
2742                x.alias("DisposableLuddicPathFleetManager", DisposableLuddicPathFleetManager.class);
2743                
2744                
2745                x.alias("PirateBaseIntel", PirateBaseIntel.class);
2746                x.aliasAttribute(PirateBaseIntel.class, "system", "s");
2747                x.aliasAttribute(PirateBaseIntel.class, "market", "m");
2748                x.aliasAttribute(PirateBaseIntel.class, "entity", "e");
2749                x.aliasAttribute(PirateBaseIntel.class, "elapsedDays", "eD");
2750                x.aliasAttribute(PirateBaseIntel.class, "duration", "d");
2751                x.aliasAttribute(PirateBaseIntel.class, "bountyData", "bD");
2752                x.aliasAttribute(PirateBaseIntel.class, "tier", "t");
2753                x.aliasAttribute(PirateBaseIntel.class, "matchedStationToTier", "mSTT");
2754                x.aliasAttribute(PirateBaseIntel.class, "monthlyInterval", "mI");
2755                x.aliasAttribute(PirateBaseIntel.class, "raidTimeoutMonths", "rTM");
2756                
2757                x.alias("BaseBountyData", BaseBountyData.class);
2758                x.aliasAttribute(BaseBountyData.class, "bountyElapsedDays", "bED");
2759                x.aliasAttribute(BaseBountyData.class, "bountyDuration", "bD");
2760                x.aliasAttribute(BaseBountyData.class, "baseBounty", "bB");
2761                x.aliasAttribute(BaseBountyData.class, "repChange", "rC");
2762                x.aliasAttribute(BaseBountyData.class, "bountyFaction", "bF");
2763                
2764                
2765                x.alias("LuddicPathBaseIntel", LuddicPathBaseIntel.class);
2766                x.aliasAttribute(LuddicPathBaseIntel.class, "system", "s");
2767                x.aliasAttribute(LuddicPathBaseIntel.class, "market", "m");
2768                x.aliasAttribute(LuddicPathBaseIntel.class, "entity", "e");
2769                x.aliasAttribute(LuddicPathBaseIntel.class, "elapsedDays", "eD");
2770                x.aliasAttribute(LuddicPathBaseIntel.class, "duration", "d");
2771                x.aliasAttribute(LuddicPathBaseIntel.class, "bountyData", "bD");
2772                x.aliasAttribute(LuddicPathBaseIntel.class, "monthlyInterval", "mI");
2773                x.aliasAttribute(LuddicPathBaseIntel.class, "monthsNoBounty", "mNB");
2774                x.aliasAttribute(LuddicPathBaseIntel.class, "large", "l");
2775                x.aliasAttribute(LuddicPathBaseIntel.class, "random", "r");
2776                
2777                
2778                x.alias("PirateActivity", PirateActivity.class);
2779                x.aliasAttribute(PirateActivity.class, "intel", "i");
2780                
2781                x.alias("PirateActivityIntel", PirateActivityIntel.class);
2782                x.aliasAttribute(PirateActivityIntel.class, "system", "sy");
2783                x.aliasAttribute(PirateActivityIntel.class, "source", "so");
2784                
2785                
2786                x.alias("LocalResourcesSubmarketPlugin", LocalResourcesSubmarketPlugin.class);
2787                x.alias("CryosleeperEntityPlugin", CryosleeperEntityPlugin.class);
2788                
2789                x.alias("BaseIntelPlugin", BaseIntelPlugin.class);
2790                x.aliasAttribute(BaseIntelPlugin.class, "important", "ii");
2791                x.aliasAttribute(BaseIntelPlugin.class, "timestamp", "tt");
2792                x.aliasAttribute(BaseIntelPlugin.class, "neverClicked", "nC");
2793                x.aliasAttribute(BaseIntelPlugin.class, "ended", "ended");
2794                x.aliasAttribute(BaseIntelPlugin.class, "ending", "ending");
2795                x.aliasAttribute(BaseIntelPlugin.class, "endingTimeRemaining", "eTR");
2796                x.aliasAttribute(BaseIntelPlugin.class, "postingLocation", "pLoc");
2797                x.aliasAttribute(BaseIntelPlugin.class, "postingRangeLY", "pRange");
2798                
2799                x.alias("BaseMissionIntel", BaseMissionIntel.class);
2800                x.aliasAttribute(BaseMissionIntel.class, "randomCancel", "rC");
2801                x.aliasAttribute(BaseMissionIntel.class, "randomCancelProb", "rCP");
2802                x.aliasAttribute(BaseMissionIntel.class, "missionResult", "mR");
2803                x.aliasAttribute(BaseMissionIntel.class, "missionState", "mS");
2804                x.aliasAttribute(BaseMissionIntel.class, "duration", "dur");
2805                x.aliasAttribute(BaseMissionIntel.class, "elapsedDays", "eD");
2806                
2807                x.alias("MissionResult", MissionResult.class);
2808                
2809                
2810                
2811                x.alias("PersonBountyIntel", PersonBountyIntel.class);
2812                x.alias("SystemBountyIntel", SystemBountyIntel.class);
2813                x.alias("TradeFleetDepartureIntel", TradeFleetDepartureIntel.class);
2814                x.alias("FactionHostilityIntel", FactionHostilityIntel.class);
2815                x.alias("ProcurementMissionIntel", ProcurementMissionIntel.class);
2816                x.alias("SurveyPlanetMissionIntel", SurveyPlanetMissionIntel.class);
2817                x.alias("AnalyzeEntityMissionIntel", AnalyzeEntityMissionIntel.class);
2818                x.alias("ProcurementMissionCreator", ProcurementMissionCreator.class);
2819                x.alias("AnalyzeEntityIntelCreator", AnalyzeEntityIntelCreator.class);
2820                x.alias("SurveyPlanetIntelCreator", SurveyPlanetIntelCreator.class);
2821                
2822                
2823                x.alias("DeliveryMissionIntel", DeliveryMissionIntel.class);
2824                x.alias("CoreDiscoverEntityPlugin", CoreDiscoverEntityPlugin.class);
2825                x.alias("CoreBuildObjectiveTypePicker", CoreBuildObjectiveTypePicker.class);
2826                
2827                x.alias("MonthlyReport", MonthlyReport.class);
2828                x.alias("FDNode", FDNode.class);
2829                x.aliasAttribute(FDNode.class, "children", "c");
2830                x.aliasAttribute(FDNode.class, "parent", "p");
2831                x.aliasAttribute(FDNode.class, "name", "n");
2832                x.aliasAttribute(FDNode.class, "icon", "i");
2833                x.aliasAttribute(FDNode.class, "income", "in");
2834                x.aliasAttribute(FDNode.class, "upkeep", "up");
2835                x.aliasAttribute(FDNode.class, "totalIncome", "tI");
2836                x.aliasAttribute(FDNode.class, "totalUpkeep", "tU");
2837                x.aliasAttribute(FDNode.class, "custom", "c1");
2838                x.aliasAttribute(FDNode.class, "custom2", "c2");
2839                x.aliasAttribute(FDNode.class, "mapEntity", "mE");
2840                x.aliasAttribute(FDNode.class, "tooltipCreator", "tC");
2841                x.aliasAttribute(FDNode.class, "tooltipParam", "tP");
2842                
2843                x.alias("MonthlyReportNodeTooltipCreator", MonthlyReportNodeTooltipCreator.class);
2844                x.alias("GalatianAcademyStipend", GalatianAcademyStipend.class);
2845                x.alias("WarSimScript", WarSimScript.class);
2846                x.alias("PersonBountyManager", PersonBountyManager.class);
2847                x.alias("SystemBountyManager", SystemBountyManager.class);
2848                x.alias("PirateBaseManager", PirateBaseManager.class);
2849                x.alias("PlayerRelatedPirateBaseManager", PlayerRelatedPirateBaseManager.class);
2850                x.alias("LuddicPathBaseManager", LuddicPathBaseManager.class);
2851                x.alias("HegemonyInspectionManager", HegemonyInspectionManager.class);
2852                x.alias("DecivTracker", DecivTracker.class);
2853                x.alias("MarketDecivData", MarketDecivData.class);
2854                x.aliasAttribute(MarketDecivData.class, "market", "m");
2855                x.aliasAttribute(MarketDecivData.class, "stabilityHistory", "sH");
2856                
2857                
2858                x.alias("FactionHostilityManager", FactionHostilityManager.class);
2859                x.alias("FactionHostilityIntel", FactionHostilityIntel.class);
2860                x.alias("GenericMissionManager", GenericMissionManager.class);
2861                
2862                
2863                
2864                
2865                x.alias("PortsideBarData", PortsideBarData.class);
2866                x.alias("BarEventManager", BarEventManager.class);
2867                
2868                x.alias("PirateBaseRumorBarEvent", PirateBaseRumorBarEvent.class);
2869                
2870                x.alias("LuddicFarmerBarEvent", LuddicFarmerBarEvent.class);
2871                x.alias("LuddicFarmerBarEventCreator", LuddicFarmerBarEventCreator.class);
2872                
2873                x.alias("TriTachLoanBarEvent", TriTachLoanBarEvent.class);
2874                x.alias("TriTachLoanBarEventCreator", TriTachLoanBarEventCreator.class);
2875                
2876                x.alias("MercsOnTheRunBarEvent", MercsOnTheRunBarEvent.class);
2877                x.alias("MercsOnTheRunBarEventCreator", MercsOnTheRunBarEventCreator.class);
2878                
2879                x.alias("LuddicCraftBarEvent", LuddicCraftBarEvent.class);
2880                x.alias("LuddicCraftBarEventCreator", LuddicCraftBarEventCreator.class);
2881                
2882                x.alias("ScientistAICoreBarEvent", ScientistAICoreBarEvent.class);
2883                x.alias("ScientistAICoreBarEventCreator", ScientistAICoreBarEventCreator.class);
2884                
2885                x.alias("QuartermasterCargoSwapBarEvent", QuartermasterCargoSwapBarEvent.class);
2886                x.alias("QuartermasterCargoSwapBarEventCreator", QuartermasterCargoSwapBarEventCreator.class);
2887                
2888                x.alias("CorruptPLClerkSuppliesBarEvent", CorruptPLClerkSuppliesBarEvent.class);
2889                x.alias("CorruptPLClerkSuppliesBarEventCreator", CorruptPLClerkSuppliesBarEventCreator.class);
2890                
2891                x.alias("DiktatLobsterBarEvent", DiktatLobsterBarEvent.class);
2892                x.alias("DiktatLobsterBarEventCreator", DiktatLobsterBarEventCreator.class);
2893                
2894                x.alias("DeliveryBarEvent", DeliveryBarEvent.class);
2895                x.alias("DeliveryBarEventCreator", DeliveryBarEventCreator.class);
2896                
2897                x.alias("TriTachMajorLoanBarEvent", TriTachMajorLoanBarEvent.class);
2898                x.alias("TriTachMajorLoanBarEventCreator", TriTachMajorLoanBarEventCreator.class);
2899                
2900                x.alias("TriTachLoanIncentiveScript", TriTachLoanIncentiveScript.class);
2901                x.alias("DeliveryFailureConsequences", DeliveryFailureConsequences.class);
2902                
2903                
2904                x.alias("EconomyFleetRouteManager", EconomyFleetRouteManager.class);
2905                x.alias("ShippingDisruption", ShippingDisruption.class);
2906                
2907                
2908                x.alias("DistressCallIntel", DistressCallIntel.class);
2909                x.alias("HyperStormBoost", HyperStormBoost.class);
2910                x.alias("AsteroidImpact", AsteroidImpact.class);
2911                
2912                x.alias("CoronalTapParticleScript", CoronalTapParticleScript.class);
2913                x.alias("CargoPodsResponse", CargoPodsResponse.class);
2914                
2915                
2916                x.alias("GateData", GateData.class);
2917                x.alias("GateEntityPlugin", GateEntityPlugin.class);
2918                x.aliasAttribute(GateEntityPlugin.class, "beingUsedFader", "bUF");
2919                x.aliasAttribute(GateEntityPlugin.class, "glowFader", "gF");
2920                x.aliasAttribute(GateEntityPlugin.class, "madeActive", "mA");
2921                x.aliasAttribute(GateEntityPlugin.class, "addedIntel", "aI");
2922                x.aliasAttribute(GateEntityPlugin.class, "showBeingUsedDur", "sBUD");
2923                x.aliasAttribute(GateEntityPlugin.class, "accumulatedTransitDistLY", "aTDLY");
2924                x.aliasAttribute(GateEntityPlugin.class, "inUseAngle", "iUA");
2925
2926                x.alias("BaseMissionHub", BaseMissionHub.class);
2927                x.aliasAttribute(BaseMissionHub.class, "timeout", "to");
2928                x.aliasAttribute(BaseMissionHub.class, "recentlyAcceptedTimeout", "rAT");
2929                x.aliasAttribute(BaseMissionHub.class, "creators", "cr");
2930                x.aliasAttribute(BaseMissionHub.class, "person", "p");
2931                x.aliasAttribute(BaseMissionHub.class, "seed", "seed");
2932                x.aliasAttribute(BaseMissionHub.class, "lastUpdated", "lU");
2933                x.aliasAttribute(BaseMissionHub.class, "lastUpdatedSeeds", "lUS");
2934                x.aliasAttribute(BaseMissionHub.class, "daysSinceLastUpdate", "dSLU");
2935                
2936                x.alias("BaseHubMissionCreator", BaseHubMissionCreator.class);
2937                x.aliasAttribute(BaseHubMissionCreator.class, "numCompleted", "nC");
2938                x.aliasAttribute(BaseHubMissionCreator.class, "numFailed", "nF");
2939                x.aliasAttribute(BaseHubMissionCreator.class, "seed", "seed");
2940                x.aliasAttribute(BaseHubMissionCreator.class, "specId", "sId");
2941                x.aliasAttribute(BaseHubMissionCreator.class, "wasAutoAdded", "wA");
2942                x.aliasAttribute(BaseHubMissionCreator.class, "isActive", "iA");
2943                
2944                x.alias("BlueprintSpecialData", BlueprintSpecialData.class);
2945                x.alias("HubMissionWithTriggers", HubMissionWithTriggers.class);
2946                
2947                x.alias("BaseHubMission", BaseHubMission.class);
2948                x.alias("GateIntel", GateIntel.class);
2949                x.alias("BreadcrumbIntel", BreadcrumbIntel.class);
2950                x.alias("BreadcrumbIntelV2", BreadcrumbIntelV2.class);
2951                x.alias("WarningBeaconIntel", WarningBeaconIntel.class);
2952                x.alias("DelayedFleetEncounter", DelayedFleetEncounter.class);
2953                x.alias("MissionTrigger", MissionTrigger.class);
2954                x.alias("PunitiveExpeditionManager", PunitiveExpeditionManager.class);
2955                x.alias("PunExData", PunExData.class);
2956                x.alias("LuddicPathBaseBarEvent", LuddicPathBaseBarEvent.class);
2957                x.alias("HubMissionBarEventWrapper", HubMissionBarEventWrapper.class);
2958                x.alias("HistorianBarEvent", HistorianBarEvent.class);
2959                x.alias("RemnantNexusIntel", RemnantNexusIntel.class);
2960                x.alias("SalvorsTallyIntel", SalvorsTallyIntel.class);
2961                x.alias("CryosleeperIntel", CryosleeperIntel.class);
2962                x.alias("HypershuntIntel", HypershuntIntel.class);
2963                x.alias("SimUpdateIntel", SimUpdateIntel.class);
2964                x.alias("CargoPodsIntel", CargoPodsIntel.class);
2965                x.alias("WormholeIntel", WormholeIntel.class);
2966                
2967                x.alias("SpecBarEventCreator", SpecBarEventCreator.class);
2968                x.aliasAttribute(SpecBarEventCreator.class, "specId", "sId");
2969                x.aliasAttribute(SpecBarEventCreator.class, "wasAutoAdded", "wAA");
2970                
2971                x.alias("PlanetaryShieldBarEventCreator", PlanetaryShieldBarEventCreator.class);
2972                x.alias("HistorianBarEventCreator", HistorianBarEventCreator.class);
2973                
2974                x.alias("PLTextEntry", PLTextEntry.class);
2975                x.aliasAttribute(PLTextEntry.class, "text", "text");
2976                x.aliasAttribute(PLTextEntry.class, "timestamp", "ts");
2977                
2978                x.alias("PLStatLevel", PLStatLevel.class);
2979                x.alias("PLStatCredits", PLStatCredits.class);
2980                x.alias("PLStatFleet", PLStatFleet.class);
2981                x.alias("PLStatSupplies", PLStatSupplies.class);
2982                x.alias("PLStatFuel", PLStatFuel.class);
2983                x.alias("PLStatCargo", PLStatCargo.class);
2984                x.alias("PLStatCrew", PLStatCrew.class);
2985                x.alias("PLStatMarines", PLStatMarines.class);
2986                x.alias("PLStatColonies", PLStatColonies.class);
2987                x.alias("PlaythroughLog", PlaythroughLog.class);
2988                
2989                x.alias("BaseCustomBounty", BaseCustomBounty.class);
2990                x.alias("AggregateBountyData", AggregateBountyData.class);
2991                
2992                x.alias("HistorianData", HistorianData.class);
2993                x.alias("DonationOfferCreator", DonationOfferCreator.class);
2994                x.alias("ShipBlueprintOfferCreator", ShipBlueprintOfferCreator.class);
2995                x.alias("WeaponBlueprintOfferCreator", WeaponBlueprintOfferCreator.class);
2996                x.alias("FighterBlueprintOfferCreator", FighterBlueprintOfferCreator.class);
2997                x.alias("SpecialItemOfferCreator", SpecialItemOfferCreator.class);
2998                
2999                x.alias("StageConnection", StageConnection.class);
3000                x.alias("DecivIntel", DecivIntel.class);
3001                x.alias("PlayerFleetPersonnelTracker", PlayerFleetPersonnelTracker.class);
3002                x.alias("ContactIntel", ContactIntel.class);
3003                x.alias("ProductionReportIntel", ProductionReportIntel.class);
3004                x.alias("AdminData", AdminData.class);
3005                x.alias("FieldRepairsScript", FieldRepairsScript.class);
3006                x.alias("CommSnifferIntel", CommSnifferIntel.class);
3007                
3008                
3009                
3010                x.alias("PersonalFleetHoracioCaden", PersonalFleetHoracioCaden.class);
3011                x.alias("PersonalFleetOxanaHyder", PersonalFleetOxanaHyder.class);
3012                x.alias("MiscFleetRouteManager", MiscFleetRouteManager.class);
3013                x.alias("EncounterManager", EncounterManager.class);
3014                
3015                x.alias("AddedStream", AddedStream.class);
3016                x.aliasAttribute(AddedStream.class, "terrain", "tn");
3017                x.aliasAttribute(AddedStream.class, "plugin", "p");
3018                x.aliasAttribute(AddedStream.class, "from", "f");
3019                x.aliasAttribute(AddedStream.class, "to", "t");
3020                x.aliasAttribute(AddedStream.class, "control", "c");
3021                x.aliasAttribute(AddedStream.class, "timestamp", "ts");
3022                
3023                
3024                x.alias("FactionCommissionIntel", FactionCommissionIntel.class);
3025                x.alias("FCI-RepChangeData", RepChangeData.class);
3026                
3027                x.alias("WeaponBlueprintOffer", WeaponBlueprintOffer.class);
3028                x.alias("HostileActivityEventIntel", HostileActivityEventIntel.class);
3029                x.alias("ScientistAICoreIntel", ScientistAICoreIntel.class);
3030                x.alias("GAAtTheGates", GAAtTheGates.class);
3031                x.alias("GATransverseJump", GATransverseJump.class);
3032                x.alias("LuddicShrineIntel", LuddicShrineIntel.class);
3033                x.alias("HyperspaceTopographyEventIntel", LuddicShrineIntel.class);
3034                x.alias("DisposableHostileActivityFleetManager", DisposableHostileActivityFleetManager.class);
3035                
3036                x.alias("TopographicDataSpecialData", TopographicDataSpecialData.class);
3037                x.aliasAttribute(TopographicDataSpecialData.class, "points", "p");
3038                
3039                x.alias("ZigLeashAssignmentAI", ZigLeashAssignmentAI.class);
3040                x.alias("ZigFIDConfig", ZigFIDConfig.class);
3041                
3042                x.alias("ShipQuality", ShipQuality.class);
3043                
3044                x.alias("TriggerFleetAssignmentAI", TriggerFleetAssignmentAI.class);
3045                x.alias("MissionFleetAutoDespawn", MissionFleetAutoDespawn.class);
3046                x.alias("BHM-DefeatTriggerAdded", DefeatTriggerAdded.class);
3047                x.alias("BHM-MakeNonStoryCriticalAction", MakeNonStoryCriticalAction.class);
3048                x.alias("BHM-SetFleetFlagAction", SetFleetFlagAction.class);
3049                x.alias("BHM-StageData", StageData.class);
3050                x.alias("BHM-ImportanceData", ImportanceData.class);
3051                
3052                x.alias("BHM-VS", VariableSet.class);
3053                
3054                x.alias("BaseEventIntel", BaseEventIntel.class);
3055                
3056                x.alias("BEI-EventStageData", EventStageData.class);
3057//              x.aliasAttribute(EventStageData.class, "id", "");
3058//              x.aliasAttribute(EventStageData.class, "progress", "");
3059//              x.aliasAttribute(EventStageData.class, "isOneOffEvent", "");
3060//              x.aliasAttribute(EventStageData.class, "wasEverReached", "");
3061//              x.aliasAttribute(EventStageData.class, "isRepeatable", "");
3062//              x.aliasAttribute(EventStageData.class, "sendIntelUpdateOnReaching", "");
3063//              x.aliasAttribute(EventStageData.class, "hideIconWhenPastStageUnlessLastActive", "");
3064//              x.aliasAttribute(EventStageData.class, "keepIconBrightWhenLaterStageReached", "");
3065//              x.aliasAttribute(EventStageData.class, "iconSize", "");
3066//              x.aliasAttribute(EventStageData.class, "randomized", "");
3067//              x.aliasAttribute(EventStageData.class, "randomType", "");
3068//              x.aliasAttribute(EventStageData.class, "progressToResetAt", "");
3069//              x.aliasAttribute(EventStageData.class, "progressToRollAt", "");
3070//              x.aliasAttribute(EventStageData.class, "rollData", "");
3071                
3072                x.alias("OSGRec", OfficerSkillGainRecord.class);
3073                x.aliasAttribute(OfficerSkillGainRecord.class, "personId", "p");
3074                x.aliasAttribute(OfficerSkillGainRecord.class, "skillId", "s");
3075                x.aliasAttribute(OfficerSkillGainRecord.class, "elite", "e");
3076                
3077                x.alias("SModRec", SModRecord.class);
3078                x.aliasAttribute(SModRecord.class, "member", "m");
3079                x.aliasAttribute(SModRecord.class, "smods", "sm");
3080                x.aliasAttribute(SModRecord.class, "spSpent", "sp");
3081                x.aliasAttribute(SModRecord.class, "bonusXPFractionGained", "bxp");
3082                x.aliasAttribute(SModRecord.class, "timestamp", "ts");
3083
3084                
3085                x.alias("RouteFleetAssignmentAI", RouteFleetAssignmentAI.class);
3086                x.alias("RaidIntel", RaidIntel.class);
3087                x.alias("SlipstreamManager-StreamData", StreamData.class);
3088                
3089                
3090                //x.alias("AddedStream", AddedStream.class);
3091                //x.aliasAttribute(BaseHubMissionCreator.class, "", "");
3092                
3093        }
3094
3095//      // problem: adding a new field could break saves
3096//      public static void autoAlias(XStream x, Class c, String name, int level) {
3097//              x.alias(name, c);
3098//
3099//              char curr = 'a';
3100//              for (Field f : c.getFields()) {
3101//                      if (Modifier.isTransient(f.getModifiers())) continue;
3102//                      String alias = "" + curr;
3103//                      if (level > 0) alias += level;
3104//                      x.alias("", c);
3105//                      curr++;
3106//              }
3107//      }
3108        
3109        
3110
3111        
3112        
3113        @Override
3114        public PluginPick<ShipAIPlugin> pickShipAI(FleetMemberAPI member, ShipAPI ship) {
3115                if (ship.isFighter()) {
3116                        if (ship.getHullSpec().hasTag(Tags.THREAT_SWARM_AI)) {
3117                                return new PluginPick<ShipAIPlugin>(new ThreatSwarmAI(ship), PickPriority.CORE_SPECIFIC);
3118                        }
3119                        if (ship.getHullSpec().hasTag(Tags.DWELLER_VORTEX)) {
3120                                return new PluginPick<ShipAIPlugin>(new ShroudedVortexAI(ship), PickPriority.CORE_SPECIFIC);
3121                        }
3122                        if (ship.getHullSpec().hasTag(Tags.DWELLER_EJECTA)) {
3123                                return new PluginPick<ShipAIPlugin>(new ShroudedEjectaAI(ship), PickPriority.CORE_SPECIFIC);
3124                        }
3125                        return null;
3126                }
3127                
3128                
3129                if (ship.getHullSpec().hasTag(Tags.THREAT)) {
3130                        ShipAIConfig config = new ShipAIConfig();
3131                        
3132                        //boolean overseer = ship.getHullSpec().getHullId().equals("overseer_unit");
3133                        
3134                        if (ship.getHullSpec().hasTag(Tags.THREAT_TIMID)) {
3135                                config.personalityOverride = Personalities.TIMID;
3136                        } else if (ship.getHullSpec().hasTag(Tags.THREAT_CAUTIOUS)) {
3137                                config.personalityOverride = Personalities.CAUTIOUS;
3138                        } else if (ship.getHullSpec().hasTag(Tags.THREAT_AGGRESSIVE)) {
3139                                config.personalityOverride = Personalities.AGGRESSIVE;
3140//                              config.alwaysStrafeOffensively = true;
3141//                              config.backingOffWhileNotVentingAllowed = false;
3142//                              config.turnToFaceWithUndamagedArmor = false;
3143//                              config.burnDriveIgnoreEnemies = true;
3144                        } else if (ship.getHullSpec().hasTag(Tags.THREAT_RECKLESS)) {
3145                                config.personalityOverride = Personalities.RECKLESS;
3146                                config.alwaysStrafeOffensively = true;
3147                                config.backingOffWhileNotVentingAllowed = false;
3148                                config.turnToFaceWithUndamagedArmor = false;
3149                                config.burnDriveIgnoreEnemies = true;
3150                        } else {
3151                                config.personalityOverride = Personalities.STEADY;
3152                        }
3153                        
3154                        PickPriority priority = PickPriority.CORE_SET;
3155                        return new PluginPick<ShipAIPlugin>(Global.getSettings().createDefaultShipAI(ship, config), priority);
3156                }
3157                
3158                if (ship.getHullSpec().hasTag(Tags.DWELLER)) {
3159                        ShipAIConfig config = new ShipAIConfig();
3160                        
3161                        if (ship.getHullSpec().hasTag(Tags.DWELLER_TIMID)) {
3162                                config.personalityOverride = Personalities.TIMID;
3163                        } else if (ship.getHullSpec().hasTag(Tags.DWELLER_CAUTIOUS)) {
3164                                config.personalityOverride = Personalities.CAUTIOUS;
3165                        } else if (ship.getHullSpec().hasTag(Tags.DWELLER_AGGRESSIVE)) {
3166                                config.personalityOverride = Personalities.AGGRESSIVE;
3167                        } else if (ship.getHullSpec().hasTag(Tags.DWELLER_RECKLESS)) {
3168                                config.personalityOverride = Personalities.RECKLESS;
3169                                config.alwaysStrafeOffensively = true;
3170                                config.backingOffWhileNotVentingAllowed = false;
3171                                config.turnToFaceWithUndamagedArmor = false;
3172                                config.burnDriveIgnoreEnemies = true;
3173                        } else {
3174                                config.personalityOverride = Personalities.STEADY;
3175                        }
3176                        
3177                        PickPriority priority = PickPriority.CORE_SET;
3178                        return new PluginPick<ShipAIPlugin>(Global.getSettings().createDefaultShipAI(ship, config), priority);
3179                }
3180                
3181                
3182                
3183                Set<String> derelicts = new HashSet<String>();
3184                derelicts.add("warden");
3185                derelicts.add("defender");
3186                derelicts.add("picket");
3187                derelicts.add("sentry");
3188                derelicts.add("berserker");
3189                derelicts.add("bastillion");
3190
3191                boolean zigguratOnEnemySide = ship.getHullSpec().getHullId().equals("ziggurat") && 
3192                                                        (member == null || member.getFleetCommander() == null || !member.getFleetCommander().isPlayer());
3193                
3194                String hullId = ship.getHullSpec().getHullId();
3195                if (!zigguratOnEnemySide && 
3196                                !derelicts.contains(hullId) && !Misc.isAutomated(ship.getVariant())) return null;
3197                
3198                //HullSize size = ship.getHullSize();
3199                
3200                ShipAIConfig config = new ShipAIConfig();
3201                config.alwaysStrafeOffensively = true;
3202                config.backingOffWhileNotVentingAllowed = false;
3203                config.turnToFaceWithUndamagedArmor = false;
3204                config.burnDriveIgnoreEnemies = true;
3205                
3206                boolean carrier = false;
3207                if (ship != null && ship.getVariant() != null) {
3208                        carrier = ship.getVariant().isCarrier() && !ship.getVariant().isCombat();
3209                }
3210                if (carrier) {
3211                        config.personalityOverride = Personalities.AGGRESSIVE;
3212                        config.backingOffWhileNotVentingAllowed = true;
3213                } else {
3214                        config.personalityOverride = Personalities.RECKLESS;
3215                }
3216                
3217                PickPriority priority = PickPriority.CORE_SET;
3218                if (zigguratOnEnemySide) {
3219                        priority = PickPriority.CORE_SPECIFIC;
3220                }
3221                return new PluginPick<ShipAIPlugin>(Global.getSettings().createDefaultShipAI(ship, config), priority);
3222        }
3223        
3224//      public PluginPick<MissileAIPlugin> pickMissileAI(final MissileAPI missile, final ShipAPI launchingShip) {
3225//              if (missile.getWeaponSpec() != null && missile.getWeaponSpec().getWeaponId().equals("motelauncher")) {
3226//                      return new PluginPick<MissileAIPlugin>(new MoteAIScript(missile), PickPriority.MOD_GENERAL);
3227//              }
3228//              if (missile.getWeaponSpec() != null && missile.getWeaponSpec().getWeaponId().equals("motelauncher_hf")) {
3229//                      return new PluginPick<MissileAIPlugin>(new MoteAIScript(missile), PickPriority.MOD_GENERAL);
3230//              }
3231//              return null;
3232//      }
3233        
3234        public void convertTo0951aSkillSystemIfNeeded() {
3235                if (Global.getSector().getCharacterData().getSavefileVersion() != null) {
3236                        return;
3237                }
3238                
3239                SectorAPI engine = Global.getSector();
3240                engine.getCharacterData().setSavefileVersion("0.95.1a");
3241                
3242                for (AdminData admin : engine.getCharacterData().getAdmins()) {
3243                        convertPersonSkillsTo0951a(admin.getPerson());
3244                }
3245        
3246                List<LocationAPI> all = new ArrayList<LocationAPI>();
3247                all.add(engine.getHyperspace());
3248                all.addAll(engine.getStarSystems());
3249                for (LocationAPI curr : all) {
3250                        for (CampaignFleetAPI fleet : curr.getFleets()) {
3251                                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
3252                                        convertPersonSkillsTo0951a(member.getCaptain());
3253                                        if (fleet.isPlayerFleet() && member.getCaptain().isAICore()) {
3254                                                String aiCoreId = member.getCaptain().getAICoreId();
3255                                                boolean alpha = Commodities.ALPHA_CORE.equals(aiCoreId);
3256                                                boolean beta = Commodities.BETA_CORE.equals(aiCoreId);
3257                                                boolean gamma = Commodities.GAMMA_CORE.equals(aiCoreId);
3258                                                
3259                                                int points = 0;
3260                                                float mult = 1f;
3261                                                if (alpha) {
3262                                                        points = AICoreOfficerPluginImpl.ALPHA_POINTS;
3263                                                        mult = AICoreOfficerPluginImpl.ALPHA_MULT;
3264                                                } else if (beta) {
3265                                                        points = AICoreOfficerPluginImpl.BETA_POINTS;
3266                                                        mult = AICoreOfficerPluginImpl.BETA_MULT;
3267                                                } else if (gamma) {
3268                                                        points = AICoreOfficerPluginImpl.GAMMA_POINTS;
3269                                                        mult = AICoreOfficerPluginImpl.GAMMA_MULT;
3270                                                }
3271                                                member.getCaptain().getMemoryWithoutUpdate().unset(AICoreOfficerPluginImpl.AUTOMATED_POINTS_VALUE);
3272                                                member.getCaptain().getMemoryWithoutUpdate().set(AICoreOfficerPluginImpl.AUTOMATED_POINTS_MULT, mult);
3273                                        }
3274                                }
3275                        }
3276                }
3277                
3278                for (LocationAPI curr : all) {
3279                        for (SectorEntityToken entity : curr.getAllEntities()) {
3280                                if (entity.getMarket() != null && entity.getMarket().getAdmin() != null) { 
3281                                        convertPersonSkillsTo0951a(entity.getMarket().getAdmin());
3282                                }
3283                                if (entity.getMemoryWithoutUpdate() != null && entity.getMemoryWithoutUpdate().contains("$defenderFleet")) {
3284                                        CampaignFleetAPI fleet = (CampaignFleetAPI) entity.getMemoryWithoutUpdate().get("$defenderFleet");
3285                                        if (fleet != null) {
3286                                                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
3287                                                        convertPersonSkillsTo0951a(member.getCaptain());
3288                                                }
3289                                        }
3290                                }
3291                        }
3292                }
3293                
3294                MutableCharacterStatsAPI stats = engine.getPlayerStats();
3295                int skillPoints = 0;
3296                int storyPoints = 0;
3297                for (SkillLevelAPI sl : stats.getSkillsCopy()) {
3298                        int level = (int) sl.getLevel();
3299                        if (level > 0) skillPoints++;
3300                        if (level > 1) storyPoints++;
3301                        for (int i = 0; i < level; i++) {
3302                                stats.decreaseSkill(sl.getSkill().getId());
3303                        }
3304                }
3305                stats.setPoints(stats.getPoints() + skillPoints);
3306                stats.setStoryPoints(stats.getStoryPoints() + storyPoints);
3307                stats.refreshCharacterStatsEffects();
3308                stats.refreshAllOutpostsEffectsForPlayerOutposts();
3309                
3310                engine.addTransientScript(new EveryFrameScript() {
3311                        int frames = 0;
3312                        boolean done = false;
3313                        public boolean runWhilePaused() {
3314                                return true;
3315                        }
3316                        public boolean isDone() {
3317                                return done;
3318                        }
3319                        public void advance(float amount) {
3320                                frames++;
3321                                if (frames > 2 && !Global.getSector().getCampaignUI().isShowingDialog()) {
3322                                        Global.getSector().getCampaignUI().showConfirmDialog("Your skills have been reset "
3323                                                        + "to accomodate the new skill system. Skill and story points have been refunded.\n\n"
3324                                                        + "Officer, administrator, and AI core skills have been adjusted for the new system.",
3325                                                        "Ok", null, null, null);
3326                                        done = true;
3327                                }
3328                        }
3329                });
3330        }
3331        
3332        @SuppressWarnings("deprecation")
3333        public void convertPersonSkillsTo0951a(PersonAPI person) {
3334                if (person == null || person.isPlayer() || person.isDefault()) return;
3335                
3336                MutableCharacterStatsAPI stats = person.getStats();
3337                stats.setSkipRefresh(true);
3338                
3339                convertSkill(Skills.SHIELD_MODULATION, Skills.FIELD_MODULATION, person);
3340                convertSkill(Skills.RELIABILITY_ENGINEERING, Skills.COMBAT_ENDURANCE, person);
3341                
3342                convertSkill(Skills.STRIKE_COMMANDER, Skills.HELMSMANSHIP, person);
3343                convertSkill(Skills.STRIKE_COMMANDER, Skills.POLARIZED_ARMOR, person);
3344                
3345                convertSkill(Skills.RANGED_SPECIALIZATION, Skills.TARGET_ANALYSIS, person);
3346                convertSkill(Skills.RANGED_SPECIALIZATION, Skills.BALLISTIC_MASTERY, person);
3347                
3348                convertSkill(Skills.PHASE_MASTERY, Skills.FIELD_MODULATION, person);
3349                convertSkill(Skills.PHASE_MASTERY, Skills.ORDNANCE_EXPERTISE, person);
3350                
3351                convertSkill(Skills.WEAPON_DRILLS, Skills.TACTICAL_DRILLS, person);
3352                convertSkill(Skills.SPECIAL_MODIFICATIONS, Skills.BEST_OF_THE_BEST, person);
3353                
3354                
3355                removeSkill(Skills.COLONY_MANAGEMENT, person);
3356                removeSkill(Skills.SPACE_OPERATIONS, person);
3357                removeSkill(Skills.PLANETARY_OPERATIONS, person);
3358                removeSkill(Skills.AUXILIARY_SUPPORT, person);
3359
3360                if (person.isAICore() && stats.hasSkill(Skills.INDUSTRIAL_PLANNING)) {
3361                        stats.setSkillLevel(Skills.HYPERCOGNITION, 1);
3362                }
3363                
3364                stats.setSkipRefresh(false);
3365                
3366        }
3367        
3368        public void removeSkill(String id, PersonAPI person) {
3369                for (int i = 0; i < 10; i++) {
3370                        person.getStats().decreaseSkill(id);
3371                }
3372        }
3373        public void convertSkill(String from, String to, PersonAPI person) {
3374                int level = (int) person.getStats().getSkillLevel(from);
3375                if (level > 0) {
3376                        for (int i = 0; i < level; i++) {
3377                                person.getStats().decreaseSkill(from);
3378                        }
3379                        person.getStats().setSkillLevel(to, level);
3380                }
3381        }
3382        
3383}
3384
3385
3386        
3387        
3388        
3389        
3390        
3391        
3392        
3393        
3394        
3395        
3396