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