Starsector API
Loading...
Searching...
No Matches
WeaponBlueprintItemPlugin.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.WeaponAPI.AIHints;
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.loading.WeaponSpecAPI;
25import com.fs.starfarer.api.ui.TooltipMakerAPI;
26import com.fs.starfarer.api.util.Misc;
27import com.fs.starfarer.api.util.WeightedRandomPicker;
28
30
31 protected WeaponSpecAPI weapon;
32
33 @Override
38
39
40 public List<String> getProvidedFighters() {
41 return null;
42 }
43
44 public List<String> getProvidedShips() {
45 return null;
46 }
47
48 public List<String> getProvidedWeapons() {
49 List<String> result = new ArrayList<String>();
50 result.add(weapon.getWeaponId());
51 return result;
52 }
53 public List<String> getProvidedIndustries() {
54 return null;
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 - 31f;
64 float blY = cy - 16f;
65 float tlX = cx - 22f;
66 float tlY = cy + 27f;
67 float trX = cx + 23f;
68 float trY = cy + 27f;
69 float brX = cx + 15f;
70 float brY = cy - 19f;
71
72 String weaponId = stack.getSpecialDataIfSpecial().getData();
73 boolean known = Global.getSector().getPlayerFaction().knowsWeapon(weaponId);
74
75 float mult = 1f;
76
77 Color bgColor = Global.getSector().getPlayerFaction().getDarkUIColor();
78// if (weapon.getType() == WeaponType.BALLISTIC) {
79// bgColor = Misc.getBallisticMountColor();
80// } else if (weapon.getType() == WeaponType.ENERGY) {
81// bgColor = Misc.getEnergyMountColor();
82// } else if (weapon.getType() == WeaponType.MISSILE) {
83// bgColor = Misc.getMissileMountColor();
84// }
85 //bgColor = new Color(200,0,0);
86
87 bgColor = Misc.setAlpha(bgColor, 255);
88 renderer.renderBGWithCorners(bgColor, blX, blY, tlX, tlY, trX, trY, brX, brY,
89 alphaMult * mult, glowMult * 0.5f * mult, false);
90 //weaponId = "hurricane";
91 //weaponId = "plasma";
92 //weaponId = "amblaster";
93 renderer.renderWeaponWithCorners(weaponId, blX, blY, tlX, tlY, trX, trY, brX, brY,
94 alphaMult * mult, glowMult * 0.5f * mult, !known);
95
96 SpriteAPI overlay = Global.getSettings().getSprite("ui", "bpOverlayWeapon");
97 overlay.setColor(Color.green);
98 overlay.setColor(Global.getSector().getPlayerFaction().getBrightUIColor());
99 overlay.setAlphaMult(alphaMult);
100 overlay.setNormalBlend();
101 renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false);
102
103 if (known) {
104 renderer.renderBGWithCorners(Color.black, blX, blY, tlX, tlY, trX, trY, brX, brY,
105 alphaMult * 0.5f, 0f, false);
106 }
107
108 //renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false);
109
110 overlay.renderWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY);
111 }
112
113 @Override
114 public int getPrice(MarketAPI market, SubmarketAPI submarket) {
115 if (weapon != null) {
116 float base = super.getPrice(market, submarket);
117 return (int)(base + weapon.getBaseValue() * getItemPriceMult());
118 }
119 return super.getPrice(market, submarket);
120 }
121
122 @Override
123 public String getName() {
124 if (weapon != null) {
125 return weapon.getWeaponName() + " Blueprint";
126 }
127 return super.getName();
128 }
129
130 @Override
131 public String getDesignType() {
132 if (weapon != null) {
133 return weapon.getManufacturer();
134 }
135 return null;
136 }
137
138 @Override
139 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource) {
140 super.createTooltip(tooltip, expanded, transferHandler, stackSource);
141
142 float pad = 3f;
143 float opad = 10f;
144 float small = 5f;
145 Color h = Misc.getHighlightColor();
146 Color g = Misc.getGrayColor();
147 Color b = Misc.getButtonTextColor();
148 b = Misc.getPositiveHighlightColor();
149
150 String weaponId = stack.getSpecialDataIfSpecial().getData();
151 boolean known = Global.getSector().getPlayerFaction().knowsWeapon(weaponId);
152
153 List<String> weapons = new ArrayList<String>();
154 weapons.add(weaponId);
155 addWeaponList(tooltip, "Weapons:", weapons, 1, opad);
156
157 Description desc = Global.getSettings().getDescription(weapon.getWeaponId(), Type.WEAPON);
158 tooltip.addPara(desc.getText1FirstPara(), opad);
159
160 addCostLabel(tooltip, opad, transferHandler, stackSource);
161
162 if (known) {
163 tooltip.addPara("Already known", g, opad);
164 } else {
165 tooltip.addPara("Right-click to learn", b, opad);
166 }
167 }
168
169 @Override
170 public boolean hasRightClickAction() {
171 return true;
172 }
173
174 @Override
176 String weaponId = stack.getSpecialDataIfSpecial().getData();
177 return !Global.getSector().getPlayerFaction().knowsWeapon(weaponId);
178 }
179
180 @Override
182 String weaponId = stack.getSpecialDataIfSpecial().getData();
183
184 if (Global.getSector().getPlayerFaction().knowsWeapon(weaponId)) {
185 Global.getSector().getCampaignUI().getMessageDisplay().addMessage(
186 "" + weapon.getWeaponName() + ": blueprint already known");//,
187 } else {
188 Global.getSoundPlayer().playUISound("ui_acquired_blueprint", 1, 1);
189 Global.getSector().getPlayerFaction().addKnownWeapon(weaponId, true);
190 Global.getSector().getCampaignUI().getMessageDisplay().addMessage(
191 "Acquired blueprint: " + weapon.getWeaponName() + "");//,
192
193 }
194 }
195
196 @Override
197 public String resolveDropParamsToSpecificItemData(String params, Random random) throws JSONException {
198 if (params == null || params.isEmpty()) return null;
199
200 if (!params.startsWith("{")) {
201 return params;
202 }
203
204 JSONObject json = new JSONObject(params);
205
206 int tier = json.optInt("tier", -1);
207 Set<String> tags = new HashSet<String>();
208 if (json.has("tags")) {
209 JSONArray tagsArray = json.getJSONArray("tags");
210 for (int i = 0; i < tagsArray.length(); i++) {
211 tags.add(tagsArray.getString(i));
212 }
213 }
214
215 return pickWeapon(tier, tags, random);
216 }
217
218
219 protected String pickWeapon(int tier, Set<String> tags, Random random) {
220 List<WeaponSpecAPI> specs = Global.getSettings().getAllWeaponSpecs();
221
222 Iterator<WeaponSpecAPI> iter = specs.iterator();
223 while (iter.hasNext()) {
224 WeaponSpecAPI curr = iter.next();
225 if (curr.getAIHints().contains(AIHints.SYSTEM)) {
226 iter.remove();
227 }
228 }
229
230 if (tier >= 0) {
231 iter = specs.iterator();
232 while (iter.hasNext()) {
233 WeaponSpecAPI curr = iter.next();
234 if (curr.getTier() != tier) iter.remove();
235 }
236 }
237
238 if (!tags.isEmpty()) {
239 iter = specs.iterator();
240 while (iter.hasNext()) {
241 WeaponSpecAPI curr = iter.next();
242 for (String tag : tags) {
243 boolean not = tag.startsWith("!");
244 tag = not ? tag.substring(1) : tag;
245 boolean has = curr.hasTag(tag);
246 if (not == has) {
247 iter.remove();
248 break;
249 }
250 }
251 }
252 }
253
254 WeightedRandomPicker<WeaponSpecAPI> picker = new WeightedRandomPicker<WeaponSpecAPI>(random);
255 for (WeaponSpecAPI spec : specs) {
256 picker.add(spec, 1f * spec.getRarity());
257 }
258 WeaponSpecAPI pick = picker.pick();
259 if (pick == null) {
260 return null;
261 } else {
262 return pick.getWeaponId();
263 }
264 }
265
266}
267
268
269
270
271
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 addWeaponList(TooltipMakerAPI tooltip, String title, List< String > weapons, int max, float opad)
void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource)
void render(float x, float y, float w, float h, float alphaMult, float glowMult, SpecialItemRendererAPI renderer)
Description getDescription(String id, Type type)
List< WeaponSpecAPI > getAllWeaponSpecs()
WeaponSpecAPI getWeaponSpec(String weaponId)
SpriteAPI getSprite(String filename)
SoundAPI playUISound(String id, float pitch, float volume)
void renderWeaponWithCorners(String weaponId, float blX, float blY, float tlX, float tlY, float trX, float trY, float brX, float brY, float alphaMult, float glowMult, boolean withSpotlight)
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)