From 46233336050c3a3bb6226ba42449d3a6bad08597 Mon Sep 17 00:00:00 2001 From: Vegapnk Date: Fri, 5 Jul 2024 15:20:09 +0200 Subject: [PATCH] Centralized Faction Goodwill Penalties in a single Helper --- CHANGELOG.md | 1 + Source/Common/Helpers/FactionUtility.cs | 42 +++++++++++++++++++ ...h_AfterSexUtility_ApplyGeneticInfectors.cs | 14 +------ ...AftersexUtility_TransferGeneticDiseases.cs | 14 +------ .../Genes/Special/Patches/Patch_AgeDrain.cs | 13 +----- .../Special/Patches/Patch_GeneticSexThief.cs | 9 +--- .../Special/Patches/Patch_Youth_Fountain.cs | 15 +------ 7 files changed, 49 insertions(+), 59 deletions(-) create mode 100644 Source/Common/Helpers/FactionUtility.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b63394..b087e0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,7 @@ but they are meant mostly to have infectors immune against their own diseases. - Gene: Sexual Genetic Swap. Pawns have a chance to switch a random gene with their sexpartner. - (Archite) Gene: Sexual Genetic Thief. Pawns have a chance to steal a gene from their sexpartner. Genetic Disease Immunity shields against this. - Pawns will have negative thoughts about pawns with more genetic diseases than themselves. +- Faction Penalties for spreading diseases, stealing genes and aging pawns with age transfer **Fixes:** diff --git a/Source/Common/Helpers/FactionUtility.cs b/Source/Common/Helpers/FactionUtility.cs new file mode 100644 index 0000000..10a4e7c --- /dev/null +++ b/Source/Common/Helpers/FactionUtility.cs @@ -0,0 +1,42 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Genes +{ + public class FactionUtility + { + + /// + /// Tries to change the goodwill between the factions of two pawns. + /// Exceptions when nothing happens: + /// - Pawns, or Pawns Factions, are null + /// - The `actors` Faction is not the players faction + /// - Both pawns have the same faction + /// - The Event is not found + /// + /// The pawn that initiated a faction-goodwill change by his actions + /// The pawn that was harmed/affected by the action + /// The event defname, for proper reporting + /// How much (positive or negative) the goodwill will change + public static void HandleFactionGoodWillPenalties(Pawn actor, Pawn target, string HistoryEventDefname, int goodWillChange, bool canSendHostileLetter=true) + { + if (actor == null) return; + if (target == null) return; + if ( + target.Faction != null && actor.Faction != null + && target.Faction != actor.Faction + && target.Faction != Faction.OfPlayer) + { + HistoryEventDef reason = DefDatabase.GetNamedSilentFail(HistoryEventDefname); + if (reason == null) return; + + target.Faction.TryAffectGoodwillWith(actor.Faction, goodWillChange, true, canSendHostileLetter, reason, target); + } + } + } +} diff --git a/Source/Genes/Diseases/Patches/Patch_AfterSexUtility_ApplyGeneticInfectors.cs b/Source/Genes/Diseases/Patches/Patch_AfterSexUtility_ApplyGeneticInfectors.cs index c9f36ee..06b0998 100644 --- a/Source/Genes/Diseases/Patches/Patch_AfterSexUtility_ApplyGeneticInfectors.cs +++ b/Source/Genes/Diseases/Patches/Patch_AfterSexUtility_ApplyGeneticInfectors.cs @@ -54,23 +54,11 @@ namespace RJW_Genes if ((new Random()).NextDouble() < application_chance) { partner.genes.AddGene(diseaseGeneDef, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes); - HandleFactionGoodWillPenalties(infector, partner); + FactionUtility.HandleFactionGoodWillPenalties(infector, partner, "rjw_genes_GoodwillChangedReason_infected_with_disease",FACTION_GOODWILL_CHANGE); } } } } - private static void HandleFactionGoodWillPenalties(Pawn infector, Pawn partner) - { - if ( - partner.Faction != null && infector.Faction != null - && partner.Faction != infector.Faction - && partner.Faction != Faction.OfPlayer) - { - HistoryEventDef reason = DefDatabase.GetNamedSilentFail("rjw_genes_GoodwillChangedReason_infected_with_disease"); - partner.Faction.TryAffectGoodwillWith(infector.Faction, FACTION_GOODWILL_CHANGE, true, true, reason, partner); - } - } - } } diff --git a/Source/Genes/Diseases/Patches/Patch_AftersexUtility_TransferGeneticDiseases.cs b/Source/Genes/Diseases/Patches/Patch_AftersexUtility_TransferGeneticDiseases.cs index 3f4f621..a00d40f 100644 --- a/Source/Genes/Diseases/Patches/Patch_AftersexUtility_TransferGeneticDiseases.cs +++ b/Source/Genes/Diseases/Patches/Patch_AftersexUtility_TransferGeneticDiseases.cs @@ -51,22 +51,10 @@ namespace RJW_Genes if ((new Random()).NextDouble() <= DiseaseHelper.LookupDiseaseInfectionChance(disease)) { infected.genes.AddGene(disease, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes); - HandleFactionGoodWillPenalties(infector, infected); + FactionUtility.HandleFactionGoodWillPenalties(infector, infected, "rjw_genes_GoodwillChangedReason_spread_genetic_disease", FACTION_GOODWILL_CHANGE); } } } - private static void HandleFactionGoodWillPenalties(Pawn actor, Pawn target) - { - if ( - target.Faction != null && actor.Faction != null - && target.Faction != actor.Faction - && target.Faction != Faction.OfPlayer) - { - HistoryEventDef reason = DefDatabase.GetNamedSilentFail("rjw_genes_GoodwillChangedReason_spread_genetic_disease"); - target.Faction.TryAffectGoodwillWith(actor.Faction, FACTION_GOODWILL_CHANGE, true, true, reason, target); - } - } - } } diff --git a/Source/Genes/Special/Patches/Patch_AgeDrain.cs b/Source/Genes/Special/Patches/Patch_AgeDrain.cs index 70b4f5e..059baef 100644 --- a/Source/Genes/Special/Patches/Patch_AgeDrain.cs +++ b/Source/Genes/Special/Patches/Patch_AgeDrain.cs @@ -84,19 +84,8 @@ namespace RJW_Genes.Genes.Special ModLog.Message($"[Sexual Age Drainer] {receiver} was too young ({receiver.ageTracker.AgeBiologicalYears}), and remains unchanged."); } - HandleFactionGoodWillPenalties(receiver, giver); + FactionUtility.HandleFactionGoodWillPenalties(receiver, giver, "rjw_genes_GoodwillChangedReason_aged_pawn_with_sex_gene",FACTION_GOODWILL_CHANGE); } - private static void HandleFactionGoodWillPenalties(Pawn actor, Pawn target) - { - if ( - target.Faction != null && actor.Faction != null - && target.Faction != actor.Faction - && target.Faction != Faction.OfPlayer) - { - HistoryEventDef reason = DefDatabase.GetNamedSilentFail("rjw_genes_GoodwillChangedReason_youthed_pawn_with_sex_gene"); - target.Faction.TryAffectGoodwillWith(actor.Faction, FACTION_GOODWILL_CHANGE, true, true, reason, target); - } - } } } diff --git a/Source/Genes/Special/Patches/Patch_GeneticSexThief.cs b/Source/Genes/Special/Patches/Patch_GeneticSexThief.cs index c47a351..d61f0bd 100644 --- a/Source/Genes/Special/Patches/Patch_GeneticSexThief.cs +++ b/Source/Genes/Special/Patches/Patch_GeneticSexThief.cs @@ -68,14 +68,7 @@ namespace RJW_Genes stealer.genes.AddGene(stolenGene.def, AddAsXenogene); victim.genes.RemoveGene(stolenGene); - if ( - victim.Faction != null && stealer.Faction != null - && victim.Faction != stealer.Faction - && victim.Faction != Faction.OfPlayer) { - - HistoryEventDef reason = DefDatabase.GetNamedSilentFail("rjw_genes_GoodwillChangedReason_StoleGene"); - victim.Faction.TryAffectGoodwillWith(stealer.Faction, FACTION_GOODWILL_CHANGE, true, true, reason, victim); - } + FactionUtility.HandleFactionGoodWillPenalties(stealer, victim, "rjw_genes_GoodwillChangedReason_StoleGene", FACTION_GOODWILL_CHANGE); } } diff --git a/Source/Genes/Special/Patches/Patch_Youth_Fountain.cs b/Source/Genes/Special/Patches/Patch_Youth_Fountain.cs index c71eeb2..96ba204 100644 --- a/Source/Genes/Special/Patches/Patch_Youth_Fountain.cs +++ b/Source/Genes/Special/Patches/Patch_Youth_Fountain.cs @@ -42,12 +42,12 @@ namespace RJW_Genes.Genes.Special if (GeneUtility.IsYouthFountain(props.pawn)) { ChangeAgeForPawn(props.partner, props.pawn); - HandleFactionGoodWillPenalties(props.pawn, props.partner); + FactionUtility.HandleFactionGoodWillPenalties(props.pawn, props.partner, "rjw_genes_GoodwillChangedReason_youthed_pawn_with_sex_gene",+1); } if (GeneUtility.IsYouthFountain(props.partner)) { ChangeAgeForPawn(props.pawn,props.partner); - HandleFactionGoodWillPenalties(props.partner, props.pawn); + FactionUtility.HandleFactionGoodWillPenalties(props.pawn, props.partner, "rjw_genes_GoodwillChangedReason_youthed_pawn_with_sex_gene", +1); } } @@ -71,17 +71,6 @@ namespace RJW_Genes.Genes.Special } - private static void HandleFactionGoodWillPenalties(Pawn actor, Pawn target) - { - if ( - target.Faction != null && actor.Faction != null - && target.Faction != actor.Faction - && target.Faction != Faction.OfPlayer) - { - HistoryEventDef reason = DefDatabase.GetNamedSilentFail("rjw_genes_GoodwillChangedReason_youthed_pawn_with_sex_gene"); - target.Faction.TryAffectGoodwillWith(actor.Faction, FACTION_GOODWILL_CHANGE, true, true, reason, target); - } - } } }