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);
            }
        }
Example #3
0
        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);
        }
Example #4
0
 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;
 }
Example #5
0
 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);
            }
        }
Example #8
0
        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);
        }
Example #9
0
        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();
            }
        }
Example #11
0
        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);
            }
        }
Example #12
0
 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);
     }
 }
Example #13
0
        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);
 }