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