001package com.fs.starfarer.api.impl.campaign.rulecmd.salvage;
002
003import java.util.List;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.CargoAPI;
009import com.fs.starfarer.api.campaign.CargoPickerListener;
010import com.fs.starfarer.api.campaign.CargoStackAPI;
011import com.fs.starfarer.api.campaign.FactionAPI;
012import com.fs.starfarer.api.campaign.InteractionDialogAPI;
013import com.fs.starfarer.api.campaign.OptionPanelAPI;
014import com.fs.starfarer.api.campaign.SectorEntityToken;
015import com.fs.starfarer.api.campaign.TextPanelAPI;
016import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
017import com.fs.starfarer.api.campaign.rules.MemoryAPI;
018import com.fs.starfarer.api.characters.PersonAPI;
019import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
020import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
021import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
022import com.fs.starfarer.api.impl.campaign.ids.Commodities;
023import com.fs.starfarer.api.impl.campaign.ids.Ranks;
024import com.fs.starfarer.api.impl.campaign.ids.Strings;
025import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
026import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
027import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
028import com.fs.starfarer.api.ui.TooltipMakerAPI;
029import com.fs.starfarer.api.util.Misc;
030import com.fs.starfarer.api.util.Misc.Token;
031
032/**
033 * NotifyEvent $eventHandle <params> 
034 * 
035 */
036public class AICores extends BaseCommandPlugin {
037        
038        protected CampaignFleetAPI playerFleet;
039        protected SectorEntityToken entity;
040        protected FactionAPI playerFaction;
041        protected FactionAPI entityFaction;
042        protected TextPanelAPI text;
043        protected OptionPanelAPI options;
044        protected CargoAPI playerCargo;
045        protected MemoryAPI memory;
046        protected InteractionDialogAPI dialog;
047        protected Map<String, MemoryAPI> memoryMap;
048        protected PersonAPI person;
049        protected FactionAPI faction;
050
051        protected boolean buysAICores;
052        protected float valueMult;
053        protected float repMult;
054        
055        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
056                
057                this.dialog = dialog;
058                this.memoryMap = memoryMap;
059                
060                String command = params.get(0).getString(memoryMap);
061                if (command == null) return false;
062                
063                memory = getEntityMemory(memoryMap);
064                
065                entity = dialog.getInteractionTarget();
066                text = dialog.getTextPanel();
067                options = dialog.getOptionPanel();
068                
069                playerFleet = Global.getSector().getPlayerFleet();
070                playerCargo = playerFleet.getCargo();
071                
072                playerFaction = Global.getSector().getPlayerFaction();
073                entityFaction = entity.getFaction();
074                
075                person = dialog.getInteractionTarget().getActivePerson();
076                faction = person.getFaction();
077                
078                buysAICores = faction.getCustomBoolean("buysAICores");
079                valueMult = faction.getCustomFloat("AICoreValueMult");
080                repMult = faction.getCustomFloat("AICoreRepMult");
081                
082                if (command.equals("selectCores")) {
083                        selectCores();
084                } else if (command.equals("playerHasCores")) {
085                        return playerHasCores();
086                } else if (command.equals("personCanAcceptCores")) {
087                        return personCanAcceptCores();
088                }
089                
090                return true;
091        }
092
093        protected boolean personCanAcceptCores() {
094                if (person == null || !buysAICores) return false;
095                
096                return Ranks.POST_BASE_COMMANDER.equals(person.getPostId()) ||
097                           Ranks.POST_STATION_COMMANDER.equals(person.getPostId()) ||
098                           Ranks.POST_ADMINISTRATOR.equals(person.getPostId()) ||
099                           Ranks.POST_OUTPOST_COMMANDER.equals(person.getPostId());
100        }
101
102        protected void selectCores() {
103                CargoAPI copy = Global.getFactory().createCargo(false);
104                //copy.addAll(cargo);
105                //copy.setOrigSource(playerCargo);
106                for (CargoStackAPI stack : playerCargo.getStacksCopy()) {
107                        CommoditySpecAPI spec = stack.getResourceIfResource();
108                        if (spec != null && spec.getDemandClass().equals(Commodities.AI_CORES)) {
109                                copy.addFromStack(stack);
110                        }
111                }
112                copy.sort();
113                
114                final float width = 310f;
115                dialog.showCargoPickerDialog("Select AI cores to turn in", "Confirm", "Cancel", true, width, copy, new CargoPickerListener() {
116                        public void pickedCargo(CargoAPI cargo) {
117                                if (cargo.isEmpty()) {
118                                        cancelledCargoSelection();
119                                        return;
120                                }
121                                
122                                cargo.sort();
123                                for (CargoStackAPI stack : cargo.getStacksCopy()) {
124                                        playerCargo.removeItems(stack.getType(), stack.getData(), stack.getSize());
125                                        if (stack.isCommodityStack()) { // should be always, but just in case
126                                                int num = (int) stack.getSize();
127                                                AddRemoveCommodity.addCommodityLossText(stack.getCommodityId(), num, text);
128                                                
129                                                String key = "$turnedIn_" + stack.getCommodityId();
130                                                int turnedIn = faction.getMemoryWithoutUpdate().getInt(key);
131                                                faction.getMemoryWithoutUpdate().set(key, turnedIn + num);
132                                                
133                                                // Also, total of all cores! -dgb
134                                                String key2 = "$turnedIn_allCores";
135                                                int turnedIn2 = faction.getMemoryWithoutUpdate().getInt(key2);
136                                                faction.getMemoryWithoutUpdate().set(key2, turnedIn2 + num);
137                                        }
138                                }
139                                
140                                float bounty = computeCoreCreditValue(cargo);
141                                float repChange = computeCoreReputationValue(cargo);
142
143                                if (bounty > 0) {
144                                        playerCargo.getCredits().add(bounty);
145                                        AddRemoveCommodity.addCreditsGainText((int)bounty, text);
146                                }
147                                
148                                if (repChange >= 1f) {
149                                        CustomRepImpact impact = new CustomRepImpact();
150                                        impact.delta = repChange * 0.01f;
151                                        Global.getSector().adjustPlayerReputation(
152                                                        new RepActionEnvelope(RepActions.CUSTOM, impact,
153                                                                                                  null, text, true), 
154                                                                                                  faction.getId());
155                                        
156                                        impact.delta *= 0.25f;
157                                        if (impact.delta >= 0.01f) {
158                                                Global.getSector().adjustPlayerReputation(
159                                                                new RepActionEnvelope(RepActions.CUSTOM, impact,
160                                                                                                          null, text, true), 
161                                                                                                          person);
162                                        }
163                                }
164                                
165                                FireBest.fire(null, dialog, memoryMap, "AICoresTurnedIn");
166                        }
167                        public void cancelledCargoSelection() {
168                        }
169                        public void recreateTextPanel(TooltipMakerAPI panel, CargoAPI cargo, CargoStackAPI pickedUp, boolean pickedUpFromSource, CargoAPI combined) {
170                        
171                                float bounty = computeCoreCreditValue(combined);
172                                float repChange = computeCoreReputationValue(combined);
173                                
174                                float pad = 3f;
175                                float small = 5f;
176                                float opad = 10f;
177
178                                panel.setParaFontOrbitron();
179                                panel.addPara(Misc.ucFirst(faction.getDisplayName()), faction.getBaseUIColor(), 1f);
180                                //panel.addTitle(Misc.ucFirst(faction.getDisplayName()), faction.getBaseUIColor());
181                                //panel.addPara(faction.getDisplayNameLong(), faction.getBaseUIColor(), opad);
182                                //panel.addPara(faction.getDisplayName() + " (" + entity.getMarket().getName() + ")", faction.getBaseUIColor(), opad);
183                                panel.setParaFontDefault();
184                                
185                                panel.addImage(faction.getLogo(), width * 1f, 3f);
186                                
187                                
188                                //panel.setParaFontColor(Misc.getGrayColor());
189                                //panel.setParaSmallInsignia();
190                                //panel.setParaInsigniaLarge();
191                                panel.addPara("Compared to dealing with other factions, turning AI cores in to " + 
192                                                faction.getDisplayNameLongWithArticle() + " " +
193                                                "will result in:", opad);
194                                panel.beginGridFlipped(width, 1, 40f, 10f);
195                                //panel.beginGrid(150f, 1);
196                                panel.addToGrid(0, 0, "Bounty value", "" + (int)(valueMult * 100f) + "%");
197                                panel.addToGrid(0, 1, "Reputation gain", "" + (int)(repMult * 100f) + "%");
198                                panel.addGrid(pad);
199                                
200                                panel.addPara("If you turn in the selected AI cores, you will receive a %s bounty " +
201                                                "and your standing with " + faction.getDisplayNameWithArticle() + " will improve by %s points.",
202                                                opad * 1f, Misc.getHighlightColor(),
203                                                Misc.getWithDGS(bounty) + Strings.C,
204                                                "" + (int) repChange);
205                                
206                                
207                                //panel.addPara("Bounty: %s", opad, Misc.getHighlightColor(), Misc.getWithDGS(bounty) + Strings.C);
208                                //panel.addPara("Reputation: %s", pad, Misc.getHighlightColor(), "+12");
209                        }
210                });
211        }
212
213        protected float computeCoreCreditValue(CargoAPI cargo) {
214                float bounty = 0;
215                for (CargoStackAPI stack : cargo.getStacksCopy()) {
216                        CommoditySpecAPI spec = stack.getResourceIfResource();
217                        if (spec != null && spec.getDemandClass().equals(Commodities.AI_CORES)) {
218                                bounty += spec.getBasePrice() * stack.getSize();
219                        }
220                }
221                bounty *= valueMult;
222                return bounty;
223        }
224        
225        protected float computeCoreReputationValue(CargoAPI cargo) {
226                float rep = 0;
227                for (CargoStackAPI stack : cargo.getStacksCopy()) {
228                        CommoditySpecAPI spec = stack.getResourceIfResource();
229                        if (spec != null && spec.getDemandClass().equals(Commodities.AI_CORES)) {
230                                rep += getBaseRepValue(spec.getId()) * stack.getSize();
231                        }
232                }
233                rep *= repMult;
234                //if (rep < 1f) rep = 1f;
235                return rep;
236        }
237        
238        public static float getBaseRepValue(String coreType) {
239                if (Commodities.OMEGA_CORE.equals(coreType)) {
240                        return 15f;
241                }
242                if (Commodities.ALPHA_CORE.equals(coreType)) {
243                        return 5f;
244                }
245                if (Commodities.BETA_CORE.equals(coreType)) {
246                        return 2f;
247                }
248                if (Commodities.GAMMA_CORE.equals(coreType)) {
249                        return 1f;
250                }
251                return 1f;
252        }
253        
254        
255        protected boolean playerHasCores() {
256                for (CargoStackAPI stack : playerCargo.getStacksCopy()) {
257                        CommoditySpecAPI spec = stack.getResourceIfResource();
258                        if (spec != null && spec.getDemandClass().equals(Commodities.AI_CORES)) {
259                                return true;
260                        }
261                }
262                return false;
263        }
264
265        
266        
267}
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282