001package com.fs.starfarer.api.campaign.impl.items; 002 003import java.awt.Color; 004import java.util.ArrayList; 005import java.util.HashSet; 006import java.util.Iterator; 007import java.util.List; 008import java.util.Random; 009import java.util.Set; 010 011import org.json.JSONArray; 012import org.json.JSONException; 013import org.json.JSONObject; 014 015import com.fs.starfarer.api.Global; 016import com.fs.starfarer.api.campaign.CargoStackAPI; 017import com.fs.starfarer.api.campaign.CargoTransferHandlerAPI; 018import com.fs.starfarer.api.campaign.econ.MarketAPI; 019import com.fs.starfarer.api.campaign.econ.SubmarketAPI; 020import com.fs.starfarer.api.combat.ShipVariantAPI; 021import com.fs.starfarer.api.graphics.SpriteAPI; 022import com.fs.starfarer.api.impl.campaign.ids.Tags; 023import com.fs.starfarer.api.loading.Description; 024import com.fs.starfarer.api.loading.Description.Type; 025import com.fs.starfarer.api.loading.FighterWingSpecAPI; 026import com.fs.starfarer.api.ui.TooltipMakerAPI; 027import com.fs.starfarer.api.util.Misc; 028import com.fs.starfarer.api.util.WeightedRandomPicker; 029 030public class FighterBlueprintItemPlugin extends BaseSpecialItemPlugin implements BlueprintProviderItem { 031 032 protected FighterWingSpecAPI wing; 033 protected ShipVariantAPI fighter; 034 035 @Override 036 public void init(CargoStackAPI stack) { 037 super.init(stack); 038 wing = Global.getSettings().getFighterWingSpec(stack.getSpecialDataIfSpecial().getData()); 039 fighter = wing.getVariant(); 040 } 041 042 043 public List<String> getProvidedFighters() { 044 List<String> result = new ArrayList<String>(); 045 result.add(wing.getId()); 046 return result; 047 } 048 049 public List<String> getProvidedShips() { 050 return null; 051 } 052 053 public List<String> getProvidedWeapons() { 054 return null; 055 } 056 public List<String> getProvidedIndustries() { 057 return null; 058 } 059 060 @Override 061 public String getDesignType() { 062 if (fighter != null) { 063 return fighter.getHullSpec().getManufacturer(); 064 } 065 return null; 066 } 067 068 @Override 069 public void render(float x, float y, float w, float h, float alphaMult, 070 float glowMult, SpecialItemRendererAPI renderer) { 071 float cx = x + w/2f; 072 float cy = y + h/2f; 073 074 w = 40; 075 h = 40; 076 077 float blX = cx - 24f; 078 float blY = cy - 17f; 079 float tlX = cx - 14f; 080 float tlY = cy + 26f; 081 float trX = cx + 28f; 082 float trY = cy + 25f; 083 float brX = cx + 20f; 084 float brY = cy - 18f; 085 086 String wingId = stack.getSpecialDataIfSpecial().getData(); 087 boolean known = Global.getSector().getPlayerFaction().knowsFighter(wingId); 088 089 float mult = 1f; 090 091 Color bgColor = Global.getSector().getPlayerFaction().getDarkUIColor(); 092 bgColor = Misc.setAlpha(bgColor, 255); 093 renderer.renderBGWithCorners(bgColor, blX, blY, tlX, tlY, trX, trY, brX, brY, 094 alphaMult * mult, glowMult * 0.5f * mult, false); 095 renderer.renderShipWithCorners(wingId, null, blX, blY, tlX, tlY, trX, trY, brX, brY, 096 alphaMult * mult, glowMult * 0.5f * mult, !known); 097 098 SpriteAPI overlay = Global.getSettings().getSprite("ui", "bpOverlayFighter"); 099 overlay.setColor(Color.green); 100 overlay.setColor(Global.getSector().getPlayerFaction().getBrightUIColor()); 101 overlay.setAlphaMult(alphaMult); 102 overlay.setNormalBlend(); 103 renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false); 104 105 if (known) { 106 renderer.renderBGWithCorners(Color.black, blX, blY, tlX, tlY, trX, trY, brX, brY, 107 alphaMult * 0.5f, 0f, false); 108 } 109 110 //renderer.renderScanlinesWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY, alphaMult, false); 111 112 overlay.renderWithCorners(blX, blY, tlX, tlY, trX, trY, brX, brY); 113 } 114 115 @Override 116 public int getPrice(MarketAPI market, SubmarketAPI submarket) { 117 if (wing != null) { 118 float base = super.getPrice(market, submarket); 119 return (int)(base + wing.getBaseValue() * getItemPriceMult()); 120 } 121 return super.getPrice(market, submarket); 122 } 123 124 @Override 125 public String getName() { 126 if (wing != null) { 127 return wing.getWingName() + " Blueprint"; 128 } 129 return super.getName(); 130 } 131 132 @Override 133 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, CargoTransferHandlerAPI transferHandler, Object stackSource) { 134 super.createTooltip(tooltip, expanded, transferHandler, stackSource); 135 136 float pad = 3f; 137 float opad = 10f; 138 float small = 5f; 139 Color h = Misc.getHighlightColor(); 140 Color g = Misc.getGrayColor(); 141 Color b = Misc.getButtonTextColor(); 142 b = Misc.getPositiveHighlightColor(); 143 144 String wingId = stack.getSpecialDataIfSpecial().getData(); 145 boolean known = Global.getSector().getPlayerFaction().knowsFighter(wingId); 146 147 List<String> wings = new ArrayList<String>(); 148 wings.add(wingId); 149 addFighterList(tooltip, "Fighters:", wings, 1, opad); 150 151 Description desc = Global.getSettings().getDescription(fighter.getHullSpec().getDescriptionId(), Type.SHIP); 152 tooltip.addPara(desc.getText1FirstPara(), opad); 153 154 addCostLabel(tooltip, opad, transferHandler, stackSource); 155 156 if (known) { 157 tooltip.addPara("Already known", g, opad); 158 } else { 159 tooltip.addPara("Right-click to learn", b, opad); 160 } 161 } 162 163 @Override 164 public boolean hasRightClickAction() { 165 return true; 166 } 167 168 @Override 169 public boolean shouldRemoveOnRightClickAction() { 170 String wingId = stack.getSpecialDataIfSpecial().getData(); 171 return !Global.getSector().getPlayerFaction().knowsFighter(wingId); 172 } 173 174 @Override 175 public void performRightClickAction() { 176 String wingId = stack.getSpecialDataIfSpecial().getData(); 177 178 if (Global.getSector().getPlayerFaction().knowsFighter(wingId)) { 179 Global.getSector().getCampaignUI().getMessageDisplay().addMessage( 180 "" + wing.getWingName() + ": blueprint already known");//, 181 } else { 182 Global.getSoundPlayer().playUISound("ui_acquired_blueprint", 1, 1); 183 Global.getSector().getPlayerFaction().addKnownFighter(wingId, true); 184 Global.getSector().getCampaignUI().getMessageDisplay().addMessage( 185 "Acquired blueprint: " + wing.getWingName() + "");//, 186 187 } 188 } 189 190 @Override 191 public String resolveDropParamsToSpecificItemData(String params, Random random) throws JSONException { 192 if (params == null || params.isEmpty()) return null; 193 194 if (!params.startsWith("{")) { 195 return params; 196 } 197 JSONObject json = new JSONObject(params); 198 199 int tier = json.optInt("tier", -1); 200 Set<String> tags = new HashSet<String>(); 201 if (json.has("tags")) { 202 JSONArray tagsArray = json.getJSONArray("tags"); 203 for (int i = 0; i < tagsArray.length(); i++) { 204 tags.add(tagsArray.getString(i)); 205 } 206 } 207 208 return pickFighterWing(tier, tags, random); 209 } 210 211 212 protected String pickFighterWing(int tier, Set<String> tags, Random random) { 213 List<FighterWingSpecAPI> specs = Global.getSettings().getAllFighterWingSpecs(); 214 215 Iterator<FighterWingSpecAPI> iter = specs.iterator(); 216 while (iter.hasNext()) { 217 FighterWingSpecAPI curr = iter.next(); 218 if (curr.hasTag(Tags.WING_NO_DROP)) { 219 iter.remove(); 220 } 221 } 222 223 if (tier >= 0) { 224 iter = specs.iterator(); 225 while (iter.hasNext()) { 226 FighterWingSpecAPI curr = iter.next(); 227 if (curr.getTier() != tier) iter.remove(); 228 } 229 } 230 231 if (!tags.isEmpty()) { 232 iter = specs.iterator(); 233 while (iter.hasNext()) { 234 FighterWingSpecAPI curr = iter.next(); 235 for (String tag : tags) { 236 boolean not = tag.startsWith("!"); 237 tag = not ? tag.substring(1) : tag; 238 boolean has = curr.hasTag(tag); 239 if (not == has) { 240 iter.remove(); 241 break; 242 } 243 } 244 } 245 } 246 247 WeightedRandomPicker<FighterWingSpecAPI> picker = new WeightedRandomPicker<FighterWingSpecAPI>(random); 248 for (FighterWingSpecAPI spec : specs) { 249 picker.add(spec, 1f * spec.getRarity()); 250 } 251 FighterWingSpecAPI pick = picker.pick(); 252 if (pick == null) { 253 return null; 254 } else { 255 return pick.getId(); 256 } 257 } 258 259} 260 261 262 263 264