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