예제 #1
0
        private static int sum_previous_gains(SkillDef def, Pawn_StoryTracker sto, Pawn_AgeTracker age)
        {
            int total_gain = 0;
            int gain;

            // Gains from backstories
            if (sto.childhood.skillGainsResolved.TryGetValue(def, out gain))
            {
                total_gain += gain;
            }
            if (sto.adulthood.skillGainsResolved.TryGetValue(def, out gain))
            {
                total_gain += gain;
            }

            // Gains from traits
            foreach (var trait in sto.traits.allTraits)
            {
                if (trait.CurrentData.skillGains.TryGetValue(def, out gain))
                {
                    total_gain += gain;
                }
            }

            // Gains from age
            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            var rgain      = Rand.Value * (float)total_gain * 0.35f;
            var age_factor = Mathf.Clamp01((age.AgeBiologicalYearsFloat - 17.0f) / 10.0f);             // Assume nymphs are 17~27

            total_gain += (int)(age_factor * rgain);

            return(Mathf.Clamp(total_gain, 0, 20));
        }
        // Token: 0x06000057 RID: 87 RVA: 0x000057F8 File Offset: 0x000039F8
        public static void ChkMSImmunisation(Pawn p, out string Reason, out bool Passed)
        {
            Reason = null;
            if (!p.RaceProps.Humanlike)
            {
                Passed = false;
                Reason = "MSExotic.NotHumanLike".Translate(p?.LabelShort.CapitalizeFirst());
                return;
            }
            TraitDef Immunity = DefDatabase <TraitDef> .GetNamed("Immunity", true);

            if (p.story.traits.HasTrait(Immunity) && p != null)
            {
                Pawn_StoryTracker story = p.story;
                int?num;
                if (story == null)
                {
                    num = null;
                }
                else
                {
                    TraitSet traits = story.traits;
                    num = ((traits != null) ? new int?(traits.GetTrait(Immunity).Degree) : null);
                }
                int?num2 = num;
                int num3 = 1;
                if (num2.GetValueOrDefault() == num3 & num2 != null)
                {
                    Passed = false;
                    Reason = "MSExotic.AlreadyHasImmunity".Translate(p?.LabelShort.CapitalizeFirst());
                    return;
                }
            }
            Passed = true;
        }
        // Token: 0x0600007C RID: 124 RVA: 0x000067F8 File Offset: 0x000049F8
        public static void RemoveTrait(Pawn pawn, Trait trait, string doer, MessageTypeDef MsgType, bool SendMsg = true)
        {
            Pawn_StoryTracker story    = pawn.story;
            Trait             remTrait = (story != null) ? (from x in story.traits.allTraits
                                                            where x.def == trait.def
                                                            select x).FirstOrDefault() : null;

            if (remTrait == null)
            {
                return;
            }
            if (pawn != null)
            {
                Pawn_StoryTracker story2 = pawn.story;
                if (story2 != null)
                {
                    story2.traits.allTraits.Remove(remTrait);
                }
            }
            MSTraitChanger.TraitsUpdated(pawn);
            if (SendMsg)
            {
                string        key    = "MSExotic.TraitRemoved";
                NamedArgument arg    = pawn?.LabelShort.CapitalizeFirst();
                Trait         trait2 = trait;
                Messages.Message(key.Translate(arg, trait2?.Label.CapitalizeFirst(), doer.CapitalizeFirst()), pawn, MsgType, true);
            }
        }
예제 #4
0
        public override void SpawnSetup(Map map, bool respawningAfterLoad)
        {
            //Kill all invalid spawns
            if (this.station == null)
            {
                this.Kill(null);
                return;
            }

            base.SpawnSetup(map, respawningAfterLoad);
            skills        = new Pawn_SkillTracker(this);
            skillSettings = station.def.GetModExtension <ModExtension_Skills>();
            station.GetDroneSkillsRecord = DroneSkills.UpdateSkills(skills, station.GetDroneSkillsRecord, skillSettings, true);

            story = new Pawn_StoryTracker(this)
            {
                bodyType  = BodyTypeDefOf.Thin,
                crownType = CrownType.Average,
                childhood = DroneBackstories.childhood,
                adulthood = DroneBackstories.adulthood
            };
            drafter   = new Pawn_DraftController(this);
            relations = new Pawn_RelationsTracker(this);
            Name      = new NameSingle("PRFDroneName".Translate());

            //Set the AreaRestriction. null means Unrestricted
            playerSettings.AreaRestriction = this.station.droneAllowedArea;
        }
예제 #5
0
        public static Thing MakeGenomeSequence(Pawn pawn, ThingDef genomeDef)
        {
            Thing          genomeThing    = ThingMaker.MakeThing(genomeDef);
            GenomeSequence genomeSequence = genomeThing as GenomeSequence;

            if (genomeSequence != null)
            {
                //Standard.
                genomeSequence.sourceName = pawn?.Name?.ToStringFull ?? null;
                if (genomeSequence.sourceName == null)
                {
                    genomeSequence.sourceName = pawn.def.LabelCap;
                }
                genomeSequence.pawnKindDef = pawn.kindDef;
                genomeSequence.gender      = pawn.gender;

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

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

                //Humanoid only.
                Pawn_StoryTracker story = pawn.story;
                if (story != null)
                {
                    genomeSequence.bodyType        = story.bodyType;
                    genomeSequence.crownType       = story.crownType;
                    genomeSequence.hairColor       = story.hairColor;
                    genomeSequence.skinMelanin     = story.melanin;
                    genomeSequence.hair            = story.hairDef;
                    genomeSequence.headGraphicPath = story.HeadGraphicPath;

                    foreach (Trait trait in story.traits.allTraits)
                    {
                        genomeSequence.traits.Add(new ExposedTraitEntry(trait));
                    }
                }

                //Alien Races compatibility.
                if (CompatibilityTracker.AlienRacesActive)
                {
                    AlienRaceCompat.GetFieldsFromAlienComp(pawn, genomeSequence);
                }
            }

            return(genomeThing);
        }
        private void ChangeBodyType(Pawn pawn, BodyTypeDef bt)
        {
            AlienPartGenerator alienPartGenerator = alienRace.alienRace.generalSettings.alienPartGenerator;
            var storyTrv    = Traverse.Create(pawn.story);
            var newStory    = new Pawn_StoryTracker(pawn);
            var newStoryTrv = Traverse.Create(newStory);

            AccessTools.GetFieldNames(typeof(Pawn_StoryTracker))
            .ForEach(f => newStoryTrv.Field(f).SetValue(storyTrv.Field(f).GetValue()));
            newStory.bodyType = bt;
            if (Props.colourSkinTwo || Props.colourSkin)
            {
                if (compAlien != null)
                {
                    ColorChannelGenerator Alienskin = alienRace.alienRace.generalSettings.alienPartGenerator.colorChannels.Find(x => x.name == "skin");
                    AlienPartGenerator.ExposableValueTuple <UnityEngine.Color, UnityEngine.Color> skin;
                    if (compAlien.ColorChannels.TryGetValue("skin", out skin))
                    {
                        if (Props.colourSkin && Alienskin?.first != null)
                        {
                            skin.first = Alienskin.first.NewRandomizedColor();
                        }
                        if (Props.colourSkinTwo && Alienskin?.second != null)
                        {
                            skin.second = Alienskin.second.NewRandomizedColor();
                        }
                        compAlien.ColorChannels.SetOrAdd("skin", skin);
                    }
                    Traverse.Create(newStory).Field("SkinColor").SetValue(skin.first);
                    Pawn.Notify_ColorChanged();
                }
            }
            if (Props.changeHead)
            {
                List <string> heads = new List <string>();
                if (!Props.crownType.NullOrEmpty())
                {
                    heads.Add(Props.crownType);
                }
                else
                {
                    heads.AddRange(alienPartGenerator.aliencrowntypes);
                }
                compAlien.crownType = null;

                if (Pawn.story.HeadGraphicPath.Contains("Average"))
                {
                    newStory.crownType = CrownType.Average;
                }
                else if (Pawn.story.HeadGraphicPath.Contains("Narrow"))
                {
                    newStory.crownType = CrownType.Narrow;
                }
            }
            pawn.story = newStory;
            Traverse.Create(newStory).Field("headGraphicPath").SetValue(alienRace.alienRace.graphicPaths.GetCurrentGraphicPath(pawn.ageTracker.CurLifeStage).head.NullOrEmpty() ? "" : alienPartGenerator.RandomAlienHead(alienRace.alienRace.graphicPaths.GetCurrentGraphicPath(pawn.ageTracker.CurLifeStage).head, Pawn));
            pawn.Drawer.renderer.graphics.ResolveAllGraphics();
            Find.ColonistBar.drawer.Notify_RecachedEntries();
        }
예제 #7
0
 private void InitStory()
 {
     // Story
     story = new Pawn_StoryTracker(this)
     {
         childhood = Childhood, adulthood = Adulthood,
     };
 }
예제 #8
0
        private void trainPawnDone(String def)
        {
            PawnGenerationRequest request = new PawnGenerationRequest(DefDatabase <PawnKindDef> .GetNamed(def, true), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, true, 1f, false, true, true, false, false, false, false, null, null, null, null, null, null, null);
            Pawn item            = PawnGenerator.GeneratePawn(request);
            Pawn_StoryTracker ps = item.story;

            ps.childhood        = null;
            ps.adulthood        = null;
            ps.traits.allTraits = new List <Trait>();
            ps.traits.GainTrait(new Trait(DefDatabase <TraitDef> .GetNamed("ra2_MakeSoldier", true)));
            ps.traits.GainTrait(new Trait(TraitDefOf.Psychopath));


            Pawn_WorkSettings pws = item.workSettings;

            pws.DisableAll();
            Pawn_PlayerSettings pps = item.playerSettings;

            pps.hostilityResponse = HostilityResponseMode.Attack;

            NameTriple triple = NameTriple.FromString(item.kindDef.label.Replace(" ", ""));

            item.Name = triple;
            item.inventory.DestroyAll();


            YuriSoldierMakeUp.tryMakeUp(item);



            SoundStarter.PlayOneShotOnCamera(DefDatabase <SoundDef> .GetNamed(this.parent.def.defName + "_UnitReady", true));


            IntVec3 loc = CellFinder.RandomClosewalkCellNear(this.parent.Position, this.parent.Map, 3, null);

            Pawn pp;

            if (this.trainPawns[0] != "ra2_AlliedTanya")
            {
                pp = (Pawn)(GenSpawn.Spawn(item, loc, this.parent.Map, WipeMode.Vanish));
            }
            else
            {
                // bool flag = true;
                if (getAllTanya().Count > 0)
                {
                    foreach (Pawn tanya in getAllTanya())
                    {
                        tanya.Destroy(DestroyMode.Vanish);
                    }
                }
                pp = (Pawn)(GenSpawn.Spawn(getTanya(), loc, this.parent.Map, WipeMode.Vanish));
            }


            this.trainPawns.Remove(this.trainPawns[0]);
            this.ticks = 0;
        }
예제 #9
0
        public static void SetMayorLabel(Pawn_StoryTracker __instance, ref String __result)
        {
            Pawn p = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (p != null && p.health.hediffSet.HasHediff(HediffDefOfPsychology.Mayor))
            {
                __result = "MayorTitle".Translate();
            }
        }
        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);
            }
        }
예제 #12
0
파일: Main.cs 프로젝트: MDarque/Cyberpunk
        public static void ChangeBodyType(Pawn pawn, BodyTypeDef bt)
        {
            var storyTrv    = Traverse.Create(pawn.story);
            var newStory    = new Pawn_StoryTracker(pawn);
            var newStoryTrv = Traverse.Create(newStory);

            AccessTools.GetFieldNames(typeof(Pawn_StoryTracker))
            .ForEach(f => newStoryTrv.Field(f).SetValue(storyTrv.Field(f).GetValue()));
            newStory.bodyType = bt;
            pawn.story        = newStory;
            pawn.Drawer.renderer.graphics.ResolveAllGraphics();
        }
        // RimWorld.Pawn_StoryTracker
        public static bool get_SkinColor_Vamp(Pawn_StoryTracker __instance, ref Color __result)
        {
            Pawn p = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (p.IsVampire())
            {
                __result = VampireSkinColors.GetVampireSkinColor(p,
                                                                 Traverse.Create(__instance).Field("melanin").GetValue <float>());
                return(false);
            }

            return(true);
        }
예제 #14
0
        private void ChangeBodyType(Pawn pawn, BodyTypeDef bt)
        {
            var storyTrv    = Traverse.Create(pawn.story);
            var newStory    = new Pawn_StoryTracker(pawn);
            var newStoryTrv = Traverse.Create(newStory);

            AccessTools.GetFieldNames(typeof(Pawn_StoryTracker))
            .ForEach(f => newStoryTrv.Field(f).SetValue(storyTrv.Field(f).GetValue()));
            newStory.bodyType = bt;
            pawn.story        = newStory;
            pawn.Drawer.renderer.graphics.ResolveAllGraphics();
            Find.ColonistBar.drawer.Notify_RecachedEntries();
        }
예제 #15
0
            public static void RefreshStoryTracker(Pawn_StoryTracker storyTracker, Pawn pawn)
            {
                var req = new PawnGenerationRequest(pawn.kindDef, canGeneratePawnRelations: false);

                if (storyTracker.adulthood != null)
                {
                    GenerateBodyType.GetValue(pawn, default(PawnGenerationRequest));
                }

                if (storyTracker.adulthood?.forcedTraits != null || storyTracker.childhood?.forcedTraits != null)
                {
                    storyTracker.traits.allTraits.Clear();
                    GenerateTraits.GetValue(pawn, req);
                }
            }
 // Token: 0x0600007D RID: 125 RVA: 0x000068C8 File Offset: 0x00004AC8
 public static void AddTrait(Pawn pawn, Trait trait, string doer, MessageTypeDef MsgType, bool SendMsg = true)
 {
     if (pawn != null)
     {
         Pawn_StoryTracker story = pawn.story;
         if (story != null)
         {
             story.traits.GainTrait(trait);
         }
     }
     MSTraitChanger.TraitsUpdated(pawn);
     if (SendMsg)
     {
         Messages.Message("MSExotic.TraitAdded".Translate(pawn?.LabelShort.CapitalizeFirst(), trait?.Label.CapitalizeFirst(), doer.CapitalizeFirst()), pawn, MsgType, true);
     }
 }
예제 #17
0
        private static List <WorkTypeDef> GetRandomWorkTypes(Pawn_StoryTracker story)
        {
            List <WorkTypeDef> workTypes = new List <WorkTypeDef>();

            while (workTypes.Count == 0)
            {
                var typeDef = DefDatabase <WorkTypeDef> .GetRandom();

                // these are not allowed
                if (!story.WorkTypeIsDisabled(typeDef))
                {
                    workTypes.Add(typeDef);
                }
            }
            return(workTypes);
        }
예제 #18
0
        private Pawn getTanya()
        {
            PawnGenerationRequest request = new PawnGenerationRequest(DefDatabase <PawnKindDef> .GetNamed("ra2_AlliedTanya", true), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, true, 1f, false, true, true, false, false, false, false, null, null, null, null, null, Gender.Female, null, null);
            Pawn item = PawnGenerator.GeneratePawn(request);

            Pawn_StoryTracker ps   = item.story;
            HairDef           hair = DefDatabase <HairDef> .GetNamed("Curly");

            ps.childhood        = null;
            ps.adulthood        = null;
            ps.traits.allTraits = new List <Trait>();
            ps.traits.GainTrait(new Trait(DefDatabase <TraitDef> .GetNamed("ra2_MakeSoldier", true)));
            ps.traits.GainTrait(new Trait(TraitDefOf.Psychopath));
            Pawn_WorkSettings pws = item.workSettings;

            pws.DisableAll();

            NameTriple triple = NameTriple.FromString(item.kindDef.label);

            triple.ResolveMissingPieces("Adams".Translate());
            item.Name = triple;

            Pawn_SkillTracker skt = item.skills;

            foreach (SkillRecord sr in skt.skills)
            {
                sr.Level = 20;
            }

            item.inventory.DestroyAll();
            ps.bodyType  = BodyTypeDefOf.Female;
            ps.hairDef   = hair;
            ps.hairColor = new UnityEngine.Color(1, 0.8f, 0);

            //st.SkinColor = new UnityEngine.Color(0.98f,0.76f,0.71f);
            ps.melanin = 0f;


            Pawn_EquipmentTracker pe = item.equipment;

            pe.Remove(pe.Primary);
            pe.AddEquipment((ThingWithComps)ThingMaker.MakeThing(DefDatabase <ThingDef> .GetNamed("ra2_Gun_Tanya", true)));


            //item.story = st;
            return(item);
        }
        // Token: 0x06000056 RID: 86 RVA: 0x0000571C File Offset: 0x0000391C
        public static void DoMSImmunisation(Pawn p, ThingDef t)
        {
            bool           Sickly   = false;
            MessageTypeDef MsgType  = MessageTypeDefOf.PositiveEvent;
            TraitDef       Immunity = DefDatabase <TraitDef> .GetNamed("Immunity", true);

            if (p.story.traits.HasTrait(Immunity) && p != null)
            {
                Pawn_StoryTracker story = p.story;
                int?num;
                if (story == null)
                {
                    num = null;
                }
                else
                {
                    TraitSet traits = story.traits;
                    num = ((traits != null) ? new int?(traits.GetTrait(Immunity).Degree) : null);
                }
                int?num2 = num;
                int num3 = -1;
                if (num2.GetValueOrDefault() == num3 & num2 != null)
                {
                    Sickly = true;
                }
            }
            if (Sickly)
            {
                Pawn_StoryTracker story2 = p.story;
                Trait             trait;
                if (story2 == null)
                {
                    trait = null;
                }
                else
                {
                    TraitSet traits2 = story2.traits;
                    trait = (traits2?.GetTrait(Immunity));
                }
                Trait ToGo = trait;
                MSTraitChanger.RemoveTrait(p, ToGo, t.label, MsgType, true);
                return;
            }
            Trait ToAdd = new Trait(Immunity, 1, false);

            MSTraitChanger.AddTrait(p, ToAdd, t.label, MsgType, true);
        }
        // Token: 0x06000058 RID: 88 RVA: 0x000058E0 File Offset: 0x00003AE0
        public static void DoMSCerebrax(Pawn p, ThingDef t)
        {
            int            degree  = 0;
            MessageTypeDef MsgType = MessageTypeDefOf.PositiveEvent;
            TraitDef       Psych   = DefDatabase <TraitDef> .GetNamed("PsychicSensitivity", true);

            if (p.story.traits.HasTrait(Psych))
            {
                degree = p.story.traits.GetTrait(Psych).Degree;
            }
            if (degree == 2)
            {
                Pawn_StoryTracker story = p.story;
                Trait             trait;
                if (story == null)
                {
                    trait = null;
                }
                else
                {
                    TraitSet traits = story.traits;
                    trait = (traits?.GetTrait(Psych));
                }
                Trait ToGo = trait;
                MSTraitChanger.RemoveTrait(p, ToGo, t.label, MsgType, true);
                Trait ToAdd = new Trait(Psych, 1, false);
                MSTraitChanger.AddTrait(p, ToAdd, t.label, MsgType, false);
                return;
            }
            if (degree == 1)
            {
                Pawn_StoryTracker story2 = p.story;
                Trait             trait2;
                if (story2 == null)
                {
                    trait2 = null;
                }
                else
                {
                    TraitSet traits2 = story2.traits;
                    trait2 = (traits2?.GetTrait(Psych));
                }
                Trait ToGo2 = trait2;
                MSTraitChanger.RemoveTrait(p, ToGo2, t.label, MsgType, true);
            }
        }
예제 #21
0
        /// <summary>
        ///     Restores the alien Comp attached to the parent from the ones stored earlier
        ///     this does not resolve the graphics, that is the job of the caller
        /// </summary>
        public void RestoreGraphics()
        {
            Assert(_scanned, "_scanned");

            var comp = parent.GetComp <AlienPartGenerator.AlienComp>();

            comp.SetSkinColor(SkinColor, SkinColorSecond);
            comp.customDrawSize         = CustomDrawSize;
            comp.customPortraitDrawSize = CustomPortraitDrawSize;
            comp.fixGenderPostSpawn     = FixGenderPostSpawn;
            comp.SetHairColor(HairColor, HairColorSecond);
            comp.crownType = CrownType;

            Pawn_StoryTracker story = ((Pawn)parent).story;

            story.hairColor = HairColor;
            story.hairDef   = HairDef;
            story.bodyType  = BodyType;
        }
예제 #22
0
        public static void ChangeBodyType(Pawn pawn, BodyTypeDef bt)
        {
            var storyTrv    = Traverse.Create(pawn.story);
            var newStory    = new Pawn_StoryTracker(pawn);
            var newStoryTrv = Traverse.Create(newStory);

            AccessTools.GetFieldNames(typeof(Pawn_StoryTracker))
            .ForEach(f => newStoryTrv.Field(f).SetValue(storyTrv.Field(f).GetValue()));
            newStory.bodyType = bt;
            pawn.story        = newStory;
            IntVec3      pos      = pawn.Position;
            Map          map      = pawn.Map;
            Building_Bed bed      = null;
            Rot4         rot      = pawn.Rotation;
            bool         spawned  = pawn.Map != null;
            bool         selected = Find.Selector.SelectedPawns.Contains(pawn);
            bool         drafted  = pawn.Drafted;
            bool         inBed    = pawn.InBed();

            pawn.Drawer.renderer.graphics.ResolveAllGraphics();
            if (spawned)
            {
                pawn.DeSpawn();
                GenSpawn.Spawn(pawn, pos, map);
                pawn.Rotation = rot;
            }
            if (drafted)
            {
                pawn.drafter.Drafted = true;
            }
            if (selected)
            {
                Find.Selector.SelectedObjects.Add(pawn);
            }
            if (inBed)
            {
                if (bed != null)
                {
                    pawn.jobs.Notify_TuckedIntoBed(bed);
                    pawn.mindState.Notify_TuckedIntoBed();
                }
            }
        }
        public static bool Prefix(Pawn_StoryTracker __instance, ref Color __result)
        {
            Pawn          pawn    = (Pawn)typeof(Pawn_StoryTracker).GetField("pawn", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
            CompTFTracker tracker = pawn.GetComp <CompTFTracker>();

            Color skinColor = tracker?.LoadData <Color>(null, "skinColor") ?? Color.clear;

            if (skinColor.NullOrClear())
            {
                // Allow the original method.
                return(true);
            }
            else
            {
                __result = skinColor;
                // Don't allow original to execute.
                return(false);
            }
        }
예제 #24
0
        public static Thing MakeGenomeSequence(Pawn pawn, ThingDef genomeDef)
        {
            Thing          genomeThing    = ThingMaker.MakeThing(genomeDef);
            GenomeSequence genomeSequence = genomeThing as GenomeSequence;

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

                genomeSequence.pawnName = pawn.Name as NameTriple;

                if (genomeSequence.sourceName == null)
                {
                    genomeSequence.sourceName = pawn.def.LabelCap;
                }
                genomeSequence.pawnKindDef = pawn.kindDef;
                genomeSequence.gender      = pawn.gender;

                //Humanoid only.
                Pawn_StoryTracker story = pawn.story;
                if (story != null)
                {
                    genomeSequence.bodyType    = story.bodyType;
                    genomeSequence.crownType   = story.crownType;
                    genomeSequence.hairColor   = story.hairColor;
                    genomeSequence.skinMelanin = story.melanin;

                    foreach (Trait trait in story.traits.allTraits)
                    {
                        genomeSequence.traits.Add(new ExposedTraitEntry(trait));
                    }
                }

                //Alien Races compatibility.
                if (CompatibilityTracker.AlienRacesActive)
                {
                    AlienRaceCompat.GetFieldsFromAlienComp(pawn, genomeSequence);
                }
            }

            return(genomeThing);
        }
예제 #25
0
 public override void SpawnSetup(Map map, bool respawningAfterLoad)
 {
     base.SpawnSetup(map, respawningAfterLoad);
     skills = new Pawn_SkillTracker(this);
     foreach (SkillRecord record in skills.skills)
     {
         record.levelInt = 20;
         record.passion  = Passion.None;
     }
     story = new Pawn_StoryTracker(this)
     {
         bodyType  = BodyTypeDefOf.Thin,
         crownType = CrownType.Average,
         childhood = DroneBackstories.childhood,
         adulthood = DroneBackstories.adulthood
     };
     drafter   = new Pawn_DraftController(this);
     relations = new Pawn_RelationsTracker(this);
     Name      = new NameSingle("PRFDroneName".Translate());
 }
 public override void SpawnSetup(Map map, bool respawningAfterLoad)
 {
     base.SpawnSetup(map, respawningAfterLoad);
     skills = new Pawn_SkillTracker(this);
     foreach (SkillRecord record in skills.skills)
     {
         record.levelInt = station.ConstructSkillLevel();
         record.passion  = Passion.None;
     }
     story = new Pawn_StoryTracker(this)
     {
         bodyType  = BodyTypeDefOf.Thin,
         crownType = CrownType.Average,
         childhood = ConstructBackstories.childhood,
         adulthood = ConstructBackstories.adulthood
     };
     drafter   = new Pawn_DraftController(this);
     relations = new Pawn_RelationsTracker(this);
     Name      = new NameSingle(ConstructDefOf.CanoptekScarab.label);
 }
        // Token: 0x06000059 RID: 89 RVA: 0x000059B0 File Offset: 0x00003BB0
        public static void ChkMSCerebrax(Pawn p, out string Reason, out bool Passed)
        {
            Reason = null;
            if (!p.RaceProps.Humanlike)
            {
                Passed = false;
                Reason = "MSExotic.NotHumanLike".Translate(p?.LabelShort.CapitalizeFirst());
                return;
            }
            TraitDef Psych = DefDatabase <TraitDef> .GetNamed("PsychicSensitivity", true);

            if (p.story.traits.HasTrait(Psych))
            {
                if (p != null)
                {
                    Pawn_StoryTracker story = p.story;
                    int?num;
                    if (story == null)
                    {
                        num = null;
                    }
                    else
                    {
                        TraitSet traits = story.traits;
                        num = ((traits != null) ? new int?(traits.GetTrait(Psych).Degree) : null);
                    }
                    int?num2 = num;
                    int num3 = 0;
                    if (num2.GetValueOrDefault() <= num3 & num2 != null)
                    {
                        Passed = false;
                        Reason = "MSExotic.HasNoPsychSensitivity".Translate(p?.LabelShort.CapitalizeFirst());
                        return;
                    }
                }
                Passed = true;
                return;
            }
            Passed = false;
            Reason = "MSExotic.HasNoPsychSensitivity".Translate(p?.LabelShort.CapitalizeFirst());
        }
예제 #28
0
        private static Pawn getTanya(IncidentParms parms)
        {
            PawnGenerationRequest request = new PawnGenerationRequest(DefDatabase <PawnKindDef> .GetNamed("ra2_AlliedTanya", true), parms.faction, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, true, 1f, false, true, true, false, false, false, false, null, null, null, null, null, Gender.Female, null, null);
            Pawn item = PawnGenerator.GeneratePawn(request);

            Pawn_StoryTracker st   = item.story;
            HairDef           hair = DefDatabase <HairDef> .GetNamed("Curly");

            Dictionary <String, Backstory> bsdb = BackstoryDatabase.allBackstories;
            Backstory child = bsdb.TryGetValue("YouthSoldier99");
            Backstory old   = bsdb.TryGetValue("VeteranSoldier2");

            st.adulthood = old;
            st.childhood = child;

            NameTriple triple = NameTriple.FromString(item.kindDef.label);

            triple.ResolveMissingPieces("Adams".Translate());
            item.Name = triple;

            Pawn_SkillTracker skt = item.skills;

            foreach (SkillRecord sr in skt.skills)
            {
                sr.Level = 20;
            }


            st.bodyType  = BodyTypeDefOf.Female;
            st.hairDef   = hair;
            st.hairColor = new UnityEngine.Color(1, 0.8f, 0);

            //st.SkinColor = new UnityEngine.Color(0.98f,0.76f,0.71f);
            st.melanin = 0f;



            //item.story = st;
            return(item);
        }
예제 #29
0
        static bool Prefix(Pawn_StoryTracker __instance, ref List <WorkTypeDef> __result)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (pawn.RaceProps.IsMechanoid && pawn.IsHacked())
            {
                List <WorkTypeDef>  shouldForbid = new List <WorkTypeDef>();
                ExtendedDataStorage store        = Base.Instance.GetExtendedDataStorage();
                if (store != null)
                {
                    ExtendedPawnData pawnData = Base.Instance.GetExtendedDataStorage().GetExtendedDataFor(pawn);
                    foreach (WorkTypeDef def in DefDatabase <WorkTypeDef> .AllDefs)
                    {
                        if (pawnData.workTypes == null || !pawnData.workTypes.Contains(def))
                        {
                            shouldForbid.Add(def);
                        }
                    }
                    __result = shouldForbid;
                    return(false);
                }
            }
            return(true);
        }
예제 #30
0
        public static void Post_GeneratePawn(PawnGenerationRequest request, ref Pawn __result)
        {
            if (__result != null && __result.isOrkoid())
            {
                if (__result.story == null)
                {
                    if (__result.isSquig() && request.Context == PawnGenerationContext.PlayerStarter)
                    {
                        if (__result.ageTracker.AgeBiologicalYearsFloat > 5f)
                        {
                            Rand.PushState();
                            __result.ageTracker.AgeBiologicalTicks = ((float)Rand.RangeInclusive(1, 5) * 3600000).SecondsToTicks();
                            Rand.PopState();
                        }
                    }
                    return;
                }
                Pawn_StoryTracker storyTracker = __result.story;
                Backstory         adulthood    = storyTracker.adulthood;
                bool adult = adulthood != null;
                if (__result.isOrk())
                {
                    if (storyTracker.childhood.identifier.Contains("Ork_Base_Child"))
                    {
                        //    Log.Message(__result.Name + ": Ork_Base_Child");
                    }
                    else
                    if (storyTracker.childhood.identifier.Contains("Ork_Odd_Child"))
                    {
                        //    Log.Message(__result.Name + ": Ork_Odd_Child");
                    }
                    else
                    if (storyTracker.childhood.identifier.Contains("Ork_Weird_Child"))
                    {
                        //    Log.Message(__result.Name + ": Ork_Weird_Child");
                        if (!storyTracker.traits.HasTrait(TraitDefOf.PsychicSensitivity))
                        {
                            Trait trait = new Trait(TraitDefOf.PsychicSensitivity, 1);
                            if (storyTracker.adulthood != null)
                            {
                                if (storyTracker.adulthood.identifier.Contains("_Boss"))
                                {
                                    trait = new Trait(TraitDefOf.PsychicSensitivity, 2);
                                }
                                else if (storyTracker.adulthood.identifier.Contains("_Nob"))
                                {
                                    Rand.PushState();
                                    trait = new Trait(TraitDefOf.PsychicSensitivity, Rand.RangeInclusive(1, 2));
                                    Rand.PopState();
                                }
                            }
                            __result.story.traits.GainTrait(trait);
                        }
                        if (AdeptusIntergrationUtility.enabled_Royalty)
                        {
                            if (!__result.health.hediffSet.HasHediff(HediffDefOf.PsychicAmplifier))
                            {
                                Hediff_Psylink _Psylink = HediffMaker.MakeHediff(HediffDefOf.PsychicAmplifier, __result, __result.RaceProps.body.AllParts.FirstOrDefault(x => x.def == BodyPartDefOf.Brain)) as Hediff_Psylink;
                                _Psylink.suppressPostAddLetter = true;
                                __result.health.AddHediff(_Psylink);
                            }
                            if (adult)
                            {
                                if (storyTracker.adulthood.identifier.Contains("_Boss"))
                                {
                                    Rand.PushState();
                                    __result.ChangePsylinkLevel(Math.Min(Rand.RangeInclusive(3, 5), __result.GetMaxPsylinkLevel()), false);
                                    Rand.PopState();
                                }
                                else if (storyTracker.adulthood.identifier.Contains("_Nob"))
                                {
                                    Rand.PushState();
                                    __result.ChangePsylinkLevel(Math.Min(Rand.RangeInclusive(1, 3), __result.GetMaxPsylinkLevel()), false);
                                    Rand.PopState();
                                }
                                else if (adult)
                                {
                                    Rand.PushState();
                                    __result.ChangePsylinkLevel(Math.Min(Rand.RangeInclusive(0, 2), __result.GetMaxPsylinkLevel()), false);
                                    Rand.PopState();
                                }
                            }
                        }
                    }
                }
                if (__result.isGrot())
                {
                }

                /*
                 * if (adult)
                 * {
                 *  if (__result.isOrk())
                 *  {
                 *      if (storyTracker.adulthood.identifier.Contains("_Boss") || storyTracker.adulthood.identifier.Contains("_Nob"))
                 *      {
                 *          HarmonyPatches.ChangeBodyType(__result, BodyTypeDefOf.Hulk);
                 *      }
                 *      else
                 *      {
                 *          HarmonyPatches.ChangeBodyType(__result, BodyTypeDefOf.Male);
                 *      }
                 *  }
                 * }
                 */
            }
        }