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