Exemple #1
0
 public static void PawnTrainingTrackerPostLoadInit(Pawn_TrainingTracker tracker, ref DefMap <TrainableDef, bool> wantedTrainables, ref DefMap <TrainableDef, int> steps, ref DefMap <TrainableDef, bool> learned)
 {
     if (wantedTrainables == null)
     {
         wantedTrainables = new DefMap <TrainableDef, bool>();
     }
     if (steps == null)
     {
         steps = new DefMap <TrainableDef, int>();
     }
     if (learned == null)
     {
         learned = new DefMap <TrainableDef, bool>();
     }
     if (tracker.GetSteps(TrainableDefOf.Tameness) == 0 && DefDatabase <TrainableDef> .AllDefsListForReading.Any((TrainableDef td) => tracker.GetSteps(td) != 0))
     {
         tracker.Train(TrainableDefOf.Tameness, null, complete: true);
     }
     foreach (TrainableDef item in DefDatabase <TrainableDef> .AllDefsListForReading)
     {
         if (tracker.GetSteps(item) == item.steps)
         {
             tracker.Train(item, null, complete: true);
         }
     }
 }
Exemple #2
0
        // Token: 0x06000005 RID: 5 RVA: 0x000020B4 File Offset: 0x000002B4
        public override void PawnDied(Corpse corpse)
        {
            float value  = (float)corpse.InnerPawn.ageTracker.AgeBiologicalYears;
            float value2 = (float)corpse.InnerPawn.ageTracker.AgeChronologicalYears;
            Name  name   = corpse.InnerPawn.Name;
            Pawn_PlayerSettings   playerSettings = corpse.InnerPawn.playerSettings;
            Pawn_TrainingTracker  training       = corpse.InnerPawn.training;
            Pawn_HealthTracker    health         = corpse.InnerPawn.health;
            Pawn_RecordsTracker   records        = corpse.InnerPawn.records;
            Pawn_RelationsTracker relations      = corpse.InnerPawn.relations;
            Pawn_SkillTracker     skills         = corpse.InnerPawn.skills;
            Faction       faction  = corpse.InnerPawn.Faction;
            Comp_TimeLord timeLord = corpse.InnerPawn.TryGetComp <Comp_TimeLord>();

            if (timeLord != null)
            {
                if (timeLord.TimesRegenerated < 13)
                {
                    int regens = timeLord.TimesRegenerated;
                    regens++;
                    Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(corpse.InnerPawn.kindDef, faction, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 0f, false, false, false, false, false, false, false, false, 0, null, 1, null, null, null));
                    pawn.TryGetComp <Comp_TimeLord>().TimesRegenerated = regens;
                    GenSpawn.Spawn(pawn, corpse.Position, corpse.Map, Rot4.Random);
                    pawn.Name           = name;
                    pawn.relations      = relations;
                    pawn.training       = training;
                    pawn.records        = records;
                    pawn.skills         = skills;
                    pawn.playerSettings = playerSettings;
                    corpse.Destroy(0);
                }
            }
        }
        public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef)
        {
            Thing             brainScanThing = ThingMaker.MakeThing(genomeDef);
            BrainScanTemplate brainScan      = brainScanThing as BrainScanTemplate;

            if (brainScan != null)
            {
                //Standard.
                brainScan.sourceName = pawn?.Name?.ToStringFull ?? null;

                //Backgrounds
                Pawn_StoryTracker story = pawn.story;
                if (story != null)
                {
                    brainScan.backStoryChild = story.childhood;
                    brainScan.backStoryAdult = story.adulthood;
                }

                //Skills
                Pawn_SkillTracker skillTracker = pawn.skills;
                if (skillTracker != null)
                {
                    foreach (SkillRecord skill in skillTracker.skills)
                    {
                        brainScan.skills.Add(new SkillRecord()
                        {
                            def     = skill.def,
                            Level   = skill.Level,
                            passion = skill.passion
                        });
                    }
                }

                //Animal
                brainScan.isAnimal = pawn.RaceProps.Animal;

                //Training
                Pawn_TrainingTracker trainingTracker = pawn.training;
                if (trainingTracker != null)
                {
                    DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap <TrainableDef, int>  steps   = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in learned)
                    {
                        brainScan.trainingLearned[item.Key] = item.Value;
                    }
                    foreach (var item in steps)
                    {
                        brainScan.trainingSteps[item.Key] = item.Value;
                    }
                }
            }

            return(brainScanThing);
        }
        public static void ApplyBrainScanTemplateOnPawn(Pawn thePawn, BrainScanTemplate brainScan, float efficency = 1f)
        {
            if(thePawn.IsValidBrainScanningTarget())
            {
                //Backgrounds
                Pawn_StoryTracker storyTracker = thePawn.story;
                if (storyTracker != null)
                {
                    //story.childhood = brainScan.backStoryChild;
                    storyTracker.adulthood = brainScan.backStoryAdult;
                }

                //Skills
                Pawn_SkillTracker skillTracker = thePawn.skills;
                if (skillTracker != null)
                {
                    foreach (ComparableSkillRecord skill in brainScan.skills)
                    {
                        SkillRecord pawnSkill = skillTracker.GetSkill(skill.def);
                        pawnSkill.Level = (int)Math.Floor((float)skill.level * efficency);
                        pawnSkill.passion = skill.passion;
                        pawnSkill.Notify_SkillDisablesChanged();
                    }
                }

                //Dirty hack ahoy!
                if(storyTracker != null)
                {
                    AccessTools.Field(typeof(Pawn_StoryTracker), "cachedDisabledWorkTypes").SetValue(storyTracker, null);
                }

                //Training
                Pawn_TrainingTracker trainingTracker = thePawn.training;
                if (trainingTracker != null)
                {
                    DefMap<TrainableDef, bool> learned = (DefMap<TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap<TrainableDef, int> steps = (DefMap<TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in brainScan.trainingLearned)
                    {
                        learned[item.Key] = item.Value;
                    }
                    foreach (var item in brainScan.trainingSteps)
                    {
                        steps[item.Key] = (int)Math.Floor((float)item.Value * efficency);
                    }
                }

                //Apply Hediff
                thePawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated);

                Messages.Message("QE_BrainTemplatingComplete".Translate(thePawn.Named("PAWN")), MessageTypeDefOf.PositiveEvent, false);
            }
        }
        public static float computeTrainPriority(Pawn worker, Pawn target)
        {
            Pawn_TrainingTracker train     = target.training;
            TrainableDef         nextTrain = train.NextTrainableToTrain();
            MethodInfo           dynMethod = train.GetType().GetMethod("GetSteps", BindingFlags.Instance | BindingFlags.NonPublic);
            int   steps    = (int)dynMethod.Invoke(train, new object[] { nextTrain });
            float priority = trainmap[nextTrain.defName];

            if (nextTrain.defName == "Tameness")
            {
                priority += (10 - steps);
            }
            else
            {
                priority += steps;
            }
            //Log.Message("Hello from computeTrainPriority with pawn: " + target.Name.ToStringShort + ", " + nextTrain.defName + ", Steps:" + steps + ", Priority" + priority);
            return(priority);
        }
Exemple #6
0
        public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef)
        {
            Thing             brainScanThing = ThingMaker.MakeThing(genomeDef);
            BrainScanTemplate brainScan      = brainScanThing as BrainScanTemplate;

            if (brainScan != null)
            {
                //Standard.
                brainScan.sourceName = pawn?.Name?.ToStringFull ?? null;
                brainScan.kindDef    = pawn?.kindDef ?? null;

                //Backgrounds
                Pawn_StoryTracker story = pawn.story;
                if (story != null)
                {
                    brainScan.backStoryChild = story.childhood;
                    brainScan.backStoryAdult = story.adulthood;
                }

                //Skills
                Pawn_SkillTracker skillTracker = pawn.skills;
                if (skillTracker != null)
                {
                    foreach (SkillRecord skill in skillTracker.skills)
                    {
                        brainScan.skills.Add(new ComparableSkillRecord()
                        {
                            def     = skill.def,
                            level   = skill.Level,
                            passion = skill.passion
                        });
                    }
                }

                //Animal
                brainScan.isAnimal = pawn.RaceProps.Animal;

                //Training
                Pawn_TrainingTracker trainingTracker = pawn.training;
                if (trainingTracker != null)
                {
                    DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap <TrainableDef, int>  steps   = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in learned)
                    {
                        brainScan.trainingLearned[item.Key] = item.Value;
                    }
                    foreach (var item in steps)
                    {
                        brainScan.trainingSteps[item.Key] = item.Value;
                    }
                }

                //Hediffs
                if (pawn?.health?.hediffSet?.hediffs != null)
                {
                    List <Hediff> pawnHediffs = pawn.health.hediffSet.hediffs;
                    if (pawnHediffs.Count > 0)
                    {
                        foreach (Hediff h in pawnHediffs)
                        {
                            if (GeneralCompatibility.includedBrainTemplateHediffs.Any(hediffDef => h.def.defName == hediffDef.defName))
                            {
                                QEEMod.TryLog("Hediff " + h.def.defName + " will be added to brain template");

                                brainScan.hediffInfos.Add(new HediffInfo(h));
                            }
                        }
                    }
                }
            }

            return(brainScanThing);
        }
        public static int GetSteps(Pawn_TrainingTracker training, TrainableDef td)
        {
            DefMap <TrainableDef, int> defMap = (DefMap <TrainableDef, int>)TrainingCardUtility.stepsField.GetValue(training);

            return(defMap[td]);
        }
        public static void ApplyBrainScanTemplateOnPawn(Pawn thePawn, BrainScanTemplate brainScan, float efficency = 1f)
        {
            if (thePawn.IsValidBrainScanningTarget())
            {
                //Backgrounds
                Pawn_StoryTracker storyTracker = thePawn.story;
                if (storyTracker != null)
                {
                    //story.childhood = brainScan.backStoryChild;
                    storyTracker.adulthood = brainScan.backStoryAdult;
                }

                //Skills
                Pawn_SkillTracker skillTracker = thePawn.skills;
                if (skillTracker != null)
                {
                    foreach (ComparableSkillRecord skill in brainScan.skills)
                    {
                        SkillRecord pawnSkill = skillTracker.GetSkill(skill.def);
                        pawnSkill.Level   = (int)Math.Floor((float)skill.level * efficency);
                        pawnSkill.passion = skill.passion;
                        pawnSkill.Notify_SkillDisablesChanged();
                    }
                }

                //Training
                Pawn_TrainingTracker trainingTracker = thePawn.training;
                if (trainingTracker != null)
                {
                    DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap <TrainableDef, int>  steps   = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in brainScan.trainingLearned)
                    {
                        learned[item.Key] = item.Value;
                    }
                    foreach (var item in brainScan.trainingSteps)
                    {
                        steps[item.Key] = (int)Math.Floor((float)item.Value * efficency);
                    }
                }

                //Add Hediffs
                thePawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated);
                if (brainScan.hediffInfos != null && brainScan.hediffInfos?.Count > 0)
                {
                    //add hediffs to pawn from defs in HediffInfo class
                    foreach (HediffInfo h in brainScan.hediffInfos)
                    {
                        Hediff addedHediff = thePawn.health.AddHediff(h.def, h.part);

                        //Psychic Awakened compatibility
                        if (h.psychicAwakeningPowersKnownDefNames != null && h.psychicAwakeningPowersKnownDefNames?.Count > 0)
                        {
                            //create a List of the type PsychicPowerDef via Reflection. Cast it as IList to interact with it.
                            var   listType        = typeof(List <>).MakeGenericType(PsychicAwakeningCompat.PsychicPowerDefType);
                            var   powers          = Activator.CreateInstance(listType);
                            IList powersInterface = (IList)powers;

                            //iterate through the defNames saved in the list inside HediffInfo
                            foreach (string defName in h.psychicAwakeningPowersKnownDefNames)
                            {
                                //look for this PsychicPowerDef in the DefDatabase
                                var psychicPowerDef = GenDefDatabase.GetDef(PsychicAwakeningCompat.PsychicPowerDefType, defName, false);

                                if (psychicPowerDef != null)
                                {
                                    //add this to the list
                                    powersInterface.Add(psychicPowerDef);
                                }
                                else
                                {
                                    QEEMod.TryLog("Psychic Power def " + defName + " not loaded in database of Rimworld Defs. This power will not be applied.");
                                }
                            }

                            if (powersInterface.Count > 0)
                            {
                                QEEMod.TryLog("assigning " + powersInterface.Count + " psychic powers to " + thePawn.LabelCap + " from brain template");

                                PsychicAwakeningCompat.powersKnownField.SetValue(addedHediff, powers);
                            }
                        }
                    }
                }

                Messages.Message("QE_BrainTemplatingComplete".Translate(thePawn.Named("PAWN")), MessageTypeDefOf.PositiveEvent, false);
            }
        }
        public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef)
        {
            Thing             brainScanThing = ThingMaker.MakeThing(genomeDef);
            BrainScanTemplate brainScan      = brainScanThing as BrainScanTemplate;

            if (brainScan != null)
            {
                //Standard.
                brainScan.sourceName = pawn?.Name?.ToStringFull ?? null;

                //Backgrounds
                Pawn_StoryTracker story = pawn.story;
                if (story != null)
                {
                    brainScan.backStoryChild = story.childhood;
                    brainScan.backStoryAdult = story.adulthood;
                    brainScan.hairDef        = story.hairDef;
                }

                //Skills
                Pawn_SkillTracker skillTracker = pawn.skills;
                if (skillTracker != null)
                {
                    foreach (SkillRecord skill in skillTracker.skills)
                    {
                        brainScan.skills.Add(new SkillRecord()
                        {
                            def     = skill.def,
                            Level   = skill.Level,
                            passion = skill.passion
                        });
                    }
                }

                //Relations
                //I have no clue on this one, but it NEEDS to happen or this mod won't do what it promises

                /*Pawn_RelationsTracker relationsTracker = pawn.relations;
                 * if (relationsTracker != null)
                 * {
                 *  foreach (DirectPawnRelation relations in relationsTracker.DirectRelations)
                 *  {
                 *      brainScan.directRelations.Add(new DirectPawnRelation()
                 *      {
                 *          def = relations.def,
                 *          otherPawn = relations.otherPawn,
                 *          startTicks = relations.startTicks,
                 *  });
                 *  }
                 * }*/

                //Animal
                brainScan.isAnimal = pawn.RaceProps.Animal;

                //Training
                Pawn_TrainingTracker trainingTracker = pawn.training;
                if (trainingTracker != null)
                {
                    DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap <TrainableDef, int>  steps   = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in learned)
                    {
                        brainScan.trainingLearned[item.Key] = item.Value;
                    }
                    foreach (var item in steps)
                    {
                        brainScan.trainingSteps[item.Key] = item.Value;
                    }
                }
            }

            return(brainScanThing);
        }
        public static void ApplyBrainScanTemplateOnPawn(Pawn pawn, BrainScanTemplate brainScan, float efficency = 1f)
        {
            if (pawn.IsValidBrainScanningTarget())
            {
                //Backgrounds
                Pawn_StoryTracker storyTracker = pawn.story;
                if (storyTracker != null)
                {
                    //Log.Warning("Child backstory transferring...");
                    storyTracker.childhood = brainScan.backStoryChild;
                    //Log.Warning("Adult backstory transferring...");
                    storyTracker.adulthood = brainScan.backStoryAdult;
                    //Log.Warning("Hairstyle being grown...");
                    storyTracker.hairDef = brainScan.hairDef;
                }

                //Skills

                Pawn_SkillTracker skillTracker = pawn.skills;
                if (skillTracker != null)
                {
                    foreach (SkillRecord skill in brainScan.skills)
                    {
                        //Log.Warning("Iterating through skills...");
                        SkillRecord pawnSkill = skillTracker.GetSkill(skill.def);
                        pawnSkill.Level   = (int)Math.Floor((float)skill.levelInt * efficency);
                        pawnSkill.passion = skill.passion;
                        pawnSkill.Notify_SkillDisablesChanged();
                    }
                }

                /*Pawn_RelationsTracker relationsTracker = pawn.relations;
                 * if (relationsTracker != null)
                 * {
                 *  foreach (DirectPawnRelation relations in brainScan.directRelations)
                 *  {
                 *      DirectPawnRelation relationDef = relationsTracker.GetDirectRelation(relations.def, relations.otherPawn);
                 *      relationDef.def = relations.def;
                 *      relationDef.otherPawn = relations.otherPawn;
                 *      relationDef.startTicks = relations.startTicks;
                 *  }
                 * }*/

                //Dirty hack ahoy! - No longer exists in 1.1
                //if (storyTracker != null)
                //{
                //    //Log.Warning("Transferring disabled worktypes... (yes, they still can't haul)");
                //    AccessTools.Field(typeof(Pawn_StoryTracker), "cachedDisabledWorkTypes").SetValue(storyTracker, null);
                //}

                //Training
                Pawn_TrainingTracker trainingTracker = pawn.training;
                if (trainingTracker != null)
                {
                    DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker);
                    DefMap <TrainableDef, int>  steps   = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker);

                    //Copy
                    foreach (var item in brainScan.trainingLearned)
                    {
                        learned[item.Key] = item.Value;
                    }
                    foreach (var item in brainScan.trainingSteps)
                    {
                        steps[item.Key] = (int)Math.Floor((float)item.Value * efficency);
                    }
                }

                //Apply Hediff
                pawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated);
            }
        }