001package com.fs.starfarer.api.impl.campaign.graid; 002 003import java.awt.Color; 004import java.util.Random; 005 006import com.fs.starfarer.api.Global; 007import com.fs.starfarer.api.campaign.CargoAPI; 008import com.fs.starfarer.api.campaign.CargoStackAPI; 009import com.fs.starfarer.api.campaign.TextPanelAPI; 010import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType; 011import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI; 012import com.fs.starfarer.api.campaign.econ.MarketAPI; 013import com.fs.starfarer.api.impl.campaign.ids.Commodities; 014import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel; 015import com.fs.starfarer.api.ui.IconGroupAPI; 016import com.fs.starfarer.api.ui.IconRenderMode; 017import com.fs.starfarer.api.ui.TooltipMakerAPI; 018import com.fs.starfarer.api.util.Misc; 019 020public class CreditsGroundRaidObjectivePluginImpl extends BaseGroundRaidObjectivePluginImpl { 021 022 public static float CREDITS_PER_MARKET_SIZE = 2500; 023 024 public CreditsGroundRaidObjectivePluginImpl(MarketAPI market) { 025 super(market, Commodities.CREDITS); 026 setSource(null); 027 } 028 029 public void addIcons(IconGroupAPI iconGroup) { 030 CommoditySpecAPI spec = getCommoditySpec(); 031 if (spec == null) return; 032 033 int base = (int) Math.round(getBaseSizeValue()); 034 int minus = getNumMinusTokens(); 035 int plus = getNumPlusTokens(); 036 037 if (base > 0) { 038 iconGroup.addIconGroup(id, IconRenderMode.NORMAL, base, null); 039 } 040 if (minus > 0) { 041 iconGroup.addIconGroup(id, IconRenderMode.RED, minus, null); 042 } 043 if (plus > 0) { 044 iconGroup.addIconGroup(id, IconRenderMode.GREEN, plus, null); 045 } 046 } 047 048 @Override 049 public String getSourceString() { 050 return null; 051 //return "Colony"; 052 } 053 054 public int getProjectedCreditsValue() { 055 return (int) getQuantity(getMarinesAssigned()); 056 } 057 058 059 public CommoditySpecAPI getCommoditySpec() { 060 return Global.getSettings().getCommoditySpec(getId()); 061 } 062 063 public RaidDangerLevel getDangerLevel() { 064 RaidDangerLevel danger = getCommoditySpec().getBaseDanger(); 065 066 float mult = getCreditsLootedMult(); 067 if (mult <= 0.75f) { 068 danger = danger.next(); 069 } else if (mult >= 1.25f) { 070 danger = danger.prev(); 071 } 072 return danger; 073 } 074 075 public float getQuantitySortValue() { 076 return QUANTITY_SORT_TIER_0 + 100000f; 077 } 078 079 @Override 080 public String getQuantityString(int marines) { 081 //return Misc.getWithDGS(getQuantity(Math.max(1, marines))); 082 //return Misc.getDGSCredits(getQuantity(Math.max(1, marines))); 083 return ""; 084 } 085 086 public int getValue(int marines) { 087 return (int) (getQuantity(marines) * getCommoditySpec().getBasePrice()); 088 } 089 090 public float getQuantity(int marines) { 091 //marines = Math.max(1, marines); 092 float base = getBaseRaidQuantity(); 093 return base * marines; 094 } 095 096 public static float MAX_TOKENS = 5; 097 public int getNumPlusTokens() { 098 float incomeMult = market.getIncomeMult().getModifiedValue(); 099 int num = 0; 100 if (incomeMult > 1f) num++; 101 if (incomeMult > 1.25f) num++; 102// 103// float stability = market.getStabilityValue(); 104// if (stability >= 8) num++; 105// if (stability >= 10) num++; 106 107 float a = market.getAccessibilityMod().computeEffective(0f); 108 num += Math.round((a - 1f) / 0.2f); 109 num = Math.max(num, 0); 110 num = (int) Math.min(num, MAX_TOKENS); 111 return num; 112 113 } 114 115 public int getNumMinusTokens() { 116 if (getNumPlusTokens() > 0) return 0; 117 118 float incomeMult = market.getIncomeMult().getModifiedValue(); 119 int num = 0; 120 if (incomeMult < 1f) num++; 121 if (incomeMult < 0.75f) num++; 122 123 float a = market.getAccessibilityMod().computeEffective(0f); 124 num += Math.round((1f - a) / 0.1f); 125 num = Math.max(num, 0); 126 num = (int) Math.min(num, MAX_TOKENS); 127 return num; 128 } 129 130 131 public float getCreditsLootedMult() { 132 //float mult = market.getIncomeMult().getModifiedValue(); 133 //float base = getBaseSizeValue(); 134 float mult = 1f + (getNumPlusTokens() - getNumMinusTokens()) / (MAX_TOKENS + 1f); 135 mult = Math.round(mult * 100f) / 100f; 136 return mult; 137 } 138 139 public float getBaseSizeValue() { 140 return Math.max(1, market.getSize() - 3); 141 } 142 143 public float getBaseRaidQuantity() { 144 float result = getBaseSizeValue() * CREDITS_PER_MARKET_SIZE; 145 result *= getCreditsLootedMult(); 146 return result; 147 } 148 149 public String getName() { 150 return getCommoditySpec().getName(); 151 } 152 153 public CargoStackAPI getStackForIcon() { 154 CargoStackAPI stack = Global.getFactory().createCargoStack(CargoItemType.RESOURCES, getId(), null); 155 return stack; 156 } 157 158 159 public int performRaid(CargoAPI loot, Random random, float lootMult, TextPanelAPI text) { 160 if (marinesAssigned <= 0) return 0; 161 162 float base = getQuantity(marinesAssigned); 163 base *= lootMult; 164 165 float mult = 0.9f + random.nextFloat() * 0.2f; 166 base *= mult; 167 168 quantityLooted = (int) base; 169 if (quantityLooted < 1) quantityLooted = 1; 170 171 loot.getCredits().add(quantityLooted); 172 173 xpGained = (int) (quantityLooted * getCommoditySpec().getBasePrice() * XP_GAIN_VALUE_MULT * 0.01f); 174 return xpGained; 175 } 176 177 @Override 178 public boolean hasTooltip() { 179 return true; 180 } 181 182 @Override 183 public void createTooltip(TooltipMakerAPI t, boolean expanded) { 184 float opad = 10f; 185 float pad = 3f; 186 Color h = Misc.getHighlightColor(); 187 Color bad = Misc.getNegativeHighlightColor(); 188 Color good = Misc.getPositiveHighlightColor(); 189 } 190} 191 192 193 194 195 196 197 198