public static void BuildMoodThoughtsListString(IEnumerable <Pawn> victims, PawnDiedOrDownedThoughtsKind thoughtsKind, StringBuilder sb, string individualThoughtsHeader, string allColonistsThoughtsHeader, string victimLabelKey) { foreach (Pawn victim in victims) { GetThoughts(victim, null, thoughtsKind, tmpIndividualThoughtsToAdd, tmpAllColonistsThoughts); if (tmpIndividualThoughtsToAdd.Any() || tmpAllColonistsThoughts.Any()) { if (sb.Length > 0) { sb.AppendLine(); sb.AppendLine(); } string text = victim.KindLabel.CapitalizeFirst() + " " + victim.LabelShort; if (victimLabelKey.NullOrEmpty()) { sb.Append(text + ":"); } else { sb.Append(victimLabelKey.Translate(text)); } BuildMoodThoughtsListString(victim, null, thoughtsKind, sb, individualThoughtsHeader, allColonistsThoughtsHeader); } } }
public static void TryGiveThoughts(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { try { if (!PawnGenerator.IsBeingGenerated(victim) && Current.ProgramState == ProgramState.Playing) { PawnDiedOrDownedThoughtsUtility.GetThoughts(victim, dinfo, thoughtsKind, PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd, PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts); for (int i = 0; i < PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd.Count; i++) { PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd[i].Add(); } if (PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts.Any()) { foreach (Pawn allMapsCaravansAndTravelingTransportPods_Colonist in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Colonists) { if (allMapsCaravansAndTravelingTransportPods_Colonist != victim) { for (int j = 0; j < PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts.Count; j++) { ThoughtDef def = PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts[j]; allMapsCaravansAndTravelingTransportPods_Colonist.needs.mood.thoughts.memories.TryGainMemory(def, null); } } } } PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd.Clear(); PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts.Clear(); } } catch (Exception arg) { Log.Error("Could not give thoughts: " + arg); } }
public static void TryGiveThoughts(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { try { if (PawnGenerator.IsBeingGenerated(victim) || Current.ProgramState != ProgramState.Playing) { return; } GetThoughts(victim, dinfo, thoughtsKind, tmpIndividualThoughtsToAdd, tmpAllColonistsThoughts); for (int i = 0; i < tmpIndividualThoughtsToAdd.Count; i++) { tmpIndividualThoughtsToAdd[i].Add(); } if (tmpAllColonistsThoughts.Any()) { foreach (Pawn allMapsCaravansAndTravelingTransportPods_Alive_Colonist in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_Colonists) { if (allMapsCaravansAndTravelingTransportPods_Alive_Colonist != victim) { for (int j = 0; j < tmpAllColonistsThoughts.Count; j++) { tmpAllColonistsThoughts[j].Add(allMapsCaravansAndTravelingTransportPods_Alive_Colonist); } } } } tmpIndividualThoughtsToAdd.Clear(); tmpAllColonistsThoughts.Clear(); } catch (Exception arg) { Log.Error("Could not give thoughts: " + arg); } }
public static void TryGiveThoughts(IEnumerable <Pawn> victims, PawnDiedOrDownedThoughtsKind thoughtsKind) { foreach (Pawn victim in victims) { TryGiveThoughts(victim, null, thoughtsKind); } }
public static void TryGiveThoughts(IEnumerable <Pawn> victims, PawnDiedOrDownedThoughtsKind thoughtsKind) { foreach (Pawn current in victims) { PawnDiedOrDownedThoughtsUtility.TryGiveThoughts(current, null, thoughtsKind); } }
public static void BuildMoodThoughtsListString(IEnumerable <Pawn> victims, PawnDiedOrDownedThoughtsKind thoughtsKind, StringBuilder sb, string individualThoughtsHeader, string allColonistsThoughtsHeader, string victimLabelKey) { foreach (Pawn pawn in victims) { PawnDiedOrDownedThoughtsUtility.GetThoughts(pawn, null, thoughtsKind, PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd, PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts); if (PawnDiedOrDownedThoughtsUtility.tmpIndividualThoughtsToAdd.Any <IndividualThoughtToAdd>() || PawnDiedOrDownedThoughtsUtility.tmpAllColonistsThoughts.Any <ThoughtDef>()) { if (sb.Length > 0) { sb.AppendLine(); sb.AppendLine(); } string text = pawn.KindLabel.CapitalizeFirst() + " " + pawn.LabelShort; if (victimLabelKey.NullOrEmpty()) { sb.Append(text + ":"); } else { sb.Append(victimLabelKey.Translate(new object[] { text })); } PawnDiedOrDownedThoughtsUtility.BuildMoodThoughtsListString(pawn, null, thoughtsKind, sb, individualThoughtsHeader, allColonistsThoughtsHeader); } } }
public static bool Prefix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtToAddToAll> outAllColonistsThoughts) { if (!PeacekeeperUtility.IsPeacekeeper(victim)) { return(true); } return(false); }
public static void AppendReligious(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { if (thoughtsKind != PawnDiedOrDownedThoughtsKind.Died) { return; } AppendByInfo(new Info(victim, dinfo)); }
public static bool Prefix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { if (victim != null && victim.kindDef == MeeseeksDefOf.MeeseeksKind) { return(false); } return(true); }
public static void Postfix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { if (victim.RaceProps.IsMechanoid && thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.MapHeld != null) { foreach (var pawn in victim.MapHeld.mapPawns.AllPawns) { if (pawn.HasTrait(VTEDefOf.VTE_Technophobe)) { pawn.TryGiveThought(VTEDefOf.VTE_MechanoidIsKilled); } } } }
public static void GetThoughts(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtToAddToAll> outAllColonistsThoughts) { outIndividualThoughts.Clear(); outAllColonistsThoughts.Clear(); if (victim.RaceProps.Humanlike) { AppendThoughts_ForHumanlike(victim, dinfo, thoughtsKind, outIndividualThoughts, outAllColonistsThoughts); } if (victim.relations != null && victim.relations.everSeenByPlayer) { AppendThoughts_Relations(victim, dinfo, thoughtsKind, outIndividualThoughts, outAllColonistsThoughts); } }
public static void Postfix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { if (victim.RaceProps.IsMechanoid && thoughtsKind == PawnDiedOrDownedThoughtsKind.Died) { foreach (var pawn in victim.Map.mapPawns.AllPawns) { if (pawn.HasTrait(VTEDefOf.VTE_Technophobe)) { pawn.TryGiveThought(VTEDefOf.VTE_MechanoidIsKilled); Log.Message(pawn + " gets a VTE_MechanoidIsKilled thought due to killed mechanoid"); } } } }
public static bool PreFix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { try { if (!PawnGenerator.IsBeingGenerated(victim) && Current.ProgramState == ProgramState.Playing) { // This is the main redirection for our patches switch (thoughtsKind) { case PawnDiedOrDownedThoughtsKind.Downed: // There is potential here, simply wasted. return(false); case PawnDiedOrDownedThoughtsKind.Died: // Let's see if this works; I hope it does. // It works. // Refer to PostFix_Pawn_Kill // Handler_PawnDied.HandlePawnDied(victim, dinfo); return(false); case PawnDiedOrDownedThoughtsKind.BanishedToDie: Handler_PawnBanished.HandlePawnBanished(victim, true); return(false); case PawnDiedOrDownedThoughtsKind.Banished: Handler_PawnBanished.HandlePawnBanished(victim, false); return(false); case PawnDiedOrDownedThoughtsKind.Lost: // Refer to PostFix_Pawn_PreKidnapped return(false); default: // This shouldn't happen. You should check things again. throw new InvalidOperationException(); } } } catch (Exception arg) { Log.Error( "[V1024-DESYNC] Could not give thought, falling back to vanilla thought-giving procedures: " + arg); } return(true); }
public static void PawnDiedOrDownedThoughtsUtility_GetThoughts_Postfix(Pawn victim, ref DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtToAddToAll> outAllColonistsThoughts) { var raceSettings = DefDatabase <AutomataRaceSettings> .GetNamed(victim.def.defName, errorOnFail : false); if (!(raceSettings?.deadThoughtOverrides?.NullOrEmpty() ?? true)) { var oldIndividualThoughts = new List <IndividualThoughtToAdd>(outIndividualThoughts); var oldAllColonistsThoughts = new List <ThoughtToAddToAll>(outAllColonistsThoughts); outIndividualThoughts.Clear(); foreach (var individualThought in oldIndividualThoughts) { var overrideData = raceSettings.deadThoughtOverrides.FirstOrDefault(x => x.source == individualThought.thought.def); if (overrideData != null) { if (overrideData.overwrite != null) { var oldThought = individualThought.thought; var newThought = new IndividualThoughtToAdd( overrideData.overwrite, individualThought.addTo, otherPawn: oldThought.otherPawn, moodPowerFactor: oldThought.moodPowerFactor); var newThoughtSocial = newThought.thought as Thought_MemorySocial; if (newThoughtSocial != null) { newThoughtSocial.opinionOffset = (oldThought as Thought_MemorySocial)?.opinionOffset ?? newThoughtSocial.opinionOffset; } outIndividualThoughts.Add(newThought); } } else { outIndividualThoughts.Add(individualThought); } } outAllColonistsThoughts.Clear(); foreach (var allColonistThought in oldAllColonistsThoughts) { var overrideData = raceSettings.deadThoughtOverrides.FirstOrDefault(x => x.source == allColonistThought.thoughtDef); if (overrideData != null) { if (overrideData.overwrite != null) { outAllColonistsThoughts.Add(new ThoughtToAddToAll(overrideData.overwrite, allColonistThought.otherPawn)); } } else { outAllColonistsThoughts.Add(allColonistThought); } } } }
public static void BuildMoodThoughtsListString(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, StringBuilder sb, string individualThoughtsHeader, string allColonistsThoughtsHeader) { GetThoughts(victim, dinfo, thoughtsKind, tmpIndividualThoughtsToAdd, tmpAllColonistsThoughts); if (tmpAllColonistsThoughts.Any()) { if (!allColonistsThoughtsHeader.NullOrEmpty()) { sb.Append(allColonistsThoughtsHeader); sb.AppendLine(); } for (int i = 0; i < tmpAllColonistsThoughts.Count; i++) { ThoughtToAddToAll thoughtToAddToAll = tmpAllColonistsThoughts[i]; if (sb.Length > 0) { sb.AppendLine(); } sb.Append(" - " + thoughtToAddToAll.thoughtDef.stages[0].LabelCap + " " + Mathf.RoundToInt(thoughtToAddToAll.thoughtDef.stages[0].baseMoodEffect).ToStringWithSign()); } } if (!tmpIndividualThoughtsToAdd.Any((IndividualThoughtToAdd x) => x.thought.MoodOffset() != 0f)) { return; } if (!individualThoughtsHeader.NullOrEmpty()) { sb.Append(individualThoughtsHeader); } foreach (IGrouping <Pawn, IndividualThoughtToAdd> item in from x in tmpIndividualThoughtsToAdd where x.thought.MoodOffset() != 0f group x by x.addTo) { if (sb.Length > 0) { sb.AppendLine(); sb.AppendLine(); } string value = item.Key.KindLabel.CapitalizeFirst() + " " + item.Key.LabelShort; sb.Append(value); sb.Append(":"); foreach (IndividualThoughtToAdd item2 in item) { sb.AppendLine(); sb.Append(" " + item2.LabelCap); } } }
public static void InnocentThoughts_AppendThoughtsPatch(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, ref List <IndividualThoughtToAdd> outIndividualThoughts, ref List <ThoughtDef> outAllColonistsThoughts) { bool flag = dinfo.HasValue && dinfo.Value.Def.execution; bool flag2 = victim.IsPrisonerOfColony && !victim.guilt.IsGuilty && !victim.InAggroMentalState; bool flag3 = dinfo.HasValue && dinfo.Value.Def.ExternalViolenceFor(victim) && dinfo.Value.Instigator != null && dinfo.Value.Instigator is Pawn; if (flag3) { Pawn pawn = (Pawn)dinfo.Value.Instigator; if (!pawn.Dead && pawn.needs.mood != null && pawn.story != null && pawn != victim) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.HostileTo(pawn)) { if (victim.Faction != null && victim.Faction.HostileTo(pawn.Faction) && !flag2 && pawn.story.traits.HasTrait(TraitDef_BnC.Innocent)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoudhtDef_Innocent.KilledHumanlikeEnemyInnocent, pawn, victim, 1f, 1f)); //remove innocence DeleteInnocent.RemoveInnocence(ref pawn, ref outIndividualThoughts); } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.Spawned) { List <Pawn> allPawnsSpawned = victim.Map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { Pawn pawn2 = allPawnsSpawned[i]; if (pawn2 != victim && pawn2.needs.mood != null) { if (!flag && (pawn2.MentalStateDef != MentalStateDefOf.SocialFighting || ((MentalState_SocialFighting)pawn2.MentalState).otherPawn != victim)) { if (pawn2.Position.InHorDistOf(victim.Position, 12f) && GenSight.LineOfSight(victim.Position, pawn2.Position, victim.Map, false) && pawn2.Awake() && pawn2.health.capacities.CapableOf(PawnCapacityDefOf.Sight)) { if (pawn2.Faction == victim.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoudhtDef_Innocent.WitnessedDeathAllyInnocent, pawn2, null, 1f, 1f)); //remove innocence DeleteInnocent.RemoveInnocence(ref pawn2, ref outIndividualThoughts); } else if (victim.Faction == null || (!victim.Faction.HostileTo(pawn2.Faction) || pawn2.story.traits.HasTrait(TraitDef_BnC.Innocent))) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoudhtDef_Innocent.WitnessedDeathNonAllyInnocent, pawn2, null, 1f, 1f)); //remove innocence DeleteInnocent.RemoveInnocence(ref pawn2, ref outIndividualThoughts); } } else if (victim.Faction == Faction.OfPlayer && victim.Faction == pawn2.Faction && victim.HostFaction != pawn2.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoudhtDef_Innocent.KnowColonistDiedInnocent, pawn2, null, 1f, 1f)); //remove innocence DeleteInnocent.RemoveInnocence(ref pawn2, ref outIndividualThoughts); } if (flag2 && pawn2.Faction == Faction.OfPlayer && !pawn2.IsPrisoner) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoudhtDef_Innocent.KnowPrisonerDiedInnocentInnocent, pawn2, null, 1f, 1f)); //remove innocence DeleteInnocent.RemoveInnocence(ref pawn2, ref outIndividualThoughts); } } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.IsColonist) { outAllColonistsThoughts.Add(ThoudhtDef_Innocent.ColonistAbandonedInnocent); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.BanishedToDie) { if (victim.IsColonist) { outAllColonistsThoughts.Add(ThoudhtDef_Innocent.ColonistAbandonedToDieInnocent); } else if (victim.IsPrisonerOfColony) { outAllColonistsThoughts.Add(ThoudhtDef_Innocent.PrisonerAbandonedToDieInnocent); } } }
private static void AppendThoughts_Relations(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtToAddToAll> outAllColonistsThoughts) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.RaceProps.Animal) { List <DirectPawnRelation> directRelations = victim.relations.DirectRelations; for (int i = 0; i < directRelations.Count; i++) { if (directRelations[i].otherPawn.needs != null && directRelations[i].otherPawn.needs.mood != null && PawnUtility.ShouldGetThoughtAbout(directRelations[i].otherPawn, victim) && directRelations[i].def == PawnRelationDefOf.Bond) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.BondedAnimalBanished, directRelations[i].otherPawn, victim)); } } } if (thoughtsKind != 0 && thoughtsKind != PawnDiedOrDownedThoughtsKind.BanishedToDie && thoughtsKind != PawnDiedOrDownedThoughtsKind.Lost) { return; } bool flag = thoughtsKind == PawnDiedOrDownedThoughtsKind.Lost; foreach (Pawn potentiallyRelatedPawn in victim.relations.PotentiallyRelatedPawns) { if (potentiallyRelatedPawn.needs == null || potentiallyRelatedPawn.needs.mood == null || !PawnUtility.ShouldGetThoughtAbout(potentiallyRelatedPawn, victim)) { continue; } PawnRelationDef mostImportantRelation = potentiallyRelatedPawn.GetMostImportantRelation(victim); if (mostImportantRelation != null) { ThoughtDef thoughtDef = (flag ? mostImportantRelation.GetGenderSpecificLostThought(victim) : mostImportantRelation.GetGenderSpecificDiedThought(victim)); if (thoughtDef != null) { outIndividualThoughts.Add(new IndividualThoughtToAdd(thoughtDef, potentiallyRelatedPawn, victim)); } } } if (dinfo.HasValue && thoughtsKind != PawnDiedOrDownedThoughtsKind.Lost) { Pawn pawn = dinfo.Value.Instigator as Pawn; if (pawn != null && pawn != victim) { foreach (Pawn potentiallyRelatedPawn2 in victim.relations.PotentiallyRelatedPawns) { if (pawn == potentiallyRelatedPawn2 || potentiallyRelatedPawn2.needs == null || potentiallyRelatedPawn2.needs.mood == null) { continue; } PawnRelationDef mostImportantRelation2 = potentiallyRelatedPawn2.GetMostImportantRelation(victim); if (mostImportantRelation2 != null) { ThoughtDef genderSpecificKilledThought = mostImportantRelation2.GetGenderSpecificKilledThought(victim); if (genderSpecificKilledThought != null) { outIndividualThoughts.Add(new IndividualThoughtToAdd(genderSpecificKilledThought, potentiallyRelatedPawn2, pawn)); } } if (potentiallyRelatedPawn2.RaceProps.IsFlesh) { int num = potentiallyRelatedPawn2.relations.OpinionOf(victim); if (num >= 20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KilledMyFriend, potentiallyRelatedPawn2, pawn, 1f, victim.relations.GetFriendDiedThoughtPowerFactor(num))); } else if (num <= -20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KilledMyRival, potentiallyRelatedPawn2, pawn, 1f, victim.relations.GetRivalDiedThoughtPowerFactor(num))); } } } } } ThoughtDef thoughtDef2 = ((thoughtsKind == PawnDiedOrDownedThoughtsKind.Lost) ? ThoughtDefOf.PawnWithGoodOpinionLost : ThoughtDefOf.PawnWithGoodOpinionDied); ThoughtDef thoughtDef3 = ((thoughtsKind == PawnDiedOrDownedThoughtsKind.Lost) ? ThoughtDefOf.PawnWithBadOpinionLost : ThoughtDefOf.PawnWithBadOpinionDied); if (!victim.RaceProps.Humanlike) { return; } foreach (Pawn item in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive) { if (item.needs != null && item.RaceProps.IsFlesh && item.needs.mood != null && PawnUtility.ShouldGetThoughtAbout(item, victim)) { int num2 = item.relations.OpinionOf(victim); if (num2 >= 20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(thoughtDef2, item, victim, victim.relations.GetFriendDiedThoughtPowerFactor(num2))); } else if (num2 <= -20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(thoughtDef3, item, victim, victim.relations.GetRivalDiedThoughtPowerFactor(num2))); } } } }
private static void _AppendThoughts_Humanlike(Pawn victim, DamageInfo?dinfo, Hediff hediff, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtDef> outAllColonistsThoughts) { var IsExecution = typeof(PawnDiedOrDownedThoughtsUtility).GetMethod("IsExecution", BindingFlags.Static | BindingFlags.NonPublic); var IsInnocentPrisoner = typeof(PawnDiedOrDownedThoughtsUtility).GetMethod("IsInnocentPrisoner", BindingFlags.Static | BindingFlags.NonPublic); bool flag = (bool)IsExecution.Invoke(null, new object[] { dinfo, hediff }); bool flag2 = (bool)IsInnocentPrisoner.Invoke(null, new object[] { victim }); bool flag3 = dinfo.HasValue && dinfo.Value.Def.externalViolence && dinfo.Value.Instigator != null && dinfo.Value.Instigator is Pawn; if (flag3) { Pawn pawn = (Pawn)dinfo.Value.Instigator; if (!pawn.Dead && pawn.needs.mood != null && pawn.story != null && pawn != victim) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KilledHumanlikeBloodlust, pawn, null, 1f, 1f)); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.HostileTo(pawn)) { if (victim.Faction != null && PawnUtility.IsFactionLeader(victim) && victim.Faction.HostileTo(pawn.Faction)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.DefeatedHostileFactionLeader, pawn, victim, 1f, 1f)); } else if (victim.Faction != null && victim.Faction.HostileTo(pawn.Faction) && !flag2) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KilledHumanlikeEnemy, pawn, victim, 1f, 1f)); } if (victim.kindDef.combatPower > 250f) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.DefeatedMajorEnemy, pawn, victim, 1f, 1f)); } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.Spawned) { List <Pawn> allPawnsSpawned = victim.Map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { Pawn pawn2 = allPawnsSpawned[i]; if (pawn2 != victim && pawn2.needs.mood != null) { if (!flag && (pawn2.MentalStateDef != MentalStateDefOf.SocialFighting || ((MentalState_SocialFighting)pawn2.MentalState).otherPawn != victim)) { if (pawn2.Position.InHorDistOf(victim.Position, 12f) && GenSight.LineOfSight(victim.Position, pawn2.Position, victim.Map, false) && pawn2.Awake() && pawn2.health.capacities.CapableOf(PawnCapacityDefOf.Sight)) { if (pawn2.Faction == victim.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathAlly, pawn2, null, 1f, 1f)); outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.WitnessedDeathAllyBleedingHeart, pawn2, null, 1f, 1f)); } else if (victim.Faction == null || (!victim.Faction.HostileTo(pawn2.Faction) || pawn2.story.traits.HasTrait(TraitDefOfPsychology.BleedingHeart))) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathNonAlly, pawn2, null, 1f, 1f)); outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.WitnessedDeathNonAllyBleedingHeart, pawn2, null, 1f, 1f)); } if (pawn2.relations.FamilyByBlood.Contains(victim)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathFamily, pawn2, null, 1f, 1f)); } outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathBloodlust, pawn2, null, 1f, 1f)); if (!pawn2.story.traits.HasTrait(TraitDefOfPsychology.BleedingHeart) && !pawn2.story.traits.HasTrait(TraitDefOf.Psychopath) && !pawn2.story.traits.HasTrait(TraitDefOf.Bloodlust) && !pawn2.story.traits.HasTrait(TraitDefOfPsychology.Desensitized)) { if (((pawn2.GetHashCode() ^ (GenLocalDate.DayOfYear(pawn2) + GenLocalDate.Year(pawn2) + (int)(GenLocalDate.DayPercent(pawn2) * 5) * 60) * 391) % 1000) == 0) { pawn2.story.traits.GainTrait(new Trait(TraitDefOfPsychology.Desensitized)); pawn2.needs.mood.thoughts.memories.TryGainMemoryThought(ThoughtDefOfPsychology.RecentlyDesensitized, null); } } } else if (victim.Faction == Faction.OfPlayer && victim.Faction == pawn2.Faction && victim.HostFaction != pawn2.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowColonistDied, pawn2, null, 1f, 1f)); outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KnowColonistDiedBleedingHeart, pawn2, null, 1f, 1f)); } if (flag2 && pawn2.Faction == Faction.OfPlayer && !pawn2.IsPrisoner) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowPrisonerDiedInnocent, pawn2, null, 1f, 1f)); outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KnowPrisonerDiedInnocentBleedingHeart, pawn2, null, 1f, 1f)); } } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Abandoned && victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOf.ColonistAbandoned); outAllColonistsThoughts.Add(ThoughtDefOfPsychology.ColonistAbandonedBleedingHeart); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.AbandonedToDie) { if (victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOf.ColonistAbandonedToDie); outAllColonistsThoughts.Add(ThoughtDefOfPsychology.ColonistAbandonedToDieBleedingHeart); } else if (victim.IsPrisonerOfColony) { outAllColonistsThoughts.Add(ThoughtDefOf.PrisonerAbandonedToDie); outAllColonistsThoughts.Add(ThoughtDefOfPsychology.PrisonerAbandonedToDieBleedingHeart); } } }
private static void AppendThoughts_ForHumanlike(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtToAddToAll> outAllColonistsThoughts) { bool flag = dinfo.HasValue && dinfo.Value.Def.execution; bool flag2 = victim.IsPrisonerOfColony && !victim.guilt.IsGuilty && !victim.InAggroMentalState; if (dinfo.HasValue && dinfo.Value.Def.ExternalViolenceFor(victim) && dinfo.Value.Instigator != null && dinfo.Value.Instigator is Pawn) { Pawn pawn = (Pawn)dinfo.Value.Instigator; if (!pawn.Dead && pawn.needs.mood != null && pawn.story != null && pawn != victim) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KilledHumanlikeBloodlust, pawn)); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.HostileTo(pawn) && victim.Faction != null && PawnUtility.IsFactionLeader(victim) && victim.Faction.HostileTo(pawn.Faction)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.DefeatedHostileFactionLeader, pawn, victim)); } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && !flag) { foreach (Pawn item in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive) { if (item == victim || item.needs == null || item.needs.mood == null || (item.MentalStateDef == MentalStateDefOf.SocialFighting && ((MentalState_SocialFighting)item.MentalState).otherPawn == victim)) { continue; } if (Witnessed(item, victim)) { bool flag3 = item.Faction == Faction.OfPlayer && victim.IsQuestLodger(); if (item.Faction == victim.Faction && !flag3) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathAlly, item)); } else if (victim.Faction == null || !victim.Faction.HostileTo(item.Faction) || flag3) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathNonAlly, item)); } if (item.relations.FamilyByBlood.Contains(victim)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathFamily, item)); } outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathBloodlust, item)); } else if (victim.Faction == Faction.OfPlayer && victim.Faction == item.Faction && victim.HostFaction != item.Faction && !victim.IsQuestLodger()) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowColonistDied, item, victim)); } if (flag2 && item.Faction == Faction.OfPlayer && !item.IsPrisoner) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowPrisonerDiedInnocent, item, victim)); } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.IsColonist) { outAllColonistsThoughts.Add(new ThoughtToAddToAll(ThoughtDefOf.ColonistBanished, victim)); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.BanishedToDie) { if (victim.IsColonist) { outAllColonistsThoughts.Add(new ThoughtToAddToAll(ThoughtDefOf.ColonistBanishedToDie, victim)); } else if (victim.IsPrisonerOfColony) { outAllColonistsThoughts.Add(new ThoughtToAddToAll(ThoughtDefOf.PrisonerBanishedToDie, victim)); } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Lost && victim.IsColonist && !victim.IsQuestLodger()) { outAllColonistsThoughts.Add(new ThoughtToAddToAll(ThoughtDefOf.ColonistLost, victim)); } }
private static void Postfix(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind) { Religion_PawnDiedOrDownedUtility.AppendReligious(victim, dinfo, thoughtsKind); }
private static void AppendThoughts_Relations(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtDef> outAllColonistsThoughts) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.RaceProps.Animal) { List <DirectPawnRelation> directRelations = victim.relations.DirectRelations; for (int i = 0; i < directRelations.Count; i++) { if (directRelations[i].otherPawn.needs != null && directRelations[i].otherPawn.needs.mood != null && PawnUtility.ShouldGetThoughtAbout(directRelations[i].otherPawn, victim) && directRelations[i].def == PawnRelationDefOf.Bond) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.BondedAnimalBanished, directRelations[i].otherPawn, victim)); } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died || thoughtsKind == PawnDiedOrDownedThoughtsKind.BanishedToDie) { foreach (Pawn potentiallyRelatedPawn in victim.relations.PotentiallyRelatedPawns) { if (potentiallyRelatedPawn.needs != null && potentiallyRelatedPawn.needs.mood != null && PawnUtility.ShouldGetThoughtAbout(potentiallyRelatedPawn, victim)) { PawnRelationDef mostImportantRelation = potentiallyRelatedPawn.GetMostImportantRelation(victim); if (mostImportantRelation != null) { ThoughtDef genderSpecificDiedThought = mostImportantRelation.GetGenderSpecificDiedThought(victim); if (genderSpecificDiedThought != null) { outIndividualThoughts.Add(new IndividualThoughtToAdd(genderSpecificDiedThought, potentiallyRelatedPawn, victim)); } } } } if (dinfo.HasValue) { Pawn pawn = dinfo.Value.Instigator as Pawn; if (pawn != null && pawn != victim) { foreach (Pawn potentiallyRelatedPawn2 in victim.relations.PotentiallyRelatedPawns) { if (pawn != potentiallyRelatedPawn2 && potentiallyRelatedPawn2.needs != null && potentiallyRelatedPawn2.needs.mood != null) { PawnRelationDef mostImportantRelation2 = potentiallyRelatedPawn2.GetMostImportantRelation(victim); if (mostImportantRelation2 != null) { ThoughtDef genderSpecificKilledThought = mostImportantRelation2.GetGenderSpecificKilledThought(victim); if (genderSpecificKilledThought != null) { outIndividualThoughts.Add(new IndividualThoughtToAdd(genderSpecificKilledThought, potentiallyRelatedPawn2, pawn)); } } if (potentiallyRelatedPawn2.RaceProps.IsFlesh) { int num = potentiallyRelatedPawn2.relations.OpinionOf(victim); if (num >= 20) { ThoughtDef killedMyFriend = ThoughtDefOf.KilledMyFriend; Pawn addTo = potentiallyRelatedPawn2; Pawn otherPawn = pawn; float friendDiedThoughtPowerFactor = victim.relations.GetFriendDiedThoughtPowerFactor(num); outIndividualThoughts.Add(new IndividualThoughtToAdd(killedMyFriend, addTo, otherPawn, 1f, friendDiedThoughtPowerFactor)); } else if (num <= -20) { ThoughtDef killedMyFriend = ThoughtDefOf.KilledMyRival; Pawn otherPawn = potentiallyRelatedPawn2; Pawn addTo = pawn; float friendDiedThoughtPowerFactor = victim.relations.GetRivalDiedThoughtPowerFactor(num); outIndividualThoughts.Add(new IndividualThoughtToAdd(killedMyFriend, otherPawn, addTo, 1f, friendDiedThoughtPowerFactor)); } } } } } } if (victim.RaceProps.Humanlike) { foreach (Pawn item in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive) { if (item.needs != null && item.RaceProps.IsFlesh && item.needs.mood != null && PawnUtility.ShouldGetThoughtAbout(item, victim)) { int num2 = item.relations.OpinionOf(victim); if (num2 >= 20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.PawnWithGoodOpinionDied, item, victim, victim.relations.GetFriendDiedThoughtPowerFactor(num2))); } else if (num2 <= -20) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.PawnWithBadOpinionDied, item, victim, victim.relations.GetRivalDiedThoughtPowerFactor(num2))); } } } } } }
private static void AppendThoughts_ForHumanlike(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, List <IndividualThoughtToAdd> outIndividualThoughts, List <ThoughtDef> outAllColonistsThoughts) { bool flag = dinfo != null && dinfo.Value.Def.execution; bool flag2 = victim.IsPrisonerOfColony && !victim.guilt.IsGuilty && !victim.InAggroMentalState; bool flag3 = dinfo != null && dinfo.Value.Def.externalViolence && dinfo.Value.Instigator != null && dinfo.Value.Instigator is Pawn; if (flag3) { Pawn pawn = (Pawn)dinfo.Value.Instigator; if (!pawn.Dead && pawn.needs.mood != null && pawn.story != null && pawn != victim) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KilledHumanlikeBloodlust, pawn, null, 1f, 1f)); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.HostileTo(pawn)) { if (victim.Faction != null && PawnUtility.IsFactionLeader(victim) && victim.Faction.HostileTo(pawn.Faction)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.DefeatedHostileFactionLeader, pawn, victim, 1f, 1f)); } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && !flag) { foreach (Pawn pawn2 in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive) { if (pawn2 != victim && pawn2.needs.mood != null) { if (pawn2.MentalStateDef != MentalStateDefOf.SocialFighting || ((MentalState_SocialFighting)pawn2.MentalState).otherPawn != victim) { if (PawnDiedOrDownedThoughtsUtility.Witnessed(pawn2, victim)) { if (pawn2.Faction == victim.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathAlly, pawn2, null, 1f, 1f)); } else if (victim.Faction == null || !victim.Faction.HostileTo(pawn2.Faction)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathNonAlly, pawn2, null, 1f, 1f)); } if (pawn2.relations.FamilyByBlood.Contains(victim)) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathFamily, pawn2, null, 1f, 1f)); } outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.WitnessedDeathBloodlust, pawn2, null, 1f, 1f)); } else if (victim.Faction == Faction.OfPlayer && victim.Faction == pawn2.Faction && victim.HostFaction != pawn2.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowColonistDied, pawn2, victim, 1f, 1f)); } if (flag2 && pawn2.Faction == Faction.OfPlayer && !pawn2.IsPrisoner) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOf.KnowPrisonerDiedInnocent, pawn2, victim, 1f, 1f)); } } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOf.ColonistBanished); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.BanishedToDie) { if (victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOf.ColonistBanishedToDie); } else if (victim.IsPrisonerOfColony) { outAllColonistsThoughts.Add(ThoughtDefOf.PrisonerBanishedToDie); } } }
public static void AppendPsychologyThoughts(Pawn victim, DamageInfo?dinfo, PawnDiedOrDownedThoughtsKind thoughtsKind, ref List <IndividualThoughtToAdd> outIndividualThoughts, ref List <ThoughtDef> outAllColonistsThoughts) { bool flag = dinfo.HasValue && dinfo.Value.Def.execution; bool flag2 = victim.IsPrisonerOfColony && !victim.guilt.IsGuilty && !victim.InAggroMentalState; bool flag3 = dinfo.HasValue && dinfo.Value.Def.ExternalViolenceFor(victim) && dinfo.Value.Instigator != null && dinfo.Value.Instigator is Pawn; if (flag3) { Pawn pawn = (Pawn)dinfo.Value.Instigator; if (!pawn.Dead && pawn.needs.mood != null && pawn.story != null && pawn != victim) { if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.HostileTo(pawn)) { if (victim.Faction != null && victim.Faction.HostileTo(pawn.Faction) && !flag2) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KilledHumanlikeEnemy, pawn, victim, 1f, 1f)); } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Died && victim.Spawned) { List <Pawn> allPawnsSpawned = victim.Map.mapPawns.AllPawnsSpawned; for (int i = 0; i < allPawnsSpawned.Count; i++) { Pawn pawn2 = allPawnsSpawned[i]; if (pawn2 != victim && pawn2.needs.mood != null) { if (!flag && (pawn2.MentalStateDef != MentalStateDefOf.SocialFighting || ((MentalState_SocialFighting)pawn2.MentalState).otherPawn != victim)) { if (pawn2.Position.InHorDistOf(victim.Position, 12f) && GenSight.LineOfSight(victim.Position, pawn2.Position, victim.Map, false) && pawn2.Awake() && pawn2.health.capacities.CapableOf(PawnCapacityDefOf.Sight)) { if (pawn2.Faction == victim.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.WitnessedDeathAllyBleedingHeart, pawn2, null, 1f, 1f)); } else if (victim.Faction == null || (!victim.Faction.HostileTo(pawn2.Faction) || pawn2.story.traits.HasTrait(TraitDefOfPsychology.BleedingHeart))) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.WitnessedDeathNonAllyBleedingHeart, pawn2, null, 1f, 1f)); } if (!pawn2.story.traits.HasTrait(TraitDefOfPsychology.BleedingHeart) && !pawn2.story.traits.HasTrait(TraitDefOf.Psychopath) && !pawn2.story.traits.HasTrait(TraitDefOf.Bloodlust) && !pawn2.story.traits.HasTrait(TraitDefOfPsychology.Desensitized)) { if (((pawn2.GetHashCode() ^ (GenLocalDate.DayOfYear(pawn2) + GenLocalDate.Year(pawn2) + (int)(GenLocalDate.DayPercent(pawn2) * 5) * 60) * 391) % 1000) == 0) { pawn2.story.traits.GainTrait(new Trait(TraitDefOfPsychology.Desensitized)); pawn2.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOfPsychology.RecentlyDesensitized, null); } } } else if (victim.Faction == Faction.OfPlayer && victim.Faction == pawn2.Faction && victim.HostFaction != pawn2.Faction) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KnowColonistDiedBleedingHeart, pawn2, null, 1f, 1f)); } if (flag2 && pawn2.Faction == Faction.OfPlayer && !pawn2.IsPrisoner) { outIndividualThoughts.Add(new IndividualThoughtToAdd(ThoughtDefOfPsychology.KnowPrisonerDiedInnocentBleedingHeart, pawn2, null, 1f, 1f)); } } } } } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.Banished && victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOfPsychology.ColonistAbandonedBleedingHeart); } if (thoughtsKind == PawnDiedOrDownedThoughtsKind.BanishedToDie) { if (victim.IsColonist) { outAllColonistsThoughts.Add(ThoughtDefOfPsychology.ColonistAbandonedToDieBleedingHeart); } else if (victim.IsPrisonerOfColony) { outAllColonistsThoughts.Add(ThoughtDefOfPsychology.PrisonerAbandonedToDieBleedingHeart); } } }