001package com.fs.starfarer.api.impl.campaign.intel.events;
002
003import java.awt.Color;
004import java.util.ArrayList;
005import java.util.LinkedHashSet;
006import java.util.List;
007import java.util.Set;
008
009import com.fs.starfarer.api.Global;
010import com.fs.starfarer.api.campaign.FactionAPI;
011import com.fs.starfarer.api.campaign.StarSystemAPI;
012import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
013import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
014import com.fs.starfarer.api.campaign.econ.MarketAPI;
015import com.fs.starfarer.api.impl.campaign.ids.Commodities;
016import com.fs.starfarer.api.impl.campaign.ids.Factions;
017import com.fs.starfarer.api.ui.Alignment;
018import com.fs.starfarer.api.ui.MapParams;
019import com.fs.starfarer.api.ui.TooltipMakerAPI;
020import com.fs.starfarer.api.ui.TooltipMakerAPI.TooltipCreator;
021import com.fs.starfarer.api.ui.UIPanelAPI;
022import com.fs.starfarer.api.util.Misc;
023
024public class TriTachyonStandardActivityCause extends BaseHostileActivityCause2 {
025
026        public static int MIN_TRITACH_PRODUCTION = 5;
027        public static int MIN_COMPETITOR_PRODUCTION = 4;
028        
029        public static int MIN_COMPETITOR_MARKET_SIZE = 4;
030        
031        public static float PROD_PROGRESS_MULT = Global.getSettings().getFloat("triTachyonProgressPerUnitProdMult");
032        
033        public static Set<String> COMPETING_COMMODITIES = new LinkedHashSet<String>();
034        static {
035                COMPETING_COMMODITIES.add(Commodities.LUXURY_GOODS);
036                COMPETING_COMMODITIES.add(Commodities.FUEL);
037                COMPETING_COMMODITIES.add(Commodities.DRUGS);
038                COMPETING_COMMODITIES.add(Commodities.ORGANS);
039                COMPETING_COMMODITIES.add(Commodities.HAND_WEAPONS);
040                COMPETING_COMMODITIES.add(Commodities.RARE_ORE);
041                COMPETING_COMMODITIES.add(Commodities.RARE_METALS);
042                COMPETING_COMMODITIES.add(Commodities.HEAVY_MACHINERY);
043                COMPETING_COMMODITIES.add(Commodities.SUPPLIES);
044                COMPETING_COMMODITIES.add(Commodities.VOLATILES);
045                COMPETING_COMMODITIES.add(Commodities.ORGANICS);
046        }
047        
048        public static class CompetitorData {
049                public String commodityId;
050                public CommoditySpecAPI spec;
051                public int factionProdTotal;
052                public int factionMaxProd;
053                public int competitorProdTotal;
054                public int competitorMaxProd;
055                public int competitorMaxMarketSize;
056                public int allProdTotal;
057                public List<MarketAPI> factionProducers = new ArrayList<MarketAPI>();
058                public List<MarketAPI> competitorProducers = new ArrayList<MarketAPI>();
059                
060                public CompetitorData(String commodityId) {
061                        this.commodityId = commodityId;
062                        spec = Global.getSettings().getCommoditySpec(commodityId);
063                }
064
065                public int getProgress(float progMult) {
066                        return (int) Math.round(competitorMaxProd * progMult);
067                }
068        }
069        
070
071        public static CompetitorData computeCompetitorData(String factionId, String competitorId, String commodityId) {
072                CompetitorData data = new CompetitorData(commodityId);
073                
074                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
075                        CommodityOnMarketAPI com = market.getCommodityData(commodityId);
076                        if (com == null) continue;
077
078                        int prod = com.getMaxSupply();
079                        if (prod <= 0) continue;
080                        
081                        if (factionId.equals(market.getFactionId())) {
082                                data.factionProdTotal += prod;
083                                data.factionProducers.add(market);
084                                data.factionMaxProd = Math.max(data.factionMaxProd, prod);
085                        } else if (competitorId.equals(market.getFactionId())) {
086                                data.competitorProdTotal += prod;
087                                data.competitorMaxProd = Math.max(data.competitorMaxProd, prod);
088                                data.competitorProducers.add(market);
089                                
090                                data.competitorMaxMarketSize = Math.max(data.competitorMaxMarketSize, market.getSize());
091                        }
092                        
093                        data.allProdTotal += prod;
094                }
095                
096                return data;
097        }
098        
099        public static List<CompetitorData> computePlayerCompetitionData() {
100                String factionId = Factions.TRITACHYON;
101                
102                Set<String> commodities = new LinkedHashSet<String>();
103                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
104                        if (!factionId.equals(market.getFactionId())) continue;
105                        
106                        for (CommodityOnMarketAPI com : market.getCommoditiesCopy()) {
107                                if (com.isPersonnel()) continue;
108                                if (com.getId().equals(Commodities.SHIPS)) continue;
109                                if (com.getId().equals(Commodities.SHIP_WEAPONS)) continue;
110                                if (!COMPETING_COMMODITIES.contains(com.getId())) continue;
111                                int prod = com.getMaxSupply();
112                                
113                                if (prod >= MIN_TRITACH_PRODUCTION) {
114                                        commodities.add(com.getId());
115                                }
116                        }
117                }
118                
119                List<CompetitorData> result = new ArrayList<CompetitorData>();
120                
121                for (String commodityId : commodities) {
122                        CompetitorData data = computeCompetitorData(factionId, Factions.PLAYER, commodityId);
123                        if (data.competitorMaxProd < MIN_COMPETITOR_PRODUCTION) continue;
124                        if (data.competitorMaxMarketSize < MIN_COMPETITOR_MARKET_SIZE) continue;
125                        result.add(data);
126                }
127                
128                return result;
129        }
130        
131        public static float MAX_MAG = 0.5f;
132        
133        
134        public TriTachyonStandardActivityCause(HostileActivityEventIntel intel) {
135                super(intel);
136        }
137        
138        
139        @Override
140        public TooltipCreator getTooltip() {
141                return new BaseFactorTooltip() {
142                        @Override
143                        public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, Object tooltipParam) {
144                                float opad = 10f;
145                
146                                Color h = Misc.getHighlightColor();
147                                Color tc = Misc.getTextColor();
148                                
149                                tooltip.addPara("Your colony production of certain commodities that the Tri-Tachyon corporation "
150                                                + "has an interest in is high enough "
151                                                + "to be viewed as competition.", 0f);
152                                
153                                TriTachyonHostileActivityFactor.addDealtSectionToTooltip(tooltip, opad);
154                                
155//                              tooltip.addPara("Independent-flagged commerce raiders have been sighted in your space, "
156//                                              + "attacking trade fleets regardless of their factional allegiance.", 0f);
157                                
158                                List<CompetitorData> comp = computePlayerCompetitionData();
159                                FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
160                                
161                                tooltip.beginTable(player, 20f, "Commodity", getTooltipWidth(tooltipParam) - 150f, "Production", 150f);
162                                for (final CompetitorData data : comp) {
163                                        tooltip.addRow(Alignment.LMID, tc, Misc.ucFirst(data.spec.getLowerCaseName()),
164                                                           Alignment.MID, h, "" + (int) data.competitorMaxProd);
165                                }
166                                tooltip.addTable("", 0, opad);
167                                tooltip.addSpacer(5f);
168                                
169                                tooltip.addPara("Event progress is based on the maximum production of each commodity. "
170                                                + "%s below %s per colony, or reducing the scope of the competition to a single commodity,"
171                                                + " should be enough to divert "
172                                                + "Tri-Tachyon's attention.", opad, 
173                                                h,
174                                                "Reducing production levels",
175                                                "" + MIN_COMPETITOR_PRODUCTION,
176                                                "single commodity");
177                                
178                                tooltip.addPara("%s are also possible.", opad,
179                                                h, "Reciprocal solutions");
180                                
181                                StarSystemAPI system = TriTachyonHostileActivityFactor.getPrimaryTriTachyonSystem();
182                                if (system != null) {
183                                        tooltip.addPara("The Tri-Tachyon Corporation's base of power is in the " + 
184                                                        system.getNameWithLowercaseType() + ".", opad);
185
186                                        MapParams params = new MapParams();
187                                        params.showSystem(system);
188                                        float width = tooltip.getWidthSoFar();
189                                        float height = Math.round(width / 1.6f);
190                                        params.positionToShowAllMarkersAndSystems(true, Math.min(width, height));
191                                        UIPanelAPI map = tooltip.createSectorMap(width, height, params, system.getNameWithLowercaseTypeShort());
192                                        tooltip.addCustom(map, opad);
193                                }
194                        }
195                };
196        }
197
198        @Override
199        public boolean shouldShow() {
200                return getProgress() != 0;
201        }
202
203        public int getProgress() {
204                if (TriTachyonHostileActivityFactor.isPlayerCounterRaidedTriTach() || 
205                                TriTachyonHostileActivityFactor.getPrimaryTriTachyonSystem() == null) {
206                        return 0;
207                }
208                
209                int total = 0;
210                List<CompetitorData> comp = computePlayerCompetitionData();
211                if (comp.size() <= 1) return 0;
212                
213                for (CompetitorData data : comp) {
214                        total += data.getProgress(PROD_PROGRESS_MULT);
215                }
216                
217                if (TriTachyonHostileActivityFactor.isDealtWithMercAttack()) {
218                        total = (int) Math.round(total * TriTachyonHostileActivityFactor.DEALT_WITH_MERC_PROGRESS_MULT); 
219                }
220                
221                return total;
222        }
223        
224        public String getDesc() {
225                return "Competing exports";
226        }
227        
228
229        public float getMagnitudeContribution(StarSystemAPI system) {
230                if (getProgress() <= 0) return 0f;
231                
232                List<CompetitorData> comp = computePlayerCompetitionData();
233                float mag = 0f;
234                for (CompetitorData data : comp) {
235                        for (MarketAPI market : data.competitorProducers) {
236                                if (market.getContainingLocation() == system) {
237                                        CommodityOnMarketAPI com = market.getCommodityData(data.commodityId);
238                                        float prod = com.getMaxSupply();
239                                        mag += prod * 0.05f;
240                                }
241                        }
242                }
243                if (mag > MAX_MAG) mag = MAX_MAG;
244                
245                mag = Math.round(mag * 100f) / 100f;
246                
247                return mag;
248        }
249        
250}
251
252
253
254
255
256