214 RelationshipAPI delegate) {
215 if (!(actionObject instanceof RepActionEnvelope) && !(actionObject instanceof RepActions)) {
216 return new ReputationAdjustmentResult(0);
219 if (Factions.NEUTRAL.equals(factionId)) {
220 return new ReputationAdjustmentResult(0);
228 RepActions action =
null;
229 String reason =
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;
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;
250 RepLevel limit =
null;
251 RepLevel ensureAtBest =
null;
252 RepLevel ensureAtWorst =
null;
253 RepLevel requireAtBest =
null;
254 RepLevel requireAtWorst =
null;
256 RepLevel curr = delegate.getLevel();
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");
263 CustomRepImpact impact = (CustomRepImpact) param;
265 delta = impact.delta;
266 limit = impact.limit;
267 ensureAtBest = impact.ensureAtBest;
268 ensureAtWorst = impact.ensureAtWorst;
269 requireAtBest = impact.requireAtBest;
270 requireAtWorst = impact.requireAtWorst;
274 case COMBAT_HELP_MINOR:
275 delta = RepRewards.TINY;
276 limit = RepLevel.WELCOMING;
277 requireAtWorst = RepLevel.INHOSPITABLE;
279 case COMBAT_HELP_MAJOR:
280 delta = RepRewards.MEDIUM;
281 limit = RepLevel.FRIENDLY;
282 requireAtWorst = RepLevel.INHOSPITABLE;
284 case COMBAT_HELP_CRITICAL:
285 delta = RepRewards.HIGH;
286 limit = RepLevel.COOPERATIVE;
287 requireAtWorst = RepLevel.INHOSPITABLE;
297 case COMBAT_FRIENDLY_FIRE:
298 float fpHull = (float) Math.ceil((Float) param);
301 ensureAtBest = RepLevel.HOSTILE;
303 delta = -1f * fpHull * 0.01f;
306 delta = -RepRewards.MEDIUM;
307 limit = RepLevel.VENGEFUL;
308 ensureAtBest = RepLevel.HOSTILE;
310 case COMBAT_AGGRESSIVE:
311 delta = -RepRewards.HIGH;
312 limit = RepLevel.VENGEFUL;
313 ensureAtBest = RepLevel.HOSTILE;
315 case COMBAT_NORMAL_TOFF:
316 delta = -RepRewards.MEDIUM;
317 limit = RepLevel.VENGEFUL;
319 case COMBAT_AGGRESSIVE_TOFF:
320 delta = -RepRewards.HIGH;
321 limit = RepLevel.VENGEFUL;
323 case FOOD_SHORTAGE_PLAYER_ENDED_FAST:
324 delta = getRepRewardForFoodShortage(action, (MarketAPI) param);
325 limit = RepLevel.FRIENDLY;
326 requireAtWorst = RepLevel.INHOSPITABLE;
328 case FOOD_SHORTAGE_PLAYER_ENDED_NORMAL:
329 delta = getRepRewardForFoodShortage(action, (MarketAPI) param);
330 limit = RepLevel.WELCOMING;
331 requireAtWorst = RepLevel.INHOSPITABLE;
333 case SYSTEM_BOUNTY_REWARD:
334 float fp = (Float) param;
336 delta = RepRewards.SMALL;
337 limit = RepLevel.WELCOMING;
338 }
else if (fp < 30) {
339 delta = RepRewards.MEDIUM;
340 limit = RepLevel.FRIENDLY;
342 delta = RepRewards.HIGH;
343 limit = RepLevel.COOPERATIVE;
345 requireAtWorst = RepLevel.VENGEFUL;
347 case PERSON_BOUNTY_REWARD:
348 delta = RepRewards.MEDIUM;
349 limit = RepLevel.COOPERATIVE;
350 requireAtWorst = RepLevel.VENGEFUL;
352 case COMBAT_WITH_ENEMY:
355 delta = RepRewards.TINY;
356 limit = RepLevel.WELCOMING;
357 }
else if (fp < 30) {
358 delta = RepRewards.SMALL;
359 limit = RepLevel.FRIENDLY;
361 delta = RepRewards.MEDIUM;
362 limit = RepLevel.COOPERATIVE;
364 requireAtWorst = RepLevel.VENGEFUL;
367 delta = (Float) param * 0.01f;
368 limit = RepLevel.WELCOMING;
373 requireAtWorst = RepLevel.INHOSPITABLE;
376 case SMUGGLING_EFFECT:
377 delta = -(Float) param * 0.01f;
378 limit = RepLevel.INHOSPITABLE;
380 case TRADE_WITH_ENEMY:
381 delta = -(Float) param * 0.01f;
382 limit = RepLevel.HOSTILE;
384 case SMUGGLING_INVESTIGATION_GUILTY:
385 delta = -RepRewards.HIGH;
386 limit = RepLevel.HOSTILE;
387 ensureAtBest = RepLevel.INHOSPITABLE;
389 case OTHER_FACTION_GOOD_REP_INVESTIGATION_MINOR:
390 delta = -RepRewards.HIGH;
391 limit = RepLevel.HOSTILE;
393 case OTHER_FACTION_GOOD_REP_INVESTIGATION_MAJOR:
394 delta = -RepRewards.HIGH;
395 limit = RepLevel.HOSTILE;
396 ensureAtBest = RepLevel.INHOSPITABLE;
398 case OTHER_FACTION_GOOD_REP_INVESTIGATION_CRITICAL:
399 delta = -RepRewards.HIGH;
400 limit = RepLevel.HOSTILE;
401 ensureAtBest = RepLevel.HOSTILE;
403 case CAUGHT_INSTALLING_SNIFFER:
404 delta = -RepRewards.TINY;
405 limit = RepLevel.INHOSPITABLE;
407 case COMM_SNIFFER_INVESTIGATION_GUILTY:
408 delta = -RepRewards.SMALL;
409 limit = RepLevel.INHOSPITABLE;
411 case FOOD_INVESTIGATION_GUILTY:
412 delta = -RepRewards.HIGH;
413 limit = RepLevel.INHOSPITABLE;
415 case FOOD_INVESTIGATION_GUILTY_MAJOR:
416 delta = -RepRewards.HIGH;
417 limit = RepLevel.HOSTILE;
418 ensureAtBest = RepLevel.SUSPICIOUS;
420 case CUSTOMS_NOTICED_EVADING:
421 delta = -RepRewards.MEDIUM;
422 limit = RepLevel.HOSTILE;
424 case CUSTOMS_CAUGHT_SMUGGLING:
425 delta = -(Float) param * 0.01f;
426 limit = RepLevel.HOSTILE;
428 case CUSTOMS_REFUSED_TOLL:
429 delta = -RepRewards.MEDIUM;
430 limit = RepLevel.HOSTILE;
432 case CUSTOMS_REFUSED_FINE:
433 delta = -RepRewards.VERY_HIGH;
434 limit = RepLevel.HOSTILE;
436 case CUSTOMS_COULD_NOT_AFFORD:
437 delta = -RepRewards.SMALL;
438 limit = RepLevel.INHOSPITABLE;
441 delta = RepRewards.TINY;
442 limit = RepLevel.WELCOMING;
444 case REP_DECAY_POSITIVE:
446 limit = RepLevel.NEUTRAL;
447 requireAtWorst = RepLevel.INHOSPITABLE;
449 case MISSION_SUCCESS:
450 MissionCompletionRep rep = (MissionCompletionRep) param;
451 delta = rep.successDelta;
452 limit = rep.successLimit;
454 case MISSION_FAILURE:
455 rep = (MissionCompletionRep) param;
456 delta = rep.failureDelta;
457 limit = rep.failureLimit;
459 case TRANSPONDER_OFF:
460 if (person !=
null) {
461 delta = -RepRewards.MEDIUM;
463 delta = -RepRewards.SMALL;
465 limit = RepLevel.HOSTILE;
467 case TRANSPONDER_OFF_REFUSE:
468 case CARGO_SCAN_REFUSE:
469 if (person !=
null) {
470 delta = -RepRewards.HIGH;
472 delta = -RepRewards.MEDIUM;
474 limit = RepLevel.HOSTILE;
476 case COMMISSION_ACCEPT:
477 delta = RepRewards.HIGH;
479 case SHRINE_OFFERING:
480 delta = RepRewards.MEDIUM;
481 limit = RepLevel.FRIENDLY;
484 delta = -RepRewards.TINY;
485 limit = RepLevel.INHOSPITABLE;
487 case MAKE_HOSTILE_AT_BEST:
489 ensureAtBest = RepLevel.HOSTILE;
491 case MAKE_SUSPICOUS_AT_WORST:
493 ensureAtWorst = RepLevel.SUSPICIOUS;
495 case COMMISSION_BOUNTY_REWARD:
498 delta = RepRewards.TINY;
499 limit = RepLevel.FRIENDLY;
500 }
else if (fp < 50) {
501 delta = RepRewards.SMALL;
502 limit = RepLevel.COOPERATIVE;
504 delta = RepRewards.MEDIUM;
505 limit = RepLevel.COOPERATIVE;
508 case COMMISSION_PENALTY_HOSTILE_TO_NON_ENEMY:
512 delta = -RepRewards.TINY;
513 }
else if (fp < 50) {
514 delta = -RepRewards.SMALL;
516 delta = -RepRewards.MEDIUM;
518 limit = RepLevel.INHOSPITABLE;
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;
533 float deltaSign = Math.signum(delta);
535 float before = delegate.getRel();
537 if (ensureAtBest !=
null) {
538 delegate.ensureAtBest(ensureAtBest);
540 if (ensureAtWorst !=
null) {
541 delegate.ensureAtWorst(ensureAtWorst);
544 if ((requireAtBest ==
null || curr.isAtBest(requireAtBest)) &&
545 (requireAtWorst ==
null || curr.isAtWorst(requireAtWorst))) {
546 delegate.adjustRelationship(delta, limit);
550 float after = delegate.getRel();
551 delta = after - before;
555 if (Math.abs(delta) >= 0.005f) {
557 }
else if (deltaSign != 0 && addMessageOnNoChange) {
558 addNoChangeMessage(deltaSign, faction, person, message, panel,
null,
null,
true, 0f, reason);
563 if (person ==
null) {
564 Global.
getSector().reportPlayerReputationChange(faction.getId(), delta);
570 return new ReputationAdjustmentResult(delta);
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) {
608 RepLevel level = player.getRelationshipLevel(faction.getId());
609 int repInt = RepLevel.getRepInt(player.getRelationship(faction.getId()));
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();
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();
628 String standing =
"" + repInt +
"/100" +
" (" + level.getDisplayName().toLowerCase() +
")";
633 String text =
"Your relationship with " + targetName +
634 ", currently at " + standing +
", is already well-established and is not affected by your recent actions";
636 if (panel ==
null && info ==
null) {
641 MessageIntel intel =
new MessageIntel();
642 if (person ==
null) {
643 intel.addLine(
"Relationship with " + targetName +
" not affected",
null,
644 new String[] {targetNameHighlight},
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());
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());
660 if (panel.getDialog() !=
null) {
661 SectorEntityToken target = panel.getDialog().getInteractionTarget();
662 if (target !=
null) {
663 if (target.getActivePerson() !=
null) {
664 target.getActivePerson().getMemory();
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});
679 message.addTag(Tags.REPORT_REP);
680 if (person ==
null) {
681 message.getCustomMap().put(CommMessageAPI.MESSAGE_FACTION_ID_KEY, faction.getId());
683 message.getCustomMap().put(CommMessageAPI.MESSAGE_PERSON_ID_KEY, person.getId());
689 text = text.replaceAll(
" by your recent actions",
"");
690 printToTextPanel(panel, text,
691 new String [] {standing},
692 new Color [] {relColor});
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);
703 LabelAPI label = info.addPara(
"Relationship with " + targetName +
" not affected", tc, pad);
704 if (withCurrent) info.addPara(
"Currently at %s", 0f, tc, relColor, standing);
711 TooltipMakerAPI info, Color tc,
float pad) {
713 RepLevel level = player.getRelationshipLevel(faction.getId());
714 int repInt = RepLevel.getRepInt(player.getRelationship(faction.getId()));
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();
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();
732 String standing =
"" + repInt +
"/100" +
" (" + level.getDisplayName().toLowerCase() +
")";
734 String text =
"Current standing with " + targetName +
735 " is " + standing +
"";
738 printToTextPanel(panel, text,
739 new String [] {targetNameHighlight, standing},
740 new Color [] {factionColor, relColor});
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);
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);
762 public static void addRequiredStanding(FactionAPI faction, RepLevel req, PersonAPI person, TextPanelAPI panel,
763 TooltipMakerAPI info, Color tc,
float pad,
boolean orBetter) {
765 RepLevel level = req;
767 float rel = level.getMin() + 0.01f;
770 fake.getRelToPlayer().setRel(rel);
772 int repInt = RepLevel.getRepInt(rel);
773 Color relColor = fake.getRelToPlayer().getRelColor(level);
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();
784 if (person !=
null) {
785 targetName = person.getName().getFullName();
786 relColor = person.getRelToPlayer().getRelColor();
790 String standing =
"" + repInt +
"/100" +
" (" + level.getDisplayName().toLowerCase() +
")";
792 String mid =
"or better";
796 String text =
"Requires " + standing +
" " + mid +
" standing with " + targetName;
799 printToTextPanel(panel, text,
800 new String [] {standing, targetNameHighlight},
801 new Color [] {relColor, factionColor});
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);
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);
841 CommMessageAPI message, TextPanelAPI panel,
842 TooltipMakerAPI info, Color tc,
boolean withCurrent,
float pad,
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;
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();
864 relColor = faction.getRelColor(player.getId());
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();
874 String standing =
"" + repInt +
"/100" +
" (" + level.getDisplayName().toLowerCase() +
")";
880 Color factionColor =
null;
881 if (faction !=
null) factionColor = faction.getBaseUIColor();
884 String deltaString =
"improved by " + deltaInt;
885 if (Math.abs(delta) <= 0.0049f || deltaInt == 0) {
886 deltaString =
"not affected";
888 }
else if (delta < 0) {
889 deltaColor = Misc.getNegativeHighlightColor();
890 deltaString =
"reduced by " + deltaInt;
893 text =
"Relationship with " + targetName +
" " + deltaString +
", currently at " + standing +
"";
895 if (panel ==
null && info ==
null) {
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());
909 intel.addLine(
"Relationship with " + targetName +
" " + deltaString,
null,
910 new String[] {deltaString},
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());
922 if (message !=
null) {
924 appendToSection2(text, message);
926 appendToSectionHighlights(message.getSection2(),
927 new String [] {deltaString, standing},
928 new Color [] {deltaColor, relColor});
930 message.addTag(Tags.REPORT_REP);
931 if (person ==
null) {
932 message.getCustomMap().put(CommMessageAPI.MESSAGE_FACTION_ID_KEY, faction.getId());
934 message.getCustomMap().put(CommMessageAPI.MESSAGE_PERSON_ID_KEY, person.getId());
940 printToTextPanel(panel, text,
941 new String [] {deltaString, standing},
942 new Color [] {deltaColor, relColor});
947 if (person ==
null) {
963 LabelAPI label = info.addPara(
"Relationship with " + targetName +
" " + deltaString, tc, pad);
964 label.setHighlight(targetNameHighlight, deltaString);
965 label.setHighlightColors(factionColor, deltaColor);
967 if (withCurrent) info.addPara(
"Currently at %s", 0f, tc, relColor, standing);
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);