001package com.fs.starfarer.api.impl.campaign.econ; 002 003import java.util.HashMap; 004import java.util.HashSet; 005import java.util.Map; 006import java.util.Set; 007 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI; 010import com.fs.starfarer.api.campaign.econ.Industry; 011import com.fs.starfarer.api.campaign.econ.MarketAPI; 012import com.fs.starfarer.api.campaign.econ.MarketImmigrationModifier; 013import com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry; 014import com.fs.starfarer.api.impl.campaign.ids.Commodities; 015import com.fs.starfarer.api.impl.campaign.ids.Conditions; 016import com.fs.starfarer.api.impl.campaign.ids.Factions; 017import com.fs.starfarer.api.impl.campaign.ids.Industries; 018import com.fs.starfarer.api.impl.campaign.population.PopulationComposition; 019import com.fs.starfarer.api.loading.IndustrySpecAPI; 020import com.fs.starfarer.api.ui.TooltipMakerAPI; 021import com.fs.starfarer.api.util.Misc; 022 023 024public class ResourceDepositsCondition extends BaseHazardCondition implements MarketImmigrationModifier { 025 026 public static Map<String, String> COMMODITY = new HashMap<String, String>(); 027 public static Map<String, Integer> MODIFIER = new HashMap<String, Integer>(); 028 public static Map<String, String> INDUSTRY = new HashMap<String, String>(); 029 public static Map<String, Integer> BASE_MODIFIER = new HashMap<String, Integer>(); 030 public static Set<String> BASE_ZERO = new HashSet<String>(); 031 static { 032 COMMODITY.put(Conditions.ORE_SPARSE, Commodities.ORE); 033 COMMODITY.put(Conditions.ORE_MODERATE, Commodities.ORE); 034 COMMODITY.put(Conditions.ORE_ABUNDANT, Commodities.ORE); 035 COMMODITY.put(Conditions.ORE_RICH, Commodities.ORE); 036 COMMODITY.put(Conditions.ORE_ULTRARICH, Commodities.ORE); 037 038 COMMODITY.put(Conditions.RARE_ORE_SPARSE, Commodities.RARE_ORE); 039 COMMODITY.put(Conditions.RARE_ORE_MODERATE, Commodities.RARE_ORE); 040 COMMODITY.put(Conditions.RARE_ORE_ABUNDANT, Commodities.RARE_ORE); 041 COMMODITY.put(Conditions.RARE_ORE_RICH, Commodities.RARE_ORE); 042 COMMODITY.put(Conditions.RARE_ORE_ULTRARICH, Commodities.RARE_ORE); 043 044 COMMODITY.put(Conditions.ORGANICS_TRACE, Commodities.ORGANICS); 045 COMMODITY.put(Conditions.ORGANICS_COMMON, Commodities.ORGANICS); 046 COMMODITY.put(Conditions.ORGANICS_ABUNDANT, Commodities.ORGANICS); 047 COMMODITY.put(Conditions.ORGANICS_PLENTIFUL, Commodities.ORGANICS); 048 049 COMMODITY.put(Conditions.VOLATILES_TRACE, Commodities.VOLATILES); 050 COMMODITY.put(Conditions.VOLATILES_DIFFUSE, Commodities.VOLATILES); 051 COMMODITY.put(Conditions.VOLATILES_ABUNDANT, Commodities.VOLATILES); 052 COMMODITY.put(Conditions.VOLATILES_PLENTIFUL, Commodities.VOLATILES); 053 054 COMMODITY.put(Conditions.FARMLAND_POOR, Commodities.FOOD); 055 COMMODITY.put(Conditions.FARMLAND_ADEQUATE, Commodities.FOOD); 056 COMMODITY.put(Conditions.FARMLAND_RICH, Commodities.FOOD); 057 COMMODITY.put(Conditions.FARMLAND_BOUNTIFUL, Commodities.FOOD); 058 059 COMMODITY.put(Conditions.VOLTURNIAN_LOBSTER_PENS, Commodities.LOBSTER); 060 061 COMMODITY.put(Conditions.WATER_SURFACE, Commodities.FOOD); 062 //COMMODITY.put(Conditions.POLLUTION, Commodities.FOOD); 063 064 065 MODIFIER.put(Conditions.ORE_SPARSE, -1); 066 MODIFIER.put(Conditions.ORE_MODERATE, 0); 067 MODIFIER.put(Conditions.ORE_ABUNDANT, 1); 068 MODIFIER.put(Conditions.ORE_RICH, 2); 069 MODIFIER.put(Conditions.ORE_ULTRARICH, 3); 070 071 072 MODIFIER.put(Conditions.RARE_ORE_SPARSE, -1); 073 MODIFIER.put(Conditions.RARE_ORE_MODERATE, 0); 074 MODIFIER.put(Conditions.RARE_ORE_ABUNDANT, 1); 075 MODIFIER.put(Conditions.RARE_ORE_RICH, 2); 076 MODIFIER.put(Conditions.RARE_ORE_ULTRARICH, 3); 077 078 MODIFIER.put(Conditions.ORGANICS_TRACE, -1); 079 MODIFIER.put(Conditions.ORGANICS_COMMON, 0); 080 MODIFIER.put(Conditions.ORGANICS_ABUNDANT, 1); 081 MODIFIER.put(Conditions.ORGANICS_PLENTIFUL, 2); 082 083 MODIFIER.put(Conditions.VOLATILES_TRACE, -1); 084 MODIFIER.put(Conditions.VOLATILES_DIFFUSE, 0); 085 MODIFIER.put(Conditions.VOLATILES_ABUNDANT, 1); 086 MODIFIER.put(Conditions.VOLATILES_PLENTIFUL, 2); 087 088 MODIFIER.put(Conditions.FARMLAND_POOR, -1); 089 MODIFIER.put(Conditions.FARMLAND_ADEQUATE, 0); 090 MODIFIER.put(Conditions.FARMLAND_RICH, 1); 091 MODIFIER.put(Conditions.FARMLAND_BOUNTIFUL, 2); 092 093 MODIFIER.put(Conditions.WATER_SURFACE, 0); 094 //MODIFIER.put(Conditions.POLLUTION, -2); 095 MODIFIER.put(Conditions.VOLTURNIAN_LOBSTER_PENS, 1); 096 097 098 INDUSTRY.put(Commodities.ORE, Industries.MINING); 099 INDUSTRY.put(Commodities.RARE_ORE, Industries.MINING); 100 INDUSTRY.put(Commodities.VOLATILES, Industries.MINING); 101 INDUSTRY.put(Commodities.ORGANICS, Industries.MINING); 102 103 INDUSTRY.put(Commodities.FOOD, Industries.FARMING); 104 INDUSTRY.put(Commodities.LOBSTER, Industries.FARMING); 105 106 BASE_MODIFIER.put(Commodities.ORE, 0); 107 BASE_MODIFIER.put(Commodities.RARE_ORE, -2); 108 BASE_MODIFIER.put(Commodities.VOLATILES, -2); 109 BASE_MODIFIER.put(Commodities.ORGANICS, 0); 110 BASE_MODIFIER.put(Commodities.FOOD, 0); 111 112 BASE_MODIFIER.put(Commodities.LOBSTER, 0); 113 BASE_ZERO.add(Commodities.LOBSTER); 114 } 115 116// public static int getProduction(MarketAPI market, String industryId, String commodityId) { 117// for (MarketConditionAPI mc : market.getConditions()) { 118// String currCommodity = COMMODITY.get(mc.getId()); 119// if (currCommodity == null) continue; 120// if (!currCommodity.equals(commodityId)) continue; 121// 122// Integer mod = MODIFIER.get(mc.getId()); 123// if (mod == null) continue; 124// 125// Integer baseMod = BASE_MODIFIER.get(currCommodity); 126// if (baseMod == null) continue; 127// 128// String currIndustry = INDUSTRY.get(currCommodity); 129// if (currIndustry == null) continue; 130// if (!industryId.equals(currIndustry)) { 131// if (Industries.FARMING.equals(currIndustry)) { 132// if (!industryId.equals(Industries.AQUACULTURE)) { 133// continue; 134// } 135// } else { 136// continue; 137// } 138// } 139// 140// int size = market.getSize(); 141// if (BASE_ZERO.contains(commodityId)) { 142// size = 0; 143// } 144// 145// int base = size + baseMod; 146// 147// return base + mod; 148// } 149// return 0; 150// } 151 152 153 154 public void apply(String id) { 155 super.apply(id); 156 157 String commodityId = COMMODITY.get(condition.getId()); 158 if (commodityId == null) return; 159 160// if (commodityId.equals(Commodities.LOBSTER)) { 161// System.out.println("ewfwefwe"); 162// } 163 164 Integer mod = MODIFIER.get(condition.getId()); 165 if (mod == null) return; 166 167 Integer baseMod = BASE_MODIFIER.get(commodityId); 168 if (baseMod == null) return; 169 170 String industryId = INDUSTRY.get(commodityId); 171 if (industryId == null) return; 172 173 Industry industry = market.getIndustry(industryId); 174 if (industry == null) { 175 if (Industries.FARMING.equals(industryId)) { 176 industryId = Industries.AQUACULTURE; 177 industry = market.getIndustry(industryId); 178 } 179 if (industry == null) return; 180 } 181 182 int size = market.getSize(); 183 if (BASE_ZERO.contains(commodityId)) { 184 size = 0; 185 } 186 187 int base = size + baseMod; 188 189 if (industry.isFunctional()) { 190// industry.getSupply(commodityId).getQuantity().modifyFlat(id + "_0", base, BaseIndustry.BASE_VALUE_TEXT); 191// industry.getSupply(commodityId).getQuantity().modifyFlat(id + "_1", mod, Misc.ucFirst(condition.getName().toLowerCase())); 192 193 industry.supply(id + "_0", commodityId, base, BaseIndustry.BASE_VALUE_TEXT); 194 industry.supply(id + "_1", commodityId, mod, Misc.ucFirst(condition.getName().toLowerCase())); 195 } else { 196 industry.getSupply(commodityId).getQuantity().unmodifyFlat(id + "_0"); 197 industry.getSupply(commodityId).getQuantity().unmodifyFlat(id + "_1"); 198 } 199 200 if (Commodities.FOOD.equals(commodityId)) { 201 market.addImmigrationModifier(this); 202 } 203 204// uncomment to make farming provide organics 205// also need to adjust Farming to apply machinery deficit penalty 206// if ((Industries.FARMING.equals(industryId) || 207// Industries.AQUACULTURE.equals(industryId) && Commodities.FOOD.equals(commodityId))) { 208// industry.getSupply(Commodities.ORGANICS).getQuantity().modifyFlat(id + "_0", size - 2, BaseIndustry.BASE_VALUE_TEXT); 209// industry.getSupply(Commodities.ORGANICS).getQuantity().modifyFlat(id + "_1", mod, Misc.ucFirst(condition.getName().toLowerCase())); 210// } 211 } 212 213 public void unapply(String id) { 214 super.unapply(id); 215 market.removeImmigrationModifier(this); 216 } 217 218 @Override 219 public Map<String, String> getTokenReplacements() { 220 if (true) return super.getTokenReplacements(); 221 222 Map<String, String> map = super.getTokenReplacements(); 223 224 String commodityId = COMMODITY.get(condition.getId()); 225 if (commodityId == null) return map; 226 227 Integer mod = MODIFIER.get(condition.getId()); 228 if (mod == null) return map; 229 230 CommoditySpecAPI spec = Global.getSettings().getCommoditySpec(commodityId); 231 232 String str = "" + mod; 233 if (mod > 0) str = "+" + mod; 234 if (mod == 0) { 235 map.put("$resourceModText", "No bonuses or penalties to " + spec.getName().toLowerCase() + " production."); 236 } else { 237 map.put("$resourceModText", "" + str + " to " + spec.getName().toLowerCase() + " production."); 238 } 239 240 //map.put("$resourceMod", Misc.ucFirst(spec.getName().toLowerCase()) ) 241 242 243 return map; 244 } 245 246 @Override 247 public String[] getHighlights() { 248 if (true) return super.getHighlights(); 249 250 String commodityId = COMMODITY.get(condition.getId()); 251 if (commodityId == null) return super.getHighlights(); 252 253 Integer mod = MODIFIER.get(condition.getId()); 254 if (mod == null) return super.getHighlights(); 255 256 String str = "" + mod; 257 if (mod > 0) str = "+" + mod; 258 259 if (mod == 0) { 260 return super.getHighlights(); 261 } 262 263 return new String[] {str}; 264 } 265 266 protected void createTooltipAfterDescription(TooltipMakerAPI tooltip, boolean expanded) { 267 super.createTooltipAfterDescription(tooltip, expanded); 268 269 String commodityId = COMMODITY.get(condition.getId()); 270 if (commodityId != null) { 271 272// boolean hasHazard = false; 273// Object test = Global.getSettings().getSpec(ConditionGenDataSpec.class, condition.getId(), true); 274// if (test instanceof ConditionGenDataSpec) { 275// ConditionGenDataSpec spec = (ConditionGenDataSpec) test; 276// float hazard = spec.getHazard(); 277// //hazard = 0.25f; 278// hasHazard = hazard != 0; 279// } 280 281 Integer mod = MODIFIER.get(condition.getId()); 282 if (mod != null) { 283 CommoditySpecAPI spec = Global.getSettings().getCommoditySpec(commodityId); 284 285 String industryId = INDUSTRY.get(commodityId); 286 if (commodityId.equals(Commodities.FOOD) && condition.getId().equals(Conditions.WATER_SURFACE) && 287 industryId.equals(Industries.FARMING)) { 288 industryId = Industries.AQUACULTURE; 289 } else if (commodityId.equals(Commodities.LOBSTER) && condition.getId().equals(Conditions.VOLTURNIAN_LOBSTER_PENS) && 290 industryId.equals(Industries.FARMING)) { 291 industryId = Industries.AQUACULTURE; 292 } 293 IndustrySpecAPI ind = Global.getSettings().getIndustrySpec(industryId); 294 295 296 String str = "" + mod; 297 if (mod > 0) str = "+" + mod; 298 String text = ""; 299 if (mod == 0) { 300 text = "No bonuses or penalties to " + spec.getName().toLowerCase() + " production (" + ind.getName() + ")"; 301 } else { 302 //text = "" + str + " to " + spec.getName().toLowerCase() + " production."; 303 text = "" + str + " " + spec.getName().toLowerCase() + " production (" + ind.getName() + ")"; 304 } 305 float pad = 10f; 306 tooltip.addPara(text, pad, Misc.getHighlightColor(), str); 307 } 308 } 309 } 310 311 312 public void modifyIncoming(MarketAPI market, PopulationComposition incoming) { 313 float qty = 0f; 314 if (Conditions.FARMLAND_POOR.equals(condition.getId())) { 315 qty = 5f; 316 } else if (Conditions.FARMLAND_ADEQUATE.equals(condition.getId())) { 317 qty = 10f; 318 } else if (Conditions.FARMLAND_RICH.equals(condition.getId())) { 319 qty = 20f; 320 } else if (Conditions.FARMLAND_BOUNTIFUL.equals(condition.getId())) { 321 qty = 30f; 322 } else if (Conditions.WATER_SURFACE.equals(condition.getId())) { 323 qty = 10f; 324 } 325 if (qty > 0) { 326 incoming.add(Factions.LUDDIC_CHURCH, qty); 327 } 328 } 329 330 331 332 333} 334 335 336 337