Starsector API
Loading...
Searching...
No Matches
ShipBlueprintItemPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.campaign.impl.items;
2
3import java.util.ArrayList;
4import java.util.HashSet;
5import java.util.Iterator;
6import java.util.List;
7import java.util.Random;
8import java.util.Set;
9
10import java.awt.Color;
11
12import org.json.JSONArray;
13import org.json.JSONException;
14import org.json.JSONObject;
15
16import com.fs.starfarer.api.Global;
17import com.fs.starfarer.api.campaign.CargoStackAPI;
18import com.fs.starfarer.api.campaign.CargoTransferHandlerAPI;
19import com.fs.starfarer.api.campaign.econ.MarketAPI;
20import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
21import com.fs.starfarer.api.combat.ShipHullSpecAPI;
22import com.fs.starfarer.api.graphics.SpriteAPI;
23import com.fs.starfarer.api.loading.Description;
24import com.fs.starfarer.api.loading.Description.Type;
25import com.fs.starfarer.api.ui.TooltipMakerAPI;
26import com.fs.starfarer.api.util.Misc;
27import com.fs.starfarer.api.util.WeightedRandomPicker;
28
30
32
33 @Override
38
39 public List<String> getProvidedFighters() {
40 return null;
41 }
42
43 public List<String> getProvidedShips() {
44 List<String> result = new ArrayList<String>();
45 result.add(ship.getHullId());
46 return result;
47 }
48
49 public List<String> getProvidedWeapons() {
50 return null;
51 }
52 public List<String> getProvidedIndustries() {
53 return null;
54 }
55
56
57 @Override
58 public void render(float x, float y, float w, float h, float alphaMult,
59 float glowMult, SpecialItemRendererAPI renderer) {
60 float cx = x + w/2f;
61 float cy = y + h/2f;
62
63 float blX = cx - 30f;
64 float blY = cy - 15f;
65 float tlX = cx - 20f;
66 float tlY = cy + 26f;
67 float trX = cx + 23f;
68 float trY = cy + 26f;
69 float brX = cx + 15f;
70 float brY = cy - 18f;
71
72 String hullId = stack.getSpecialDataIfSpecial().getData();
73
74 boolean known = Global.getSector().getPlayerFaction().knowsShip(hullId);
75
76 float mult = 1f;
77 //if (known) mult = 0.5f;
78
79 Color bgColor = Global.getSector().getPlayerFaction().getDarkUIColor();
80 bgColor = Misc.setAlpha(bgColor, 255);
81
82 //float b = Global.getSector().getCampaignUI().getSharedFader().getBrightness() * 0.25f;
83 renderer.renderBGWithCorners(bgColor, blX, blY, tlX, tlY, trX, trY, brX, brY,
84 alphaMult * mult, glowMult * 0.5f * mult, false);
85 renderer.renderShipWithCorners(hullId, null, blX, blY, tlX, tlY, trX, trY, brX, brY,
86 alphaMult * mult, glowMult * 0.5f * mult, !known);
87
88
89 SpriteAPI overlay = Global.getSettings().getSprite("ui", "bpOverlayShip");
90 overlay.setColor(Color.green);
92 overlay.setAlphaMult(alphaMult);
93 overlay.setNormalBlend();
94 renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false);
95
96
97 if (known) {
98 renderer.renderBGWithCorners(Color.black, blX, blY, tlX, tlY, trX, trY, brX, brY,
99 alphaMult * 0.5f, 0f, false);
100 }
101
102
103 overlay.renderWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY);
104 }
105
106 @Override
107 public int getPrice(MarketAPI market, SubmarketAPI submarket) {
108 if (ship != null) {
109 //float base = super.getPrice(market, submarket);
110 float base = 0;
111 switch (ship.getHullSize()) {
112 case CAPITAL_SHIP:
113 base = Global.getSettings().getFloat("blueprintBasePriceCapital");;
114 break;
115 case CRUISER:
116 base = Global.getSettings().getFloat("blueprintBasePriceCruiser");;
117 break;
118 case DESTROYER:
119 base = Global.getSettings().getFloat("blueprintBasePriceDestroyer");;
120 break;
121 case FRIGATE:
122 case FIGHTER:
123 base = Global.getSettings().getFloat("blueprintBasePriceFrigate");;
124 break;
125 }
126 return (int)(base + ship.getBaseValue() * getItemPriceMult());
127 }
128 return super.getPrice(market, submarket);
129 }
130
131 @Override
132 protected float getItemPriceMult() {
133 return Global.getSettings().getFloat("blueprintPriceOriginalShipMult");
134 }
135
136 @Override
137 public String getName() {
138 if (ship != null) {
139 //return ship.getHullName() + " Blueprint";
140 return ship.getNameWithDesignationWithDashClass() + " Blueprint";
141 }
142 return super.getName();
143 }
144
145 @Override
146 public String getDesignType() {
147 if (ship != null) {
148 return ship.getManufacturer();
149 }
150 return null;
151 }
152
153 @Override
154 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource) {
155 super.createTooltip(tooltip, expanded, transferHandler, stackSource);
156
157 float pad = 3f;
158 float opad = 10f;
159 float small = 5f;
160 Color h = Misc.getHighlightColor();
161 Color g = Misc.getGrayColor();
162 Color b = Misc.getButtonTextColor();
164
165
166 String hullId = stack.getSpecialDataIfSpecial().getData();
167 boolean known = Global.getSector().getPlayerFaction().knowsShip(hullId);
168
169 List<String> hulls = new ArrayList<String>();
170 hulls.add(hullId);
171 addShipList(tooltip, "Ship hulls:", hulls, 1, opad);
173
174 String prefix = "";
175 if (ship.getDescriptionPrefix() != null) {
176 prefix = ship.getDescriptionPrefix() + "\n\n";
177 }
178 tooltip.addPara(prefix + desc.getText1FirstPara(), opad);
179
180 addCostLabel(tooltip, opad, transferHandler, stackSource);
181
182 if (known) {
183 tooltip.addPara("Already known", g, opad);
184 } else {
185 tooltip.addPara("Right-click to learn", b, opad);
186 }
187 }
188
189 @Override
190 public boolean hasRightClickAction() {
191 return true;
192 }
193
194 @Override
196 String hullId = stack.getSpecialDataIfSpecial().getData();
197 return !Global.getSector().getPlayerFaction().knowsShip(hullId);
198 }
199
200 @Override
202 String hullId = stack.getSpecialDataIfSpecial().getData();
203
204// ShipHullSpecAPI spec = Global.getSettings().getHullSpec(hullId);
205// if (spec != null && spec.hasTag(Tags.CODEX_UNLOCKABLE)) {
206// String baseId = CodexDataV2.getBaseHullId(spec);
207// SharedUnlockData.get().reportPlayerAwareOfShip(baseId, true);
208// }
209
210 if (Global.getSector().getPlayerFaction().knowsShip(hullId)) {
212 "" + ship.getNameWithDesignationWithDashClass() + ": blueprint already known");//,
213 } else {
214 Global.getSoundPlayer().playUISound("ui_acquired_blueprint", 1, 1);
216
218 "Acquired blueprint: " + ship.getNameWithDesignationWithDashClass() + "");//,
219
220 }
221 }
222
223 @Override
224 public String resolveDropParamsToSpecificItemData(String params, Random random) throws JSONException {
225 if (params == null || params.isEmpty()) return null;
226
227 if (!params.startsWith("{")) {
228 return params;
229 }
230
231 JSONObject json = new JSONObject(params);
232
233 Set<String> tags = new HashSet<String>();
234 if (json.has("tags")) {
235 JSONArray tagsArray = json.getJSONArray("tags");
236 for (int i = 0; i < tagsArray.length(); i++) {
237 tags.add(tagsArray.getString(i));
238 }
239 }
240
241 return pickShip(tags, random);
242 }
243
244
245 public static String pickShip(Set<String> tags, Random random) {
246 List<ShipHullSpecAPI> specs = Global.getSettings().getAllShipHullSpecs();
247
248 Iterator<ShipHullSpecAPI> iter = specs.iterator();
249// while (iter.hasNext()) {
250// ShipHullSpecAPI curr = iter.next();
251// if (curr.getHints().contains(ShipTypeHints.UNBOARDABLE) {
252// iter.remove();
253// }
254// }
255
256// if (tier >= 0) {
257// iter = specs.iterator();
258// while (iter.hasNext()) {
259// ShipHullSpecAPI curr = iter.next();
260// if (curr.getTier() != tier) iter.remove();
261// }
262// }
263
264 if (!tags.isEmpty()) {
265 iter = specs.iterator();
266 while (iter.hasNext()) {
267 ShipHullSpecAPI curr = iter.next();
268 for (String tag : tags) {
269 boolean not = tag.startsWith("!");
270 tag = not ? tag.substring(1) : tag;
271 boolean has = curr.hasTag(tag);
272 if (not == has) {
273 iter.remove();
274 break;
275 }
276 }
277 }
278 }
279
281 for (ShipHullSpecAPI spec : specs) {
282 picker.add(spec, 1f * spec.getRarity());
283 }
284 ShipHullSpecAPI pick = picker.pick();
285 if (pick == null) {
286 return null;
287 } else {
288 return pick.getHullId();
289 }
290 }
291
292}
293
294
295
296
297
static SettingsAPI getSettings()
Definition Global.java:57
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:49
static SectorAPI getSector()
Definition Global.java:65
void addCostLabel(TooltipMakerAPI tooltip, float pad, CargoTransferHandlerAPI transferHandler, Object stackSource)
void addShipList(TooltipMakerAPI tooltip, String title, List< String > hulls, int max, float opad)
void render(float x, float y, float w, float h, float alphaMult, float glowMult, SpecialItemRendererAPI renderer)
void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource)
static Color getButtonTextColor()
Definition Misc.java:842
static Color setAlpha(Color color, int alpha)
Definition Misc.java:1316
static Color getGrayColor()
Definition Misc.java:826
static Color getHighlightColor()
Definition Misc.java:792
static Color getPositiveHighlightColor()
Definition Misc.java:822
Description getDescription(String id, Type type)
ShipHullSpecAPI getHullSpec(String hullId)
List< ShipHullSpecAPI > getAllShipHullSpecs()
SpriteAPI getSprite(String filename)
SoundAPI playUISound(String id, float pitch, float volume)
void addKnownShip(String hullId, boolean setTimestamp)
void renderScanlinesWithCorners(float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult, boolean additive)
void renderBGWithCorners(Color bgColor, float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult, float glowMult, boolean additive)
void renderShipWithCorners(String hullOrWingId, Color bgColor, float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult, float glowMult, boolean withSpotlight)
void renderWithCorners(float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY)
LabelAPI addPara(String format, float pad, Color hl, String... highlights)