Starsector API
Loading...
Searching...
No Matches
AICores.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd.salvage;
2
3import java.util.List;
4import java.util.Map;
5
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CargoAPI;
9import com.fs.starfarer.api.campaign.CargoPickerListener;
10import com.fs.starfarer.api.campaign.CargoStackAPI;
11import com.fs.starfarer.api.campaign.FactionAPI;
12import com.fs.starfarer.api.campaign.InteractionDialogAPI;
13import com.fs.starfarer.api.campaign.OptionPanelAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.TextPanelAPI;
16import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
17import com.fs.starfarer.api.campaign.rules.MemoryAPI;
18import com.fs.starfarer.api.characters.PersonAPI;
19import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.CustomRepImpact;
20import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
21import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
22import com.fs.starfarer.api.impl.campaign.ids.Commodities;
23import com.fs.starfarer.api.impl.campaign.ids.Ranks;
24import com.fs.starfarer.api.impl.campaign.ids.Strings;
25import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
26import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
27import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
28import com.fs.starfarer.api.ui.TooltipMakerAPI;
29import com.fs.starfarer.api.util.Misc;
30import com.fs.starfarer.api.util.Misc.Token;
31
36public class AICores extends BaseCommandPlugin {
37
38 protected CampaignFleetAPI playerFleet;
39 protected SectorEntityToken entity;
40 protected FactionAPI playerFaction;
41 protected FactionAPI entityFaction;
42 protected TextPanelAPI text;
43 protected OptionPanelAPI options;
44 protected CargoAPI playerCargo;
45 protected MemoryAPI memory;
46 protected InteractionDialogAPI dialog;
47 protected Map<String, MemoryAPI> memoryMap;
48 protected PersonAPI person;
49 protected FactionAPI faction;
50
51 protected boolean buysAICores;
52 protected float valueMult;
53 protected float repMult;
54
55 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
56
57 this.dialog = dialog;
58 this.memoryMap = memoryMap;
59
60 String command = params.get(0).getString(memoryMap);
61 if (command == null) return false;
62
64
65 entity = dialog.getInteractionTarget();
66 text = dialog.getTextPanel();
67 options = dialog.getOptionPanel();
68
69 playerFleet = Global.getSector().getPlayerFleet();
70 playerCargo = playerFleet.getCargo();
71
72 playerFaction = Global.getSector().getPlayerFaction();
73 entityFaction = entity.getFaction();
74
75 person = dialog.getInteractionTarget().getActivePerson();
76 faction = person.getFaction();
77
78 buysAICores = faction.getCustomBoolean("buysAICores");
79 valueMult = faction.getCustomFloat("AICoreValueMult");
80 repMult = faction.getCustomFloat("AICoreRepMult");
81
82 if (command.equals("selectCores")) {
84 } else if (command.equals("playerHasCores")) {
85 return playerHasCores();
86 } else if (command.equals("personCanAcceptCores")) {
87 return personCanAcceptCores();
88 }
89
90 return true;
91 }
92
93 protected boolean personCanAcceptCores() {
94 if (person == null || !buysAICores) return false;
95
96 return Ranks.POST_BASE_COMMANDER.equals(person.getPostId()) ||
97 Ranks.POST_STATION_COMMANDER.equals(person.getPostId()) ||
98 Ranks.POST_ADMINISTRATOR.equals(person.getPostId()) ||
99 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);
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
static FactoryAPI getFactory()
Definition Global.java:35
static SectorAPI getSector()
Definition Global.java:59
static void addCommodityLossText(String commodityId, int quantity, TextPanelAPI text)
static void addCreditsGainText(int credits, TextPanelAPI text)
static MemoryAPI getEntityMemory(Map< String, MemoryAPI > memoryMap)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
Definition FireBest.java:56
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
Definition AICores.java:55
CargoAPI createCargo(boolean unlimitedStacks)