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