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