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