public static PS_Hediff_Reconditioned TryGiveReconditioning(Pawn pawn, PS_Conditioning_Data conData) { var diff = (PS_Hediff_Reconditioned)HediffMaker.MakeHediff(ReconHefiffDef, pawn); diff.Severity = 1f; diff.ConditioningDataList = new List <PS_Conditioning_Data> { conData }; var brain = pawn.RaceProps.body.AllParts.Where(x => x.def.defName == "Brain").FirstOrDefault(); if (brain != null) { diff.Part = brain; } pawn.health.AddHediff(diff); pawn.needs.AddOrRemoveNeedsAsAppropriate(); var need = pawn.needs.AllNeeds.Where(x => x.def.defName == diff.def.causesNeed.defName).FirstOrDefault(); if (need == null) { Log.Error("PS_ConditioningHelper: Failed to find added need after giving hediff"); } else { need.CurLevel = 1f; } return(diff); }
public static void DoConditioning(Pawn pawn, PS_Buildings_ReconPod pod, PS_Conditioning_Data conData) { if (Prefs.DevMode) { Log.Message("PS_ConditioningHelper: Doing Conditioning Pawn: " + pawn.LabelShort + " AddedTrait: " + conData.AddedTraitDefName + " OrigonalTrait: " + conData.OriginalTraitDefName + " AlterType: " + conData.AlterType.ToString()); } if (!IsReconditioned(pawn)) { var hediff = TryGiveReconditioning(pawn, conData); if (hediff != null) { DoTraitChange(pawn, conData); } else { Log.Error("PS_ConditioningHelper: Failed to create hediff"); } } else { var hediff = pawn.health.hediffSet.GetHediffs <PS_Hediff_Reconditioned>().FirstOrDefault(); if (hediff == null) { Log.Error("PS_CondidioningHelper: Attempted to add conditioning, but failed to find reconditioned hediff"); return; } hediff.ConditioningDataList.Add(conData); DoTraitChange(pawn, conData); } }
public void DoCheatModeChange() { var conData = new PS_Conditioning_Data { AlterType = ChangeType, OriginalTraitDefName = ToRemove?.def.defName, AddedTraitDefName = ToAdd?.def.defName, OriginalDegree = ToRemove?.Degree ?? 0, AddedDegree = ToAdd?.Degree ?? 0 }; PS_ConditioningHelper.DoTraitChange(Pawn, conData); if (conData.AlterType == TraitAlterType.Added || conData.AlterType == TraitAlterType.Altered) { CurrentTraits.Add(ToAdd); } if (conData.AlterType == TraitAlterType.Removed || conData.AlterType == TraitAlterType.Altered) { CurrentTraits.Remove(ToRemove); } UpdateAddableTraits(CurrentTraits); UpdateCurrentTraits(CurrentTraits); }
public void SetConditioningToRemove(PS_Conditioning_Data data) { this.RemoveingConditioning = true; this.FixingBotch = false; this.ConditioningToRemove = data; this.ToRemove = null; this.ToAdd = null; this.ChangeType = TraitAlterType.UNSET; }
public void SetConditioningToRemove(PS_Conditioning_Data data) { RemoveingConditioning = true; FixingBotch = false; ConditioningToRemove = data; ToRemove = null; ToAdd = null; ChangeType = TraitAlterType.UNSET; }
public static void DoTraitChange(Pawn pawn, PS_Conditioning_Data conData) { if (conData.AlterType == TraitAlterType.Removed || conData.AlterType == TraitAlterType.Altered) { if (Prefs.DevMode) { Log.Message($"Will try to remove trait {conData.OriginalTraitDefName}"); } var traitList = new List <Trait>(); foreach (Trait trait in pawn.story.traits.allTraits) { if (trait.def.defName != conData.OriginalTraitDefName || trait.Degree != conData.OriginalDegree) { traitList.Add(trait); } } pawn.story.traits.allTraits = traitList; } if (conData.AlterType == TraitAlterType.Added || conData.AlterType == TraitAlterType.Altered) { if (Prefs.DevMode) { Log.Message($"Will try to add trait {conData.AddedTraitDefName}"); } pawn.story.traits.allTraits.Add(new Trait(DefDatabase <TraitDef> .GetNamed(conData.AddedTraitDefName), degree: conData.AddedDegree)); } if (pawn.workSettings != null) { pawn.workSettings.Notify_DisabledWorkTypesChanged(); } //pawn.story.Notify_TraitChanged(); <- Internal method, need to use reflection if (Prefs.DevMode) { Log.Message($"Will try to update story"); } try { typeof(Pawn_StoryTracker).GetField("cachedDisabledWorkTypes", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pawn.story, null); } catch (Exception) { } if (pawn.skills != null) { pawn.skills.Notify_SkillDisablesChanged(); } if (!pawn.Dead && pawn.RaceProps.Humanlike) { pawn.needs.mood.thoughts.situational.Notify_SituationalThoughtsDirty(); } }
public static void UndoConditioning(Pawn pawn, PS_Buildings_ReconPod pod, PS_Conditioning_Data conData) { UndoTraitChange(pawn, conData); var hediff = pawn.health.hediffSet.GetHediffs <PS_Hediff_Reconditioned>().FirstOrDefault(); hediff.ConditioningDataList.Remove(conData); if (!hediff.ConditioningDataList.Where(x => x.IsValid()).Any()) { TryRemoveConditioning(pawn); } }
private bool RoleForSucessOrHandleFail(Pawn pawn) { var conCount = PS_ConditioningHelper.GetConditioningDataFromHediff(pawn, false)?.Count() ?? 0; var successChance = PS_ConditioningHelper.GetSucessChance(conCount); var roll = Rand.Range(0f, 1f); Log.Message(string.Format("PS_Buildings_ReconPod: Rolled for sucess Chance: {0}, Roll: {1}", successChance, roll)); //roll = 1.00f; // Sucess if (roll < successChance) { return(true); } roll = Rand.Range(0f, 1f); // Fail with no coniquence if (roll > 0.3f) { pawn.needs.mood.thoughts.memories.TryGainMemory(DefDatabase <ThoughtDef> .GetNamed("PS_Thoughts_Memory_FailedConditioned")); Messages.Message(string.Format("PS_Messages_FailConditioning".Translate(), pawn.LabelShort), new LookTargets(pawn), MessageTypeDefOf.NegativeEvent); } // Botched else if (roll > 0.01f) { var bothedcondata = new PS_Conditioning_Data { AlterType = TraitAlterType.Added, AddedTraitDefName = "PS_Trait_BotchedConditioning", AddedDegree = -1 }; pawn.needs.mood.thoughts.memories.TryGainMemory(DefDatabase <ThoughtDef> .GetNamed("PS_Thoughts_Memory_BotchedConditioned")); Messages.Message(string.Format("PS_Messages_BotchedConditioning".Translate(), pawn.LabelShort), new LookTargets(pawn), MessageTypeDefOf.ThreatBig); PS_ConditioningHelper.DoTraitChange(pawn, bothedcondata); } // Lucky Botched else { var condata = new PS_Conditioning_Data { AlterType = TraitAlterType.Added, AddedTraitDefName = "PS_Trait_BotchedConditioning", AddedDegree = 1 }; pawn.needs.mood.thoughts.memories.TryGainMemory(DefDatabase <ThoughtDef> .GetNamed("PS_Thoughts_Memory_LuckyConditioned")); Messages.Message(string.Format("PS_Messages_LuckyConditioning".Translate(), pawn.LabelShort), new LookTargets(pawn), MessageTypeDefOf.ThreatBig); PS_ConditioningHelper.DoTraitChange(pawn, condata); } return(false); }
public override string LabelBase => "Reconditioned";//switch (this.ConditioningData.AlterType)//{// case TraitAlterType.Added:// return "PS_HediffReconditionedAddedLab".Translate() + " " + this.ConditioningData.AddedTraitLabel;// case TraitAlterType.Removed:// return "PS_HediffReconditionedRemovedLab".Translate() + " " + this.ConditioningData.OrigonalTraitLabel;// case TraitAlterType.Altered:// return "PS_HediffReconditionedAlteredLab".Translate() + " " + this.ConditioningData.OrigonalTraitLabel;// case TraitAlterType.UNSET:// Log.Error("PS_Hediff_Reconditioned: Tried to get label of hediff with ChangeType = UNSET.");// return "ERROR";// default:// Log.Error("PS_Hediff_Reconditioned: Tried to get label of hediff with unknown ChangeType.");// return "ERROR";//} private void CheckForOldConData() { if (ConditioningData != null) { if (ConditioningDataList == null || !ConditioningDataList.Any()) { Log.Message(string.Format("PS_Hediff_Reconditoning: Condition data for {0} found as single and not list. This is due to multi-condition update. Building list now.", pawn.LabelShort)); ConditioningDataList = new List <PS_Conditioning_Data> { new PS_Conditioning_Data { PawnId = ConditioningData.PawnId, AddedTraitDefName = ConditioningData.AddedTraitDefName, OriginalTraitDefName = ConditioningData.OriginalTraitDefName, AddedDegree = ConditioningData.AddedDegree, OriginalDegree = ConditioningData.OriginalDegree, AlterType = ConditioningData.AlterType } }; ConditioningData = null; return; } else if (!ConditioningDataList.Where(x => x.IsSame(ConditioningData)).Any()) { Log.Message(string.Format("PS_Hediff_Reconditoning: Condition data for {0} found as single and not list due to update. But list was already occupied.", pawn.LabelShort)); ConditioningDataList.Add(new PS_Conditioning_Data { PawnId = ConditioningData.PawnId, AddedTraitDefName = ConditioningData.AddedTraitDefName, OriginalTraitDefName = ConditioningData.OriginalTraitDefName, AddedDegree = ConditioningData.AddedDegree, OriginalDegree = ConditioningData.OriginalDegree, AlterType = ConditioningData.AlterType }); ConditioningData = null; } var tempList = new List <PS_Conditioning_Data>(); tempList = ConditioningDataList.Where(x => x.IsValid()).ToList(); ConditioningDataList.Clear(); ConditioningDataList = tempList; } }
public static void UndoTraitChange(Pawn pawn, PS_Conditioning_Data conData) { //Log.Message(string.Format("PS_ReconPod: Undoing Trait Change Pawn: {0}, ConData: {1}", pawn.LabelShort, conData.ToString())); if (conData.AlterType == TraitAlterType.Added || conData.AlterType == TraitAlterType.Altered) { var traitList = new List <Trait>(); foreach (Trait currentTrait in pawn.story.traits.allTraits) { if (currentTrait.def.defName != conData.AddedTraitDefName || currentTrait.Degree != conData.AddedDegree) { traitList.Add(currentTrait); } } pawn.story.traits.allTraits = traitList; } if (conData.AlterType == TraitAlterType.Removed || conData.AlterType == TraitAlterType.Altered) { pawn.story.traits.allTraits.Add(new Trait(DefDatabase <TraitDef> .GetNamed(conData.OriginalTraitDefName), degree: conData.OriginalDegree)); //Log.Message("PS_ConditoningHelper: UndoTraitChange added trait " + conData.OrigonalTraitDefName + " degree: " + conData.OrigonalDegree); } if (pawn.workSettings != null) { pawn.workSettings.Notify_DisabledWorkTypesChanged(); } //pawn.story.Notify_TraitChanged(); <- Internal method, need to use reflection try { typeof(Pawn_StoryTracker).GetField("cachedDisabledWorkTypes", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pawn.story, null); } catch (Exception) { } if (pawn.skills != null) { pawn.skills.Notify_SkillDisablesChanged(); } if (!pawn.Dead && pawn.RaceProps.Humanlike) { pawn.needs.mood.thoughts.situational.Notify_SituationalThoughtsDirty(); } }
public void StartDeconditioning(Pawn pawn, PS_Conditioning_Data conData) { //if (pawn.ThingID != this.PodOwnerId) if (this.PodOwner != pawn) { return; } this.SaveNeeds(pawn.needs.AllNeeds); pawn.DeSpawn(DestroyMode.Vanish); if (this.TryAcceptThing(pawn)) { this.CurrentMaxTicks = this.TicksPerDay; this.CurrentTicksLeft = CurrentMaxTicks; this.JobState = PS_Conditioning_JobState.Deconditioning; this.ConditioningData = conData; EffecterDef progressBar = EffecterDefOf.ProgressBar; ProgressBarEffector = progressBar.Spawn(); var target = new TargetInfo(this); ProgressBarEffector.EffectTick(target, TargetInfo.Invalid); } }
private void ApplyNewTraits(Pawn Pawn) { if (this.RemoveingConditioning) { this.Pod.StartDeconditioning(Pawn, this.ConditioningToRemove); } else if (this.FixingBotch) { this.Pod.StartFixingBotched(Pawn); } else if (this.ChangeType != TraitAlterType.UNSET) { var conData = new PS_Conditioning_Data { AlterType = this.ChangeType, OriginalTraitDefName = this.ToRemove?.def.defName, AddedTraitDefName = this.ToAdd?.def.defName, OriginalDegree = this.ToRemove?.Degree ?? 0, AddedDegree = this.ToAdd?.Degree ?? 0 }; this.Pod.StartReconditioning(Pawn, conData); } }
public void StartReconditioning(Pawn pawn, PS_Conditioning_Data conData) { if (this.PodOwner != null && this.PodOwner != pawn)//!string.IsNullOrEmpty(this.PodOwnerId) && pawn.ThingID != this.PodOwnerId) { Log.Error("PS_Buildings_ReconPod: Tried to start conditioning on a pawn that was not the owner"); return; } this.SaveNeeds(pawn.needs.AllNeeds); pawn.DeSpawn(DestroyMode.Vanish); if (this.TryAcceptThing(pawn)) { this.ConditioningData = conData; this.CurrentMaxTicks = PS_ConditioningHelper.DaysToCondition(pawn) * this.TicksPerDay; this.CurrentTicksLeft = CurrentMaxTicks; this.JobState = PS_Conditioning_JobState.Reconditioning; this.TryAssignPawn(pawn); EffecterDef progressBar = EffecterDefOf.ProgressBar; ProgressBarEffector = progressBar.Spawn(); var target = new TargetInfo(this); ProgressBarEffector.EffectTick(target, TargetInfo.Invalid); } }
public bool IsSame(PS_Conditioning_Data conData) { return(AlterType == conData.AlterType && OriginalTraitDefName == conData.OriginalTraitDefName && OriginalDegree == conData.OriginalDegree && AddedTraitDefName == conData.AddedTraitDefName && AddedDegree == conData.AddedDegree); }