001package com.fs.starfarer.api.impl.campaign.intel.events;
002
003import java.awt.Color;
004import java.util.ArrayList;
005import java.util.List;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.FactionAPI;
009import com.fs.starfarer.api.campaign.StarSystemAPI;
010import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
011import com.fs.starfarer.api.campaign.econ.MarketAPI;
012import com.fs.starfarer.api.impl.campaign.ids.Factions;
013import com.fs.starfarer.api.impl.campaign.intel.events.TriTachyonStandardActivityCause.CompetitorData;
014import com.fs.starfarer.api.ui.Alignment;
015import com.fs.starfarer.api.ui.MapParams;
016import com.fs.starfarer.api.ui.TooltipMakerAPI;
017import com.fs.starfarer.api.ui.TooltipMakerAPI.TooltipCreator;
018import com.fs.starfarer.api.ui.UIPanelAPI;
019import com.fs.starfarer.api.util.Misc;
020
021public class SindrianDiktatStandardActivityCause extends BaseHostileActivityCause2 {
022
023        public static int MIN_DIKTAT_PRODUCTION = 7;
024        public static int MIN_COMPETITOR_PRODUCTION = 4;
025        
026        public static int MIN_COMPETITOR_MARKET_SIZE = 4;
027        
028        public static float PROD_PROGRESS_MULT = Global.getSettings().getFloat("diktatProgressPerUnitProdMult");
029        
030        public static CompetitorData computeCompetitorData(String factionId, String competitorId, String commodityId) {
031                CompetitorData data = new CompetitorData(commodityId);
032                
033                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
034                        CommodityOnMarketAPI com = market.getCommodityData(commodityId);
035                        if (com == null) continue;
036
037                        int prod = com.getMaxSupply();
038                        if (prod <= 0) continue;
039                        
040                        if (factionId.equals(market.getFactionId())) {
041                                data.factionProdTotal += prod;
042                                data.factionProducers.add(market);
043                                data.factionMaxProd = Math.max(data.factionMaxProd, prod);
044                        } else if (competitorId.equals(market.getFactionId())) {
045                                data.competitorProdTotal += prod;
046                                data.competitorMaxProd = Math.max(data.competitorMaxProd, prod);
047                                data.competitorProducers.add(market);
048                                
049                                data.competitorMaxMarketSize = Math.max(data.competitorMaxMarketSize, market.getSize());
050                        }
051                        
052                        data.allProdTotal += prod;
053                }
054                
055                return data;
056        }
057        
058        public static List<CompetitorData> computePlayerCompetitionData() {
059                String factionId = Factions.DIKTAT;
060                
061                List<String> commodities = new ArrayList<String>();
062                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
063                        if (!factionId.equals(market.getFactionId())) continue;
064                        
065                        for (CommodityOnMarketAPI com : market.getCommoditiesCopy()) {
066                                if (!com.isFuel()) continue;
067                                int prod = com.getMaxSupply();
068                                if (prod >= MIN_DIKTAT_PRODUCTION) {
069                                        commodities.add(com.getId());
070                                }
071                        }
072                }
073                
074                List<CompetitorData> result = new ArrayList<CompetitorData>();
075                
076                for (String commodityId : commodities) {
077                        CompetitorData data = computeCompetitorData(factionId, Factions.PLAYER, commodityId);
078                        if (data.competitorMaxProd < MIN_COMPETITOR_PRODUCTION) continue;
079                        if (data.competitorMaxMarketSize < MIN_COMPETITOR_MARKET_SIZE) continue;
080                        result.add(data);
081                }
082                
083                return result;
084        }
085        
086        public static float MAX_MAG = 0.5f;
087        
088        
089        public SindrianDiktatStandardActivityCause(HostileActivityEventIntel intel) {
090                super(intel);
091        }
092        
093        
094        @Override
095        public TooltipCreator getTooltip() {
096                return new BaseFactorTooltip() {
097                        @Override
098                        public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, Object tooltipParam) {
099                                float opad = 10f;
100                
101                                Color h = Misc.getHighlightColor();
102                                Color tc = Misc.getTextColor();
103                                
104                                tooltip.addPara("Your colony production of fuel is high enough for the Sindrian Diktat - "
105                                                + "which depends on its own fuel production for much of its economy - to take notice.", 0f);
106                                
107                                List<CompetitorData> comp = computePlayerCompetitionData();
108                                FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
109                                
110                                tooltip.beginTable(player, 20f, "Commodity", getTooltipWidth(tooltipParam) - 150f, "Production", 150f);
111                                for (final CompetitorData data : comp) {
112                                        tooltip.addRow(Alignment.LMID, tc, Misc.ucFirst(data.spec.getLowerCaseName()),
113                                                           Alignment.MID, h, "" + (int) data.competitorMaxProd);
114                                }
115                                tooltip.addTable("", 0, opad);
116                                tooltip.addSpacer(5f);
117                                
118                                tooltip.addPara("Event progress is based on maximum fuel production. "
119                                                + "%s below %s per colony should be enough to divert "
120                                                + "the Diktat's attention.", opad, 
121                                                h, "Reducing production levels ", "" + MIN_COMPETITOR_PRODUCTION);
122                                
123                                tooltip.addPara("Knocking the Diktat out of the fuel production game is also an option. Much of "
124                                                + "their fuel production depends on a Domain-era Synchrotron Core installed in "
125                                                + "their production facilities on Sindria.", opad,
126                                                h, "Synchrotron Core");
127
128                                MarketAPI sindria = SindrianDiktatHostileActivityFactor.getSindria(false);
129                                if (sindria != null && sindria.getStarSystem() != null) {
130                                        MapParams params = new MapParams();
131                                        params.showSystem(sindria.getStarSystem());
132                                        float w = tooltip.getWidthSoFar();
133                                        float ht = Math.round(w / 1.6f);
134                                        params.positionToShowAllMarkersAndSystems(true, Math.min(w, ht));
135                                        UIPanelAPI map = tooltip.createSectorMap(w, ht, params, sindria.getName() + " (" + sindria.getStarSystem().getNameWithLowercaseTypeShort() + ")");
136                                        tooltip.addCustom(map, opad);
137                                }
138                        }
139                };
140        }
141
142        @Override
143        public boolean shouldShow() {
144                return getProgress() != 0;
145        }
146
147        public int getProgress() {
148                if (SindrianDiktatHostileActivityFactor.isMadeDeal() ||
149                                SindrianDiktatHostileActivityFactor.isPlayerDefeatedDiktatAttack()) {
150                        return 0;
151                }
152                
153                int total = 0;
154                
155                List<CompetitorData> comp = computePlayerCompetitionData();
156                for (CompetitorData data : comp) {
157                        total += data.getProgress(PROD_PROGRESS_MULT);
158                }
159                
160                return total;
161        }
162        
163        public String getDesc() {
164                return "Competing fuel production";
165        }
166        
167
168        public float getMagnitudeContribution(StarSystemAPI system) {
169                if (getProgress() <= 0) return 0f;
170                
171                List<CompetitorData> comp = computePlayerCompetitionData();
172                float mag = 0f;
173                for (CompetitorData data : comp) {
174                        for (MarketAPI market : data.competitorProducers) {
175                                if (market.getContainingLocation() == system) {
176                                        CommodityOnMarketAPI com = market.getCommodityData(data.commodityId);
177                                        float prod = com.getMaxSupply();
178                                        mag += prod * 0.1f;
179                                }
180                        }
181                }
182                if (mag > MAX_MAG) mag = MAX_MAG;
183                
184                mag = Math.round(mag * 100f) / 100f;
185                
186                return mag;
187        }
188        
189}
190
191
192
193
194
195