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}