001package com.fs.starfarer.api.impl.campaign.graid;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007
008import com.fs.starfarer.api.campaign.InteractionDialogAPI;
009import com.fs.starfarer.api.campaign.SectorEntityToken;
010import com.fs.starfarer.api.campaign.SpecialItemData;
011import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
012import com.fs.starfarer.api.campaign.econ.Industry;
013import com.fs.starfarer.api.campaign.econ.MarketAPI;
014import com.fs.starfarer.api.campaign.listeners.GroundRaidObjectivesListener;
015import com.fs.starfarer.api.campaign.rules.MemoryAPI;
016import com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry;
017import com.fs.starfarer.api.impl.campaign.ids.Commodities;
018import com.fs.starfarer.api.impl.campaign.ids.Conditions;
019import com.fs.starfarer.api.impl.campaign.ids.Industries;
020import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidType;
021
022public class StandardGroundRaidObjectivesCreator implements GroundRaidObjectivesListener {
023
024        public void modifyRaidObjectives(MarketAPI market, SectorEntityToken entity, List<GroundRaidObjectivePlugin> objectives, RaidType type, int marineTokens, int priority) {
025                if (priority != 0) return;
026                if (market == null) return;
027                
028                if (type == RaidType.VALUABLE) { 
029                        Map<CommodityOnMarketAPI, Float> raidValuables = computeRaidValuables(market);
030                        List<CommodityOnMarketAPI> commodities = new ArrayList<CommodityOnMarketAPI>(raidValuables.keySet());
031                        for (CommodityOnMarketAPI com : commodities) {
032                                CommodityGroundRaidObjectivePluginImpl curr = new CommodityGroundRaidObjectivePluginImpl(market, com.getId());
033                                if (curr.getQuantity(1) <= 0) continue;
034                                objectives.add(curr);
035                        }
036                        
037                        for (Industry ind : market.getIndustries()) {
038                                String coreId = ind.getAICoreId();
039                                if (coreId != null) {
040                                        AICoreGroundRaidObjectivePluginImpl core = new AICoreGroundRaidObjectivePluginImpl(market, coreId, ind);
041                                        objectives.add(core);
042                                }
043                                SpecialItemData sid = ind.getSpecialItem();
044                                if (sid != null) {
045                                        SpecialItemRaidObjectivePluginImpl special = new SpecialItemRaidObjectivePluginImpl(market, 
046                                                                                                                                                sid.getId(), null, ind);
047                                        objectives.add(special);
048                                        
049                                }
050                        }
051                        
052                        // a bit confusing, and also hard to balance - either the best option or the worst, not much in-between 
053//                      CreditsGroundRaidObjectivePluginImpl credits = new CreditsGroundRaidObjectivePluginImpl(market);
054//                      if (credits.getQuantity(1) > 0) {
055//                              objectives.add(credits);
056//                      }
057                        
058                        ShipWeaponsGroundRaidObjectivePluginImpl weapons = new ShipWeaponsGroundRaidObjectivePluginImpl(market);
059                        if (weapons.getQuantity(1) > 0) {
060                                objectives.add(weapons);
061                        }
062                        
063                        BlueprintGroundRaidObjectivePluginImpl blueprints = new BlueprintGroundRaidObjectivePluginImpl(market);
064                        if (blueprints.getQuantity(1) > 0) {
065                                objectives.add(blueprints);
066                        }
067                        
068                        if (market.hasCondition(Conditions.SOLAR_ARRAY)) {
069                                objectives.add(new SolarArrayGroundRaidObjectivePluginImpl(market));
070                        }
071                        
072                } else if (type == RaidType.DISRUPT) {
073                        for (Industry ind : market.getIndustries()) {
074                                if (ind.getSpec().hasTag(Industries.TAG_UNRAIDABLE)) continue;
075                                
076                                DisruptIndustryRaidObjectivePluginImpl curr = new DisruptIndustryRaidObjectivePluginImpl(market, ind);
077                                if (curr.getBaseDisruptDuration(marineTokens) <= 0) continue;
078                                objectives.add(curr);
079                        }
080                }
081        }
082
083        protected Map<CommodityOnMarketAPI, Float> computeRaidValuables(MarketAPI market) {
084                Map<CommodityOnMarketAPI, Float> result = new HashMap<CommodityOnMarketAPI, Float>();
085                for (CommodityOnMarketAPI com : market.getAllCommodities()) {
086                        if (com.isPersonnel()) continue;
087                        if (com.getCommodity().hasTag(Commodities.TAG_META)) continue;
088                        if (com.getCommodity().hasTag(Commodities.TAG_NON_ECONOMIC)) continue;
089                        
090                        int a = com.getAvailable();
091                        if (a > 0) {
092                                float num = BaseIndustry.getSizeMult(a) * com.getCommodity().getEconUnit() * 0.5f;
093                                result.put(com, num);
094                        }
095                }
096                return result;
097        }
098        
099        
100        public void reportRaidObjectivesAchieved(RaidResultData data, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
101                
102        }
103
104}