1package com.fs.starfarer.api.impl.campaign.shared;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
8import org.json.JSONException;
9import org.json.JSONObject;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
13import com.fs.starfarer.api.campaign.InteractionDialogAPI;
14import com.fs.starfarer.api.campaign.JumpPointAPI;
15import com.fs.starfarer.api.campaign.JumpPointAPI.JumpDestination;
16import com.fs.starfarer.api.campaign.LocationAPI;
17import com.fs.starfarer.api.campaign.SectorEntityToken;
18import com.fs.starfarer.api.campaign.SpecialItemData;
19import com.fs.starfarer.api.impl.campaign.JumpPointInteractionDialogPluginImpl;
20import com.fs.starfarer.api.impl.campaign.ids.Entities;
21import com.fs.starfarer.api.impl.campaign.ids.Factions;
22import com.fs.starfarer.api.impl.campaign.ids.Items;
23import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
27 public static String
KEY =
"$core_wormholeManager";
48 public static class WormholeItemData {
49 public String category;
52 public WormholeItemData(String jsonStr) {
54 JSONObject json =
new JSONObject(jsonStr);
55 category = json.getString(
"cat");
56 id = json.getString(
"id");
57 name = json.getString(
"name");
58 }
catch (JSONException e) {
59 throw new RuntimeException(
"Unable to parse Wormhole Anchor data [" + jsonStr +
"]", e);
62 public WormholeItemData(String category, String
id, String name) {
63 this.category = category;
68 public String toJsonStr() {
70 JSONObject json =
new JSONObject();
71 json.put(
"cat", category);
73 json.put(
"name", name);
74 return json.toString();
75 }
catch (JSONException e) {
81 public static class WormholeData {
82 public SpecialItemData item;
83 public JumpPointAPI jumpPoint;
84 public WormholeItemData itemData;
85 public WormholeData(SpecialItemData item, JumpPointAPI jumpPoint, WormholeItemData itemData) {
87 this.jumpPoint = jumpPoint;
88 this.itemData = itemData;
93 boolean makeUnstable =
true;
102 protected List<WormholeData>
deployed =
new ArrayList<WormholeData>();
106 List<WormholeData> sorted =
new ArrayList<WormholeData>(
deployed);
107 Collections.sort(sorted,
new Comparator<WormholeData>() {
108 public int compare(WormholeData o1, WormholeData o2) {
109 return o1.itemData.name.compareTo(o2.itemData.name);
113 for (WormholeData data :
deployed) {
114 JumpPointAPI jp = data.jumpPoint;
115 jp.clearDestinations();
116 boolean added =
false;
117 for (WormholeData other : sorted) {
118 if (other == data)
continue;
119 if (!data.itemData.category.equals(other.itemData.category))
continue;
121 jp.addDestination(
new JumpDestination(other.jumpPoint,
"wormhole terminus " + other.itemData.name));
125 jp.setStandardWormholeToStarfieldVisual();
127 jp.setStandardWormholeToNothingVisual();
132 public JumpPointAPI
addWormhole(SpecialItemData item, SectorEntityToken stableLocation, InteractionDialogAPI dialog) {
133 WormholeItemData itemData =
new WormholeItemData(item.getData());
136 if (data !=
null)
return data.jumpPoint;
140 LocationAPI loc = stableLocation.getContainingLocation();
142 wormhole.setRadius(75f);
145 wormhole.getMemoryWithoutUpdate().set(
WORMHOLE,
true);
154 loc.addEntity(wormhole);
155 if (stableLocation.getOrbit() !=
null) {
156 wormhole.setOrbit(stableLocation.getOrbit().makeCopy());
158 wormhole.setLocation(stableLocation.getLocation().x, stableLocation.getLocation().y);
159 loc.removeEntity(stableLocation);
166 deployed.add(
new WormholeData(item, wormhole, itemData));
168 if (dialog !=
null && dialog.getTextPanel() !=
null) {
169 Global.
getSector().getPlayerFleet().getCargo().removeItems(CargoItemType.SPECIAL, item, 1);
170 AddRemoveCommodity.addItemLossText(item, 1, dialog.getTextPanel());
179 for (WormholeData data :
deployed) {
180 if (data.jumpPoint == jp) {
181 LocationAPI loc = jp.getContainingLocation();
182 SectorEntityToken stableLocation = loc.addCustomEntity(
null,
184 Entities.STABLE_LOCATION,
186 if (jp.getOrbit() !=
null) {
187 stableLocation.setOrbit(jp.getOrbit().makeCopy());
190 loc.removeEntity(jp);
192 if (dialog !=
null && dialog.getTextPanel() !=
null) {
193 Global.
getSector().getPlayerFleet().getCargo().addItems(CargoItemType.SPECIAL, data.item, 1);
194 AddRemoveCommodity.addItemGainText(data.item, 1, dialog.getTextPanel());
206 if (
id ==
null)
return false;
207 for (WormholeData data :
deployed) {
208 if (
id.equals(data.itemData.id))
return true;
213 if (
id ==
null)
return null;
214 for (WormholeData data :
deployed) {
215 if (
id.equals(data.itemData.id))
return data;
224 WormholeItemData itemData =
new WormholeItemData(category,
id, name);
225 SpecialItemData item =
new SpecialItemData(Items.WORMHOLE_ANCHOR, itemData.toJsonStr());
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
static final String UNSTABLE_KEY
static float UNSTABLE_DURATION_MAX
static String LIMBO_STABLE_LOCATION
void removeWormhole(JumpPointAPI jp, InteractionDialogAPI dialog)
static float UNSTABLE_DURATION_MIN
JumpPointAPI addWormhole(SpecialItemData item, SectorEntityToken stableLocation, InteractionDialogAPI dialog)
WormholeData getDeployed(String id)
static boolean willWormholeBecomeUnstable(SectorEntityToken stableLocation)
List< WormholeData > deployed
static SpecialItemData createWormholeAnchor(String category, String id, String name)
static String GOT_WORMHOLE_CALIBRATION_DATA
boolean isDeployed(String id)
void updateWormholeDestinations()
static SpecialItemData createWormholeAnchor(String id, String name)
JumpPointAPI createJumpPoint(String id, String name)
boolean getBoolean(String key)