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