Starsector API
Loading...
Searching...
No Matches
CoreReputationPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.List;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.FactionAPI;
10import com.fs.starfarer.api.campaign.RepLevel;
11import com.fs.starfarer.api.campaign.ReputationActionResponsePlugin;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.TextPanelAPI;
14import com.fs.starfarer.api.campaign.comm.CommMessageAPI;
15import com.fs.starfarer.api.campaign.comm.MessageParaAPI;
16import com.fs.starfarer.api.campaign.comm.MessageSectionAPI;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.characters.PersonAPI;
19import com.fs.starfarer.api.characters.RelationshipAPI;
20import com.fs.starfarer.api.impl.campaign.ids.Factions;
21import com.fs.starfarer.api.impl.campaign.ids.Tags;
22import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
23import com.fs.starfarer.api.impl.campaign.intel.MessageIntel;
24import com.fs.starfarer.api.ui.LabelAPI;
25import com.fs.starfarer.api.ui.TooltipMakerAPI;
26import com.fs.starfarer.api.util.Misc;
27
28public class CoreReputationPlugin implements ReputationActionResponsePlugin {
29
30 public static class MissionCompletionRep {
31 public float successDelta;
32 public RepLevel successLimit;
33 public float failureDelta;
34 public RepLevel failureLimit;
35 public MissionCompletionRep(float successDelta, RepLevel successLimit,
36 float failureDelta, RepLevel failureLimit) {
37 this.successDelta = successDelta;
38 this.successLimit = successLimit;
39 this.failureDelta = failureDelta;
40 this.failureLimit = failureLimit;
41 }
42
43 }
44
45 public static class RepActionEnvelope {
46 public RepActions action;
47 public Object param = null;
48 public CommMessageAPI message = null;
49 public TextPanelAPI textPanel = null;
50 public boolean addMessageOnNoChange = true;
51 public boolean withMessage = true;
52 public String reason;
53 public RepActionEnvelope(RepActions action, Object param) {
54 this.action = action;
55 this.param = param;
56 }
57 public RepActionEnvelope(RepActions action) {
58 this.action = action;
59 }
60// public RepActionEnvelope(RepActions action, Object param, CommMessageAPI message, boolean addMessageOnNoChange) {
61// this.action = action;
62// this.param = param;
63// this.message = message;
64// this.addMessageOnNoChange = addMessageOnNoChange;
65// }
66 public RepActionEnvelope(RepActions action, Object param, CommMessageAPI message, TextPanelAPI textPanel, boolean addMessageOnNoChange) {
67 this(action, param, message, textPanel, addMessageOnNoChange, true);
68 }
69 public RepActionEnvelope(RepActions action, Object param, TextPanelAPI textPanel, boolean addMessageOnNoChange) {
70 this(action, param, null, textPanel, addMessageOnNoChange, true);
71 }
72 public RepActionEnvelope(RepActions action, Object param, CommMessageAPI message, TextPanelAPI textPanel, boolean addMessageOnNoChange, boolean withMessage) {
73 this(action, param, message, textPanel, addMessageOnNoChange, withMessage, null);
74 }
75 public RepActionEnvelope(RepActions action, Object param, TextPanelAPI textPanel, boolean addMessageOnNoChange, boolean withMessage) {
76 this(action, param, null, textPanel, addMessageOnNoChange, withMessage, null);
77 }
78 public RepActionEnvelope(RepActions action, Object param, TextPanelAPI textPanel, boolean addMessageOnNoChange, boolean withMessage, String reason) {
79 this(action, param, null, textPanel, addMessageOnNoChange, withMessage, reason);
80 }
81 public RepActionEnvelope(RepActions action, Object param, CommMessageAPI message, TextPanelAPI textPanel, boolean addMessageOnNoChange, boolean withMessage, String reason) {
82 this.action = action;
83 this.param = param;
84 this.message = message;
85 this.addMessageOnNoChange = addMessageOnNoChange;
86 this.textPanel = textPanel;
87 this.withMessage = withMessage;
88 this.reason = reason;
89 }
90 public RepActionEnvelope(RepActions action, Object param, TextPanelAPI textPanel) {
91 this.action = action;
92 this.param = param;
93 this.textPanel = textPanel;
94 }
95 }
96
97 public static class CustomRepImpact {
98 public float delta = 0;
99 public RepLevel limit = null;
100 public RepLevel ensureAtBest = null;
101 public RepLevel ensureAtWorst = null;
102 public RepLevel requireAtBest = null;
103 public RepLevel requireAtWorst = null;
104 }
105
106 public static enum RepActions {
107 COMBAT_NO_DAMAGE_ESCAPE, // now unused
108
109 COMBAT_NORMAL,
110 COMBAT_AGGRESSIVE,
111
112 COMBAT_NORMAL_TOFF,
113 COMBAT_AGGRESSIVE_TOFF,
114
115 COMBAT_HELP_MINOR,
116 COMBAT_HELP_MAJOR,
117 COMBAT_HELP_CRITICAL,
118
119 COMBAT_FRIENDLY_FIRE,
120
121 FOOD_SHORTAGE_PLAYER_ENDED_FAST,
122 FOOD_SHORTAGE_PLAYER_ENDED_NORMAL,
123
124 SYSTEM_BOUNTY_REWARD,
125 PERSON_BOUNTY_REWARD,
126 COMBAT_WITH_ENEMY,
127
128 TRADE_EFFECT,
129 SMUGGLING_EFFECT,
130 TRADE_WITH_ENEMY,
131
132 OTHER_FACTION_GOOD_REP_INVESTIGATION_MINOR,
133 OTHER_FACTION_GOOD_REP_INVESTIGATION_MAJOR,
134 OTHER_FACTION_GOOD_REP_INVESTIGATION_CRITICAL,
135
136 SMUGGLING_INVESTIGATION_GUILTY,
137 COMM_SNIFFER_INVESTIGATION_GUILTY,
138 FOOD_INVESTIGATION_GUILTY,
139 FOOD_INVESTIGATION_GUILTY_MAJOR,
140
141 CAUGHT_INSTALLING_SNIFFER,
142
143 CUSTOMS_NOTICED_EVADING,
144 CUSTOMS_CAUGHT_SMUGGLING,
145 CUSTOMS_REFUSED_TOLL,
146 CUSTOMS_REFUSED_FINE,
147 CUSTOMS_COULD_NOT_AFFORD,
148 CUSTOMS_PAID,
149
150 REP_DECAY_POSITIVE,
151 //REP_DECAY_NEGATIVE,
152
153 TRANSPONDER_OFF,
154 TRANSPONDER_OFF_REFUSE,
155
156 CARGO_SCAN_REFUSE,
157
158 MISSION_SUCCESS,
159 MISSION_FAILURE,
160
161 MAKE_SUSPICOUS_AT_WORST,
162
163 MAKE_HOSTILE_AT_BEST,
164 COMMISSION_ACCEPT,
165 COMMISSION_BOUNTY_REWARD,
166
167 COMMISSION_NEUTRAL_BATTLE_PENALTY,
168 COMMISSION_PENALTY_HOSTILE_TO_NON_ENEMY,
169
170 SHRINE_OFFERING,
171
172 INTERDICTED,
173
174 CUSTOM,
175// MISSION_COMPLETED_MINOR,
176// MISSION_COMPLETED_MEDIUM,
177// MISSION_COMPLETED_IMPORTANT,
178//
179// MISSION_FAILED_MINOR,
180// MISSION_FAILED_MEDIUM,
181// MISSION_FAILED_IMPORTANT,
182
183
184 }
185
186 public static class RepRewards {
187 public static final float TINY = 0.01f;
188 public static final float SMALL = 0.02f;
189 public static final float MEDIUM = 0.03f;
190 public static final float HIGH = 0.05f;
191 public static final float VERY_HIGH = 0.07f;
192 public static final float EXTREME = 0.1f;
193 }
194
195
196
197
198 public ReputationAdjustmentResult handlePlayerReputationAction(Object action, final String factionId) {
199 //final FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
200 final FactionAPI faction = Global.getSector().getFaction(factionId);
201 if (faction == null) return new ReputationAdjustmentResult(0);
202 return handlePlayerReputationActionInner(action, factionId, null, faction.getRelToPlayer());
203 }
204
205
206 public ReputationAdjustmentResult handlePlayerReputationAction(Object action, PersonAPI person) {
207 return handlePlayerReputationActionInner(action, person.getFaction().getId(), person, person.getRelToPlayer());
208 }
209
210
211 public ReputationAdjustmentResult handlePlayerReputationActionInner(Object actionObject,
212 String factionId,
213 PersonAPI person,
214 RelationshipAPI delegate) {
215 if (!(actionObject instanceof RepActionEnvelope) && !(actionObject instanceof RepActions)) {
216 return new ReputationAdjustmentResult(0);
217 }
218
219 if (Factions.NEUTRAL.equals(factionId)) {
220 return new ReputationAdjustmentResult(0);
221 }
222
223// FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
224 FactionAPI faction = Global.getSector().getFaction(factionId);
225
226 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
227
228 RepActions action = null;
229 String reason = null;
230 Object param = null;
231 CommMessageAPI message = null;
232 TextPanelAPI panel = null;
233 boolean withMessage = true;
234 boolean addMessageOnNoChange = true;
235 if (actionObject instanceof RepActions) {
236 action = (RepActions) actionObject;
237 param = null;
238 } else if (actionObject instanceof RepActionEnvelope) {
239 RepActionEnvelope envelope = (RepActionEnvelope) actionObject;
240 action = envelope.action;
241 param = envelope.param;
242 message = envelope.message;
243 panel = envelope.textPanel;
244 addMessageOnNoChange = envelope.addMessageOnNoChange;
245 withMessage = envelope.withMessage;
246 reason = envelope.reason;
247 }
248
249 float delta = 0;
250 RepLevel limit = null;
251 RepLevel ensureAtBest = null;
252 RepLevel ensureAtWorst = null;
253 RepLevel requireAtBest = null;
254 RepLevel requireAtWorst = null;
255 //RepLevel curr = player.getRelationshipLevel(faction);
256 RepLevel curr = delegate.getLevel();
257
258 if (action == RepActions.CUSTOM) {
259 if (!(param instanceof CustomRepImpact)) {
260 throw new RuntimeException("For RepActions.CUSTOM, use CustomRepImpact as a param in a RepActionEnvelope");
261 }
262
263 CustomRepImpact impact = (CustomRepImpact) param;
264
265 delta = impact.delta;
266 limit = impact.limit;
267 ensureAtBest = impact.ensureAtBest;
268 ensureAtWorst = impact.ensureAtWorst;
269 requireAtBest = impact.requireAtBest;
270 requireAtWorst = impact.requireAtWorst;
271 }
272
273 switch (action) {
274 case COMBAT_HELP_MINOR:
275 delta = RepRewards.TINY;
276 limit = RepLevel.WELCOMING;
277 requireAtWorst = RepLevel.INHOSPITABLE;
278 break;
279 case COMBAT_HELP_MAJOR:
280 delta = RepRewards.MEDIUM;
281 limit = RepLevel.FRIENDLY;
282 requireAtWorst = RepLevel.INHOSPITABLE;
283 break;
284 case COMBAT_HELP_CRITICAL:
285 delta = RepRewards.HIGH;
286 limit = RepLevel.COOPERATIVE;
287 requireAtWorst = RepLevel.INHOSPITABLE;
288 break;
289// case COMBAT_NO_DAMAGE_ESCAPE:
290// if (delegate.isAtWorst(RepLevel.FAVORABLE)) {
291// delta = -RepRewards.HIGH;
292// } else {
293// delta = -RepRewards.SMALL;
294// }
295// limit = RepLevel.HOSTILE;
296// break;
297 case COMBAT_FRIENDLY_FIRE:
298 float fpHull = (float) Math.ceil((Float) param);
299 if (fpHull >= 20f) {
300 fpHull = 0f;
301 ensureAtBest = RepLevel.HOSTILE;
302 }
303 delta = -1f * fpHull * 0.01f;
304 break;
305 case COMBAT_NORMAL:
306 delta = -RepRewards.MEDIUM;
307 limit = RepLevel.VENGEFUL;
308 ensureAtBest = RepLevel.HOSTILE;
309 break;
310 case COMBAT_AGGRESSIVE:
311 delta = -RepRewards.HIGH;
312 limit = RepLevel.VENGEFUL;
313 ensureAtBest = RepLevel.HOSTILE;
314 break;
315 case COMBAT_NORMAL_TOFF:
316 delta = -RepRewards.MEDIUM;
317 limit = RepLevel.VENGEFUL;
318 break;
319 case COMBAT_AGGRESSIVE_TOFF:
320 delta = -RepRewards.HIGH;
321 limit = RepLevel.VENGEFUL;
322 break;
323 case FOOD_SHORTAGE_PLAYER_ENDED_FAST:
324 delta = getRepRewardForFoodShortage(action, (MarketAPI) param);
325 limit = RepLevel.FRIENDLY;
326 requireAtWorst = RepLevel.INHOSPITABLE;
327 break;
328 case FOOD_SHORTAGE_PLAYER_ENDED_NORMAL:
329 delta = getRepRewardForFoodShortage(action, (MarketAPI) param);
330 limit = RepLevel.WELCOMING;
331 requireAtWorst = RepLevel.INHOSPITABLE;
332 break;
333 case SYSTEM_BOUNTY_REWARD:
334 float fp = (Float) param;
335 if (fp < 10) {
336 delta = RepRewards.SMALL;
337 limit = RepLevel.WELCOMING;
338 } else if (fp < 30) {
339 delta = RepRewards.MEDIUM;
340 limit = RepLevel.FRIENDLY;
341 } else {
342 delta = RepRewards.HIGH;
343 limit = RepLevel.COOPERATIVE;
344 }
345 requireAtWorst = RepLevel.VENGEFUL;
346 break;
347 case PERSON_BOUNTY_REWARD:
348 delta = RepRewards.MEDIUM;
349 limit = RepLevel.COOPERATIVE;
350 requireAtWorst = RepLevel.VENGEFUL;
351 break;
352 case COMBAT_WITH_ENEMY:
353 fp = (Float) param;
354 if (fp < 10) {
355 delta = RepRewards.TINY;
356 limit = RepLevel.WELCOMING;
357 } else if (fp < 30) {
358 delta = RepRewards.SMALL;
359 limit = RepLevel.FRIENDLY;
360 } else {
361 delta = RepRewards.MEDIUM;
362 limit = RepLevel.COOPERATIVE;
363 }
364 requireAtWorst = RepLevel.VENGEFUL;
365 break;
366 case TRADE_EFFECT:
367 delta = (Float) param * 0.01f;
368 limit = RepLevel.WELCOMING;
369 //if (faction.getId().equals(Factions.PIRATES)) {
370// if (faction.getCustom().optBoolean(Factions.CUSTOM_WILL_TRADE_WHEN_HOSTILE)) {
371// requireAtWorst = RepLevel.HOSTILE;
372// } else {
373 requireAtWorst = RepLevel.INHOSPITABLE;
374// }
375 break;
376 case SMUGGLING_EFFECT:
377 delta = -(Float) param * 0.01f;
378 limit = RepLevel.INHOSPITABLE;
379 break;
380 case TRADE_WITH_ENEMY:
381 delta = -(Float) param * 0.01f;
382 limit = RepLevel.HOSTILE;
383 break;
384 case SMUGGLING_INVESTIGATION_GUILTY:
385 delta = -RepRewards.HIGH;
386 limit = RepLevel.HOSTILE;
387 ensureAtBest = RepLevel.INHOSPITABLE;
388 break;
389 case OTHER_FACTION_GOOD_REP_INVESTIGATION_MINOR:
390 delta = -RepRewards.HIGH;
391 limit = RepLevel.HOSTILE;
392 break;
393 case OTHER_FACTION_GOOD_REP_INVESTIGATION_MAJOR:
394 delta = -RepRewards.HIGH;
395 limit = RepLevel.HOSTILE;
396 ensureAtBest = RepLevel.INHOSPITABLE;
397 break;
398 case OTHER_FACTION_GOOD_REP_INVESTIGATION_CRITICAL:
399 delta = -RepRewards.HIGH;
400 limit = RepLevel.HOSTILE;
401 ensureAtBest = RepLevel.HOSTILE;
402 break;
403 case CAUGHT_INSTALLING_SNIFFER:
404 delta = -RepRewards.TINY;
405 limit = RepLevel.INHOSPITABLE;
406 break;
407 case COMM_SNIFFER_INVESTIGATION_GUILTY:
408 delta = -RepRewards.SMALL;
409 limit = RepLevel.INHOSPITABLE;
410 break;
411 case FOOD_INVESTIGATION_GUILTY:
412 delta = -RepRewards.HIGH;
413 limit = RepLevel.INHOSPITABLE;
414 break;
415 case FOOD_INVESTIGATION_GUILTY_MAJOR:
416 delta = -RepRewards.HIGH;
417 limit = RepLevel.HOSTILE;
418 ensureAtBest = RepLevel.SUSPICIOUS;
419 break;
420 case CUSTOMS_NOTICED_EVADING:
421 delta = -RepRewards.MEDIUM;
422 limit = RepLevel.HOSTILE;
423 break;
424 case CUSTOMS_CAUGHT_SMUGGLING:
425 delta = -(Float) param * 0.01f;
426 limit = RepLevel.HOSTILE;
427 break;
428 case CUSTOMS_REFUSED_TOLL:
429 delta = -RepRewards.MEDIUM;
430 limit = RepLevel.HOSTILE;
431 break;
432 case CUSTOMS_REFUSED_FINE:
433 delta = -RepRewards.VERY_HIGH;
434 limit = RepLevel.HOSTILE;
435 break;
436 case CUSTOMS_COULD_NOT_AFFORD:
437 delta = -RepRewards.SMALL;
438 limit = RepLevel.INHOSPITABLE;
439 break;
440 case CUSTOMS_PAID:
441 delta = RepRewards.TINY;
442 limit = RepLevel.WELCOMING;
443 break;
444 case REP_DECAY_POSITIVE:
445 delta = .15f;
446 limit = RepLevel.NEUTRAL;
447 requireAtWorst = RepLevel.INHOSPITABLE;
448 break;
449 case MISSION_SUCCESS:
450 MissionCompletionRep rep = (MissionCompletionRep) param;
451 delta = rep.successDelta;
452 limit = rep.successLimit;
453 break;
454 case MISSION_FAILURE:
455 rep = (MissionCompletionRep) param;
456 delta = rep.failureDelta;
457 limit = rep.failureLimit;
458 break;
459 case TRANSPONDER_OFF:
460 if (person != null) {
461 delta = -RepRewards.MEDIUM;
462 } else {
463 delta = -RepRewards.SMALL;
464 }
465 limit = RepLevel.HOSTILE;
466 break;
467 case TRANSPONDER_OFF_REFUSE:
468 case CARGO_SCAN_REFUSE:
469 if (person != null) {
470 delta = -RepRewards.HIGH;
471 } else {
472 delta = -RepRewards.MEDIUM;
473 }
474 limit = RepLevel.HOSTILE;
475 break;
476 case COMMISSION_ACCEPT:
477 delta = RepRewards.HIGH;
478 break;
479 case SHRINE_OFFERING:
480 delta = RepRewards.MEDIUM;
481 limit = RepLevel.FRIENDLY;
482 break;
483 case INTERDICTED:
484 delta = -RepRewards.TINY;
485 limit = RepLevel.INHOSPITABLE;
486 break;
487 case MAKE_HOSTILE_AT_BEST:
488 delta = 0;
489 ensureAtBest = RepLevel.HOSTILE;
490 break;
491 case MAKE_SUSPICOUS_AT_WORST:
492 delta = 0;
493 ensureAtWorst = RepLevel.SUSPICIOUS;
494 break;
495 case COMMISSION_BOUNTY_REWARD:
496 fp = (Float) param;
497 if (fp < 20) {
498 delta = RepRewards.TINY;
499 limit = RepLevel.FRIENDLY;
500 } else if (fp < 50) {
501 delta = RepRewards.SMALL;
502 limit = RepLevel.COOPERATIVE;
503 } else {
504 delta = RepRewards.MEDIUM;
505 limit = RepLevel.COOPERATIVE;
506 }
507 break;
508 case COMMISSION_PENALTY_HOSTILE_TO_NON_ENEMY:
509 //delta = -RepRewards.MEDIUM;
510 fp = (Float) param;
511 if (fp < 20) {
512 delta = -RepRewards.TINY;
513 } else if (fp < 50) {
514 delta = -RepRewards.SMALL;
515 } else {
516 delta = -RepRewards.MEDIUM;
517 }
518 limit = RepLevel.INHOSPITABLE;
519 break;
520 }
521
522 if (delta < 0 && delta > -0.01f) delta = -0.01f;
523 if (delta > 0 && delta < 0.01f) delta = 0.01f;
524 delta = Math.round(delta * 100f) / 100f;
525
526 if (delegate.getTarget() == Global.getSector().getPlayerFaction()) {
527 delta = 0;
528 }
529 if (delegate.getTarget() == Global.getSector().getPlayerPerson()) {
530 delta = 0;
531 }
532
533 float deltaSign = Math.signum(delta);
534 //float before = player.getRelationship(faction.getId());
535 float before = delegate.getRel();
536
537 if (ensureAtBest != null) {
538 delegate.ensureAtBest(ensureAtBest);
539 }
540 if (ensureAtWorst != null) {
541 delegate.ensureAtWorst(ensureAtWorst);
542 }
543
544 if ((requireAtBest == null || curr.isAtBest(requireAtBest)) &&
545 (requireAtWorst == null || curr.isAtWorst(requireAtWorst))) {
546 delegate.adjustRelationship(delta, limit);
547 }
548
549 //float after = player.getRelationship(faction.getId());
550 float after = delegate.getRel();
551 delta = after - before;
552
553 //if (delta != 0) {
554 if (withMessage) {
555 if (Math.abs(delta) >= 0.005f) {
556 addAdjustmentMessage(delta, faction, person, message, panel, null, null, true, 0f, reason);
557 } else if (deltaSign != 0 && addMessageOnNoChange) {
558 addNoChangeMessage(deltaSign, faction, person, message, panel, null, null, true, 0f, reason);
559 }
560 }
561
562 if (delta != 0) {
563 if (person == null) {
564 Global.getSector().reportPlayerReputationChange(faction.getId(), delta);
565 } else {
566 Global.getSector().reportPlayerReputationChange(person, delta);
567 }
568 }
569
570 return new ReputationAdjustmentResult(delta);
571 }
572
573
574 private float getRepRewardForFoodShortage(RepActions action, MarketAPI market) {
575 float mult = (float) market.getSize() / 10f + 0.5f;
576 float delta = 0;
577 switch (action) {
578 case FOOD_SHORTAGE_PLAYER_ENDED_NORMAL:
579 delta = RepRewards.MEDIUM;
580 break;
581 case FOOD_SHORTAGE_PLAYER_ENDED_FAST:
582 delta = RepRewards.HIGH;
583 break;
584 }
585 return delta * mult;
586 }
587
588
589
590 public static void addDeltaMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel,
591 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad) {
592 if (delta == 0) {
593 addNoChangeMessage(delta, faction, person, null, panel, info, tc, withCurrent, pad);
594 } else {
595 addAdjustmentMessage(delta, faction, person, null, panel, info, tc, withCurrent, pad);
596 }
597
598 }
599 public static void addNoChangeMessage(float deltaSign, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel,
600 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad) {
601 addNoChangeMessage(deltaSign, faction, person, message, panel, info, tc, withCurrent, pad, null);
602 }
603 public static void addNoChangeMessage(float deltaSign, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel,
604 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad, String reason) {
605 FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
606// String standing = player.getRelationshipLevel(faction).getDisplayName();
607// standing = standing.toLowerCase();
608 RepLevel level = player.getRelationshipLevel(faction.getId());
609 int repInt = RepLevel.getRepInt(player.getRelationship(faction.getId()));
610
611 Color textColor = Global.getSettings().getColor("standardTextColor");
612 Color factionColor = faction.getBaseUIColor();
613 Color relColor = faction.getRelColor(player.getId());
614 String targetName = faction.getDisplayNameWithArticle();
615 String targetNameHighlight = faction.getDisplayName();
616 if (Factions.INDEPENDENT.equals(faction.getId())) {
617 targetName = faction.getDisplayNameLongWithArticle();
618 targetNameHighlight = faction.getDisplayNameLong();
619 }
620
621 if (person != null) {
622 targetName = person.getName().getFullName();
623 relColor = person.getRelToPlayer().getRelColor();
624 repInt = RepLevel.getRepInt(person.getRelToPlayer().getRel());
625 level = person.getRelToPlayer().getLevel();
626 }
627
628 String standing = "" + repInt + "/100" + " (" + level.getDisplayName().toLowerCase() + ")";
629
630
631
632
633 String text = "Your relationship with " + targetName +
634 ", currently at " + standing + ", is already well-established and is not affected by your recent actions";
635
636 if (panel == null && info == null) {
637// Global.getSector().getCampaignUI().addMessage(text, textColor,
638// standing,
639// relColor);
640
641 MessageIntel intel = new MessageIntel();
642 if (person == null) {
643 intel.addLine("Relationship with " + targetName + " not affected", null,
644 new String[] {targetNameHighlight},
645 factionColor);
646 intel.addLine(BaseIntelPlugin.BULLET + "Currently at %s", null, new String[]{standing}, relColor);
647 if (reason != null) intel.addLine(BaseIntelPlugin.BULLET + reason);
648 intel.setIcon(faction.getCrest());
649 } else {
650 intel.addLine("Relationship with " + targetName + " not affected");
651 intel.addLine(BaseIntelPlugin.BULLET + "Currently at %s", null, new String[]{standing}, relColor);
652 if (reason != null) intel.addLine(BaseIntelPlugin.BULLET + reason);
653 intel.setIcon(person.getPortraitSprite());
654 }
655 //intel.setIcon(Global.getSettings().getSpriteName("intel_categories", "reputation"));
656 Global.getSector().getCampaignUI().addMessage(intel);
657 }
658
659 if (panel != null) {
660 if (panel.getDialog() != null) {
661 SectorEntityToken target = panel.getDialog().getInteractionTarget();
662 if (target != null) {
663 if (target.getActivePerson() != null) {
664 target.getActivePerson().getMemory();
665 }
666 target.getMemory();
667 }
668 }
669 }
670
671 if (text != null) {
672 if (message != null) {
673 text = text.replaceAll(" by your recent actions", " by this.");
674 appendToSection2(text, message);
675 appendToSectionHighlights(message.getSection2(),
676 new String [] {standing},
677 new Color [] {relColor});
678
679 message.addTag(Tags.REPORT_REP);
680 if (person == null) {
681 message.getCustomMap().put(CommMessageAPI.MESSAGE_FACTION_ID_KEY, faction.getId());
682 } else {
683 message.getCustomMap().put(CommMessageAPI.MESSAGE_PERSON_ID_KEY, person.getId());
684 }
685 //message.setSmallIcon(faction.getLogo());
686 }
687
688 if (panel != null) {
689 text = text.replaceAll(" by your recent actions", "");
690 printToTextPanel(panel, text,
691 new String [] {standing},
692 new Color [] {relColor});
693 }
694 }
695
696 if (info != null) {
697 if (person == null) {
698 LabelAPI label = info.addPara("Relationship with " + targetName + " not affected", tc, pad);
699 label.setHighlight(targetNameHighlight);
700 label.setHighlightColors(factionColor);
701 if (withCurrent) info.addPara("Currently at %s", 0f, tc, relColor, standing);
702 } else {
703 LabelAPI label = info.addPara("Relationship with " + targetName + " not affected", tc, pad);
704 if (withCurrent) info.addPara("Currently at %s", 0f, tc, relColor, standing);
705 }
706 }
707 }
708
709
710 public static void addCurrentStanding(FactionAPI faction, PersonAPI person, TextPanelAPI panel,
711 TooltipMakerAPI info, Color tc, float pad) {
712 FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
713 RepLevel level = player.getRelationshipLevel(faction.getId());
714 int repInt = RepLevel.getRepInt(player.getRelationship(faction.getId()));
715
716 Color factionColor = faction.getBaseUIColor();
717 Color relColor = faction.getRelColor(player.getId());
718 String targetName = faction.getDisplayNameWithArticle();
719 String targetNameHighlight = faction.getDisplayName();
720 if (Factions.INDEPENDENT.equals(faction.getId())) {
721 targetName = faction.getDisplayNameLongWithArticle();
722 targetNameHighlight = faction.getDisplayNameLong();
723 }
724
725 if (person != null) {
726 targetName = person.getName().getFullName();
727 relColor = person.getRelToPlayer().getRelColor();
728 repInt = RepLevel.getRepInt(person.getRelToPlayer().getRel());
729 level = person.getRelToPlayer().getLevel();
730 }
731
732 String standing = "" + repInt + "/100" + " (" + level.getDisplayName().toLowerCase() + ")";
733
734 String text = "Current standing with " + targetName +
735 " is " + standing + "";
736
737 if (panel != null) {
738 printToTextPanel(panel, text,
739 new String [] {targetNameHighlight, standing},
740 new Color [] {factionColor, relColor});
741 }
742
743 if (info != null) {
744 String end = "";
745 if (pad > 0) {
746 end = ".";
747 }
748 if (person == null) {
749 LabelAPI label = info.addPara("Current standing with " + targetName +
750 " is %s" + end, pad, tc, relColor, standing);
751 label.setHighlight(targetNameHighlight, standing);
752 label.setHighlightColors(factionColor, relColor);
753 } else {
754 LabelAPI label = info.addPara("Current standing with " + targetName +
755 " is %s" + end, pad, tc, relColor, standing);
756 label.setHighlight(targetNameHighlight, standing);
757 label.setHighlightColors(factionColor, relColor);
758 }
759 }
760 }
761
762 public static void addRequiredStanding(FactionAPI faction, RepLevel req, PersonAPI person, TextPanelAPI panel,
763 TooltipMakerAPI info, Color tc, float pad, boolean orBetter) {
764 FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
765 RepLevel level = req;
766
767 float rel = level.getMin() + 0.01f;
768
769 PersonAPI fake = Global.getFactory().createPerson();
770 fake.getRelToPlayer().setRel(rel);
771
772 int repInt = RepLevel.getRepInt(rel);
773 Color relColor = fake.getRelToPlayer().getRelColor(level);
774
775
776 Color factionColor = faction.getBaseUIColor();
777 String targetName = faction.getDisplayNameWithArticle();
778 String targetNameHighlight = faction.getDisplayName();
779 if (Factions.INDEPENDENT.equals(faction.getId())) {
780 targetName = faction.getDisplayNameLongWithArticle();
781 targetNameHighlight = faction.getDisplayNameLong();
782 }
783
784 if (person != null) {
785 targetName = person.getName().getFullName();
786 relColor = person.getRelToPlayer().getRelColor();
787 }
788
789
790 String standing = "" + repInt + "/100" + " (" + level.getDisplayName().toLowerCase() + ")";
791
792 String mid = "or better";
793 if (!orBetter) {
794 mid = "or worse";
795 }
796 String text = "Requires " + standing + " " + mid + " standing with " + targetName;
797
798 if (panel != null) {
799 printToTextPanel(panel, text,
800 new String [] {standing, targetNameHighlight},
801 new Color [] {relColor, factionColor});
802 }
803
804 if (info != null) {
805 String end = "";
806 if (pad > 0) {
807 end = ".";
808 }
809 if (person == null) {
810 LabelAPI label = info.addPara("Requires %s " + mid + " standing with " + targetName + end,
811 pad, tc, relColor, standing);
812 label.setHighlight(standing, targetNameHighlight);
813 label.setHighlightColors(relColor, factionColor);
814 } else {
815 LabelAPI label = info.addPara("Requires %s " + mid + " standing with " + targetName + end,
816 pad, tc, relColor, standing);
817 label.setHighlight(standing, targetNameHighlight);
818 label.setHighlightColors(relColor, factionColor);
819 }
820 }
821 }
822
823
824 public static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person,
825 TextPanelAPI panel,
826 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad) {
827 addAdjustmentMessage(delta, faction, person, null, panel, info, tc, withCurrent, pad, null);
828 }
829 public static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person,
830 CommMessageAPI message, TextPanelAPI panel,
831 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad) {
832 addAdjustmentMessage(delta, faction, person, message, panel, info, tc, withCurrent, pad, null);
833 }
834 public static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person,
835 TextPanelAPI panel,
836 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad,
837 String reason) {
838 addAdjustmentMessage(delta, faction, person, null, panel, info, tc, withCurrent, pad, reason);
839 }
840 public static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person,
841 CommMessageAPI message, TextPanelAPI panel,
842 TooltipMakerAPI info, Color tc, boolean withCurrent, float pad,
843 String reason) {
844 FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
845
846 //faction may be null here if it's w/ person
847
848 RepLevel level = null;
849 int deltaInt = (int) Math.round((Math.abs(delta) * 100f));
850 String targetName = null;
851 String targetNameHighlight = null;
852 Color relColor = null;
853
854 int repInt = 0;
855 if (faction != null) {
856 level = player.getRelationshipLevel(faction.getId());
857 repInt = RepLevel.getRepInt(player.getRelationship(faction.getId()));
858 targetName = faction.getDisplayNameWithArticle();
859 targetNameHighlight = faction.getDisplayName();
860 if (Factions.INDEPENDENT.equals(faction.getId())) {
861 targetName = faction.getDisplayNameLongWithArticle();
862 targetNameHighlight = faction.getDisplayNameLong();
863 }
864 relColor = faction.getRelColor(player.getId());
865 }
866
867 if (person != null) {
868 targetName = person.getName().getFullName();
869 relColor = person.getRelToPlayer().getRelColor();
870 repInt = RepLevel.getRepInt(person.getRelToPlayer().getRel());
871 level = person.getRelToPlayer().getLevel();
872 }
873
874 String standing = "" + repInt + "/100" + " (" + level.getDisplayName().toLowerCase() + ")";
875 String text = null;
876
877
878 Color textColor = Global.getSettings().getColor("standardTextColor");
879 //Color textColor = Global.getSettings().getColor("textGrayColor");
880 Color factionColor = null;
881 if (faction != null) factionColor = faction.getBaseUIColor();
882
883 Color deltaColor = Global.getSettings().getColor("textFriendColor");
884 String deltaString = "improved by " + deltaInt;
885 if (Math.abs(delta) <= 0.0049f || deltaInt == 0) {
886 deltaString = "not affected";
887 deltaColor = tc;
888 } else if (delta < 0) {
889 deltaColor = Misc.getNegativeHighlightColor();
890 deltaString = "reduced by " + deltaInt;
891 }
892
893 text = "Relationship with " + targetName + " " + deltaString + ", currently at " + standing + "";
894
895 if (panel == null && info == null) {
896// Global.getSector().getCampaignUI().addMessage(text, textColor,
897// deltaString, standing,
898// deltaColor, relColor);
899
900 MessageIntel intel = new MessageIntel();
901 if (person == null) {
902 intel.addLine("Relationship with " + targetName + " " + deltaString, null,
903 new String[] {targetNameHighlight, deltaString},
904 factionColor, deltaColor);
905 intel.addLine(BaseIntelPlugin.BULLET + "Currently at %s", null, new String[]{standing}, relColor);
906 if (reason != null) intel.addLine(BaseIntelPlugin.BULLET + reason);
907 if (faction != null) intel.setIcon(faction.getCrest());
908 } else {
909 intel.addLine("Relationship with " + targetName + " " + deltaString, null,
910 new String[] {deltaString},
911 deltaColor);
912 intel.addLine(BaseIntelPlugin.BULLET + "Currently at %s", null, new String[]{standing}, relColor);
913 if (reason != null) intel.addLine(BaseIntelPlugin.BULLET + reason);
914 intel.setIcon(person.getPortraitSprite());
915 }
916 //intel.setIcon(Global.getSettings().getSpriteName("intel_categories", "reputation"));
917 Global.getSector().getCampaignUI().addMessage(intel);
918 }
919
920 if (text != null) {
921
922 if (message != null) {
923 text += ".";
924 appendToSection2(text, message);
925
926 appendToSectionHighlights(message.getSection2(),
927 new String [] {deltaString, standing},
928 new Color [] {deltaColor, relColor});
929
930 message.addTag(Tags.REPORT_REP);
931 if (person == null) {
932 message.getCustomMap().put(CommMessageAPI.MESSAGE_FACTION_ID_KEY, faction.getId());
933 } else {
934 message.getCustomMap().put(CommMessageAPI.MESSAGE_PERSON_ID_KEY, person.getId());
935 }
936 //message.setSmallIcon(faction.getLogo());
937 }
938
939 if (panel != null) {
940 printToTextPanel(panel, text,
941 new String [] {deltaString, standing},
942 new Color [] {deltaColor, relColor});
943 }
944 }
945
946 if (info != null) {
947 if (person == null) {
948// LabelAPI label = info.addPara("Relationship with " + targetName + " " + deltaString +
949// ", currently " + standing, tc, pad);
950// label.setHighlight(targetNameHighlight, deltaString, standing);
951// label.setHighlightColors(factionColor, deltaColor, relColor);
952// if (delta > 0) {
953// deltaString = "+" + deltaInt;
954// } else if (delta < 0) {
955// deltaString = "-" + deltaInt;
956// } else {
957// deltaString = "" + deltaInt;
958// }
959// LabelAPI label = info.addPara(faction.getDisplayName() + " reputation " + deltaString, tc, pad);
960// label.setHighlight(targetNameHighlight, deltaString);
961// label.setHighlightColors(factionColor, deltaColor);
962
963 LabelAPI label = info.addPara("Relationship with " + targetName + " " + deltaString, tc, pad);
964 label.setHighlight(targetNameHighlight, deltaString);
965 label.setHighlightColors(factionColor, deltaColor);
966 //info.setBulletedListMode(BaseIntelPlugin.INDENT);
967 if (withCurrent) info.addPara("Currently at %s", 0f, tc, relColor, standing);
968 //info.setBulletedListMode(BaseIntelPlugin.BULLET);
969 } else {
970 LabelAPI label = info.addPara("Relationship with " + targetName + " " + deltaString, tc, pad);
971 label.setHighlight(deltaString);
972 label.setHighlightColors(deltaColor);
973 if (withCurrent) info.addPara("Currently at %s", 0f, tc, relColor, standing);
974 }
975 }
976 }
977
978 private static void printToTextPanel(TextPanelAPI panel, String text, String [] highlights, Color [] colors) {
979 Color textColor = Global.getSettings().getColor("textGrayColor");
980 panel.setFontSmallInsignia();
981 panel.addParagraph(text, textColor);
982 panel.highlightInLastPara(highlights);
983 panel.setHighlightColorsInLastPara(colors);
984 panel.setFontInsignia();
985 }
986
987 private static void appendToSectionHighlights(MessageSectionAPI section, String [] strings, Color [] colors) {
988 String [] currStrings = section.getHighlights();
989 Color [] currColors = section.getHighlightColors();
990 if (currStrings == null) {
991 section.setHighlights(strings);
992 section.setHighlightColors(colors);
993 } else {
994 List<String> stringList = new ArrayList<String>();
995 for (String s : currStrings) stringList.add(s);
996 for (String s : strings) stringList.add(s);
997
998 List<Color> colorList = new ArrayList<Color>();
999 for (Color s : currColors) colorList.add(s);
1000 for (Color s : colors) colorList.add(s);
1001
1002 section.setHighlights(stringList.toArray(new String [0]));
1003 section.setHighlightColors(colorList.toArray(new Color [0]));
1004 }
1005 }
1006
1007 private static void appendToSection2(String text, CommMessageAPI message) {
1008 List<MessageParaAPI> body = message.getSection2().getBody();
1009 if (body.isEmpty()) {
1010 message.getSection2().addPara(text);
1011 } else {
1012 MessageParaAPI lastPara = body.get(body.size() - 1);
1013 String str = lastPara.getBody();
1014 str = str + "\n\n" + text;
1015 lastPara.setBody(str);
1016 }
1017 }
1018
1019
1020
1021
1022// public static int otherRepInt(float f) {
1023// int repInt = (int) Math.ceil((Math.round(f * 100f)));
1024// return repInt;
1025// }
1026//
1027// public static void main(String[] args) {
1028// float [] tests = new float [] {
1029// 0.1f,
1030// 0.0951f,
1031// 0.105f,
1032// 0.090001f,
1033// 0.099999999f,
1034// -0.1f,
1035// -0.0951f,
1036// -0.105f,
1037// -0.090001f,
1038// -0.099999999f,
1039// };
1040//
1041// for (float f : tests) {
1042// System.out.println(String.format("In: %s, old: %s, new: %s", "" + f, "" + otherRepInt(f), "" + RepLevel.getRepInt(f)));
1043// }
1044//
1052//
1053// for (float f = -1; f <= 1f; f += 0.00001f) {
1054// int i = RepLevel.getRepInt(f);
1055// RepLevel level = RepLevel.getLevelFor(f);
1056// RepLevel fromInt = RepLevel.getLevelFor(i / 100f);
1057// if (level != fromInt) {
1058// System.out.println("FAILED FOR: " + f + ", should be " + level + ", is " + fromInt);
1062// }
1063// }
1064// }
1065}
1066
1067
1068
1069
static SettingsAPI getSettings()
Definition Global.java:51
static FactoryAPI getFactory()
Definition Global.java:35
static SectorAPI getSector()
Definition Global.java:59
ReputationAdjustmentResult handlePlayerReputationActionInner(Object actionObject, String factionId, PersonAPI person, RelationshipAPI delegate)
static void addRequiredStanding(FactionAPI faction, RepLevel req, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad, boolean orBetter)
static void addNoChangeMessage(float deltaSign, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad, String reason)
static void addNoChangeMessage(float deltaSign, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
ReputationAdjustmentResult handlePlayerReputationAction(Object action, final String factionId)
static void addCurrentStanding(FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad, String reason)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad, String reason)
static void addAdjustmentMessage(float delta, FactionAPI faction, PersonAPI person, CommMessageAPI message, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)
ReputationAdjustmentResult handlePlayerReputationAction(Object action, PersonAPI person)
static void addDeltaMessage(float delta, FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, boolean withCurrent, float pad)