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