Starsector API
Loading...
Searching...
No Matches
ModSpecItemPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.campaign.impl.items;
2
3import java.awt.Color;
4import java.util.HashSet;
5import java.util.Iterator;
6import java.util.List;
7import java.util.Random;
8import java.util.Set;
9
10import org.json.JSONArray;
11import org.json.JSONException;
12import org.json.JSONObject;
13
14import com.fs.starfarer.api.Global;
15import com.fs.starfarer.api.campaign.CargoStackAPI;
16import com.fs.starfarer.api.campaign.CargoTransferHandlerAPI;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
19import com.fs.starfarer.api.combat.HullModEffect;
20import com.fs.starfarer.api.combat.ShipAPI.HullSize;
21import com.fs.starfarer.api.graphics.SpriteAPI;
22import com.fs.starfarer.api.impl.campaign.DebugFlags;
23import com.fs.starfarer.api.impl.campaign.ids.Tags;
24import com.fs.starfarer.api.loading.HullModSpecAPI;
25import com.fs.starfarer.api.ui.Alignment;
26import com.fs.starfarer.api.ui.TooltipMakerAPI;
27import com.fs.starfarer.api.util.Misc;
28import com.fs.starfarer.api.util.WeightedRandomPicker;
29
31 private String modId;
32 private HullModSpecAPI modSpec;
33 //private SpriteAPI sprite;
34
35 @Override
36 public void init(CargoStackAPI stack) {
37 super.init(stack);
39 modSpec = Global.getSettings().getHullModSpec(modId);
40
41 //sprite = Global.getSettings().getSprite(modSpec.getSpriteName());
42 }
43
44 @Override
45 public void render(float x, float y, float w, float h, float alphaMult,
46 float glowMult, SpecialItemRendererAPI renderer) {
47 float cx = x + w/2f;
48 float cy = y + h/2f;
49
50 cx -= 2;
51 cy -= 1;
52
53 x = (int) x;
54 y = (int) y;
55 w = (int) w;
56 h = (int) h;
57
58 boolean known = Global.getSector().getCharacterData().knowsHullMod(modId);
59 float mult = 1f;
60 if (known) {
61 mult = 0.5f;
62 }
63
64 SpriteAPI sprite = Global.getSettings().getSprite(modSpec.getSpriteName());
65
66// sprite.setNormalBlend();
67// sprite.setAlphaMult(alphaMult * mult);
68//
69// sprite.renderAtCenter(cx, cy);
70//
71// if (glowMult > 0) {
72// sprite.setAlphaMult(alphaMult * glowMult * 0.5f * mult);
73// sprite.renderAtCenter(cx, cy);
74// }
75//
76// renderer.renderScanlines(sprite, cx, cy, alphaMult);
77// if (!known) {
78// renderer.renderSchematic(sprite, cx, cy, alphaMult * 0.67f);
79// }
80//
81// if (true) return;
82
83
84 w = sprite.getWidth() * 1.5f + 5;
85 h = sprite.getHeight() * 1.5f;
86// x = cx - w / 2f;
87// y = cy - h / 2f;
88
89 x = cx;
90 y = cy;
91
92// float blX = x - w / 2f;
93// float blY = y - h / 2f + 7;
94// float tlX = x - w / 2f + 10;
95// float tlY = y + h / 2f - 7;
96// float trX = x + w / 2f;
97// float trY = y + h / 2f;
98// float brX = x + w / 2f - 10;
99// float brY = y - h / 2f;
100
101// modspec.png
102// float blX = -23f;
103// float blY = -10f;
104// float tlX = -14f;
105// float tlY = 21f;
106// float trX = 25f;
107// float trY = 20f;
108// float brX = 23f;
109// float brY = -10f;
110
111// modspec2.png
112 float blX = -23f;
113 float blY = -10f;
114 float tlX = -18f;
115 float tlY = 24f;
116 float trX = 24f;
117 float trY = 24f;
118 float brX = 23f;
119 float brY = -10f;
120
121// float tilt = 5;
122// float b = Global.getSector().getCampaignUI().getSharedFader().getBrightness();
123// tilt = 20f * b - 10f;
124// w = 100;
125// h = 100;
126// tilt = 10;
127
128 sprite.setAlphaMult(alphaMult * mult);
129 sprite.setNormalBlend();
130 sprite.renderWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY);
131
132
133 if (glowMult > 0) {
134 sprite.setAlphaMult(alphaMult * glowMult * 0.5f * mult);
135 //sprite.renderAtCenter(cx, cy);
136 sprite.setAdditiveBlend();
137 sprite.renderWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY);
138 }
139
140 //renderer.renderScanlines(sprite, cx, cy, alphaMult);
141 renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false);
142 if (!known) {
143 //renderer.renderSchematic(sprite, cx, cy, alphaMult * 0.67f);
144 renderer.renderSchematicWithCorners(sprite, null, blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult * 0.67f);
145 }
146 }
147
148 @Override
149 public int getPrice(MarketAPI market, SubmarketAPI submarket) {
150 if (modSpec != null) return (int) modSpec.getBaseValue();
151 return super.getPrice(market, submarket);
152 }
153
154 @Override
155 public String getName() {
156 return modSpec.getDisplayName() + " - Modspec";
157 }
158
159
160 @Override
161 public String getDesignType() {
162 if (modSpec != null) {
163 return modSpec.getManufacturer();
164 }
165 return null;
166 }
167
168 @Override
169 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource) {
170 //super.createTooltip(tooltip, expanded, transferHandler, stackSource);
171
172 float pad = 3f;
173 float opad = 10f;
174 float small = 5f;
175 Color h = Misc.getHighlightColor();
176 Color g = Misc.getGrayColor();
177 Color b = Misc.getButtonTextColor();
178 b = Misc.getPositiveHighlightColor();
179
180 tooltip.addTitle(getName());
181
182 String design = getDesignType();
183 Misc.addDesignTypePara(tooltip, design, 10f);
184
185 if (!spec.getDesc().isEmpty()) {
186 tooltip.addPara(spec.getDesc(), Misc.getGrayColor(), opad);
187 }
188
189 tooltip.addSectionHeading("Effect", Alignment.MID, opad * 1f);
190
191 HullModEffect e = modSpec.getEffect();
192 HullSize size = HullSize.CAPITAL_SHIP;
193 if (e.shouldAddDescriptionToTooltip(size, null, true)) {
194 final String [] params = new String [] {
195 e.getDescriptionParam(0, size, null),
196 e.getDescriptionParam(1, size, null),
197 e.getDescriptionParam(2, size, null),
198 e.getDescriptionParam(3, size, null),
199 e.getDescriptionParam(4, size, null),
200 e.getDescriptionParam(5, size, null),
201 e.getDescriptionParam(6, size, null),
202 e.getDescriptionParam(7, size, null),
203 e.getDescriptionParam(8, size, null),
204 e.getDescriptionParam(9, size, null)
205 };
206
207 tooltip.addPara(modSpec.getDescription(size).replaceAll("\\%", "%%"), opad, h, params);
208 //e.getDescriptionParam(0, size);
209 }
210
211 e.addPostDescriptionSection(tooltip, size, null, getTooltipWidth(), true);
212
213 if (e.hasSModEffectSection(size, null, false)) {
214 e.addSModSection(tooltip, size, null, getTooltipWidth(), true, false);
215 }
216
217 addCostLabel(tooltip, opad, transferHandler, stackSource);
218
219 //if (CampaignEngine.getInstance().getCharacterData().getPerson().getStats().isHullModAvailable(id)) {
220 //tooltip.setParaSmallOrbitron();
221
222 boolean known = Global.getSector().getCharacterData().knowsHullMod(modId);
223 if (known) {
224 //tooltip.addPara("Already known", g, pad).setAlignment(Alignment.MID);
225 tooltip.addPara("Already known", g, opad);
226 } else {
227 //tooltip.addPara("Right-click to learn", b, pad).setAlignment(Alignment.MID);
228 tooltip.addPara("Right-click to learn", b, opad);
229 }
230 }
231
232 @Override
233 public float getTooltipWidth() {
234 return super.getTooltipWidth();
235 }
236
237 @Override
238 public boolean isTooltipExpandable() {
239 return false;
240 }
241
242 @Override
243 public boolean hasRightClickAction() {
244 return true;
245 }
246
247 @Override
249 return !Global.getSector().getCharacterData().knowsHullMod(modId);
250 }
251
252 @Override
254 if (Global.getSector().getCharacterData().knowsHullMod(modId)) {
255 Global.getSector().getCampaignUI().getMessageDisplay().addMessage(
256 "" + modSpec.getDisplayName() + ": already known");//,
257 } else {
258 Global.getSoundPlayer().playUISound("ui_acquired_hullmod", 1, 1);
259 Global.getSector().getCharacterData().addHullMod(modId);
260 Global.getSector().getCampaignUI().getMessageDisplay().addMessage(
261 "Acquired hull mod: " + modSpec.getDisplayName() + "");//,
262
263 }
264 }
265
266 @Override
267 public String resolveDropParamsToSpecificItemData(String params, Random random) throws JSONException {
268 if (params == null || params.isEmpty()) return null;
269
270
271 JSONObject json = new JSONObject(params);
272
273 int tier = json.optInt("tier", -1);
274 Set<String> tags = new HashSet<String>();
275 if (json.has("tags")) {
276 JSONArray tagsArray = json.getJSONArray("tags");
277 for (int i = 0; i < tagsArray.length(); i++) {
278 tags.add(tagsArray.getString(i));
279 }
280 }
281
282 List<HullModSpecAPI> specs = Global.getSettings().getAllHullModSpecs();
283
284 Iterator<HullModSpecAPI> iter = specs.iterator();
285 while (iter.hasNext()) {
286 HullModSpecAPI curr = iter.next();
287 boolean known = Global.getSector().getPlayerFaction().knowsHullMod(curr.getId());
288 if (DebugFlags.ALLOW_KNOWN_HULLMOD_DROPS) known = false;
289 if (known || curr.isHidden() || curr.isHiddenEverywhere() || curr.hasTag(Tags.HULLMOD_NO_DROP)) {
290 iter.remove();
291 continue;
292 }
293 }
294
295 if (tier >= 0) {
296 iter = specs.iterator();
297 while (iter.hasNext()) {
298 HullModSpecAPI curr = iter.next();
299 if (curr.getTier() != tier) iter.remove();
300 }
301 }
302
303 if (!tags.isEmpty()) {
304 iter = specs.iterator();
305 while (iter.hasNext()) {
306 HullModSpecAPI curr = iter.next();
307 for (String tag : tags) {
308 boolean not = tag.startsWith("!");
309 tag = not ? tag.substring(1) : tag;
310 boolean has = curr.hasTag(tag);
311 if (not == has) {
312 iter.remove();
313 break;
314 }
315 }
316 }
317 }
318
319 WeightedRandomPicker<HullModSpecAPI> picker = new WeightedRandomPicker<HullModSpecAPI>(random);
320 for (HullModSpecAPI spec : specs) {
321 picker.add(spec, 1f * spec.getRarity());
322 }
323 HullModSpecAPI pick = picker.pick();
324 if (pick == null) {
325 return null;
326 } else {
327 return pick.getId();
328 }
329 }
330
331 public String getModId() {
332 return modId;
333 }
334
335
336
337}
338
339
340
341
342
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 createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource)
int getPrice(MarketAPI market, SubmarketAPI submarket)
String resolveDropParamsToSpecificItemData(String params, Random random)
void render(float x, float y, float w, float h, float alphaMult, float glowMult, SpecialItemRendererAPI renderer)
HullModSpecAPI getHullModSpec(String modId)
List< HullModSpecAPI > getAllHullModSpecs()
SpriteAPI getSprite(String filename)
SoundAPI playUISound(String id, float pitch, float volume)
void renderSchematicWithCorners(SpriteAPI sprite, Color color, float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult)
void renderScanlinesWithCorners(float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult, boolean additive)