コード例 #1
0
        public void OverwritePawn(Pawn pawn)
        {
            var extension = this.def.GetModExtension <StackSavingOptionsModExtension>();

            if (pawn.Faction != this.faction)
            {
                pawn.SetFaction(this.faction);
            }
            if (this.isFactionLeader)
            {
                pawn.Faction.leader = pawn;
            }

            pawn.Name = this.name;
            if (pawn.needs?.mood?.thoughts?.memories?.Memories != null)
            {
                for (int num = pawn.needs.mood.thoughts.memories.Memories.Count - 1; num >= 0; num--)
                {
                    pawn.needs.mood.thoughts.memories.RemoveMemory(pawn.needs.mood.thoughts.memories.Memories[num]);
                }
            }

            if (this.thoughts != null)
            {
                if (this.gender == pawn.gender)
                {
                    this.thoughts.RemoveAll(x => x.def == AlteredCarbonDefOf.AC_WrongGender);
                    this.thoughts.RemoveAll(x => x.def == AlteredCarbonDefOf.AC_WrongGenderDouble);
                }
                if (this.race == pawn.kindDef.race)
                {
                    this.thoughts.RemoveAll(x => x.def == AlteredCarbonDefOf.AC_WrongRace);
                }

                foreach (var thought in this.thoughts)
                {
                    if (thought is Thought_MemorySocial && thought.otherPawn == null)
                    {
                        continue;
                    }
                    pawn.needs.mood.thoughts.memories.TryGainMemory(thought, thought.otherPawn);
                }
            }
            pawn.story.traits.allTraits.RemoveAll(x => !extension.ignoresTraits.Contains(x.def.defName));
            if (this.traits != null)
            {
                foreach (var trait in this.traits)
                {
                    if (extension.ignoresTraits != null && extension.ignoresTraits.Contains(trait.def.defName))
                    {
                        continue;
                    }
                    pawn.story.traits.GainTrait(trait);
                }
            }

            pawn.relations.ClearAllRelations();

            var origPawn = GetOriginalPawn(pawn);

            foreach (var otherPawn in this.relatedPawns)
            {
                if (otherPawn != null)
                {
                    foreach (var rel in otherPawn.relations.DirectRelations)
                    {
                        if (this.name == rel.otherPawn?.Name)
                        {
                            rel.otherPawn = pawn;
                        }
                    }
                }
            }

            foreach (var otherPawn in this.relatedPawns)
            {
                if (otherPawn != null)
                {
                    foreach (var rel in this.relations)
                    {
                        foreach (var rel2 in otherPawn.relations.DirectRelations)
                        {
                            if (rel.def == rel2.def && rel2.otherPawn?.Name == pawn.Name)
                            {
                                rel2.otherPawn = pawn;
                            }
                        }
                    }
                }
            }

            foreach (var rel in this.relations)
            {
                if (rel.otherPawn != null)
                {
                    var oldRelation = rel.otherPawn.relations.DirectRelations.Where(r => r.def == rel.def && r.otherPawn.Name == pawn.Name).FirstOrDefault();
                    if (oldRelation != null)
                    {
                        oldRelation.otherPawn = pawn;
                    }
                }
                pawn.relations.AddDirectRelation(rel.def, rel.otherPawn);
            }

            if (origPawn != null)
            {
                origPawn.relations = new Pawn_RelationsTracker(origPawn);
            }

            pawn.skills.skills.Clear();
            if (this.skills != null)
            {
                foreach (var skill in this.skills)
                {
                    var newSkill = new SkillRecord(pawn, skill.def);
                    newSkill.passion          = skill.passion;
                    newSkill.levelInt         = skill.levelInt;
                    newSkill.xpSinceLastLevel = skill.xpSinceLastLevel;
                    newSkill.xpSinceMidnight  = skill.xpSinceMidnight;
                    pawn.skills.skills.Add(newSkill);
                }
            }
            if (pawn.playerSettings == null)
            {
                pawn.playerSettings = new Pawn_PlayerSettings(pawn);
            }
            pawn.playerSettings.hostilityResponse = (HostilityResponseMode)this.hostilityMode;

            Backstory newChildhood = null;

            BackstoryDatabase.TryGetWithIdentifier(this.childhood, out newChildhood, true);
            pawn.story.childhood = newChildhood;
            if (this.adulthood?.Length > 0)
            {
                Backstory newAdulthood = null;
                BackstoryDatabase.TryGetWithIdentifier(this.adulthood, out newAdulthood, true);
                pawn.story.adulthood = newAdulthood;
            }
            else
            {
                pawn.story.adulthood = null;
            }
            if (pawn.workSettings == null)
            {
                pawn.workSettings = new Pawn_WorkSettings();
            }
            pawn.Notify_DisabledWorkTypesChanged();
            if (priorities != null)
            {
                foreach (var priority in priorities)
                {
                    pawn.workSettings.SetPriority(priority.Key, priority.Value);
                }
            }
            pawn.playerSettings.AreaRestriction = this.areaRestriction;
            pawn.playerSettings.medCare         = this.medicalCareCategory;
            pawn.playerSettings.selfTend        = this.selfTend;
            if (pawn.foodRestriction == null)
            {
                pawn.foodRestriction = new Pawn_FoodRestrictionTracker();
            }
            pawn.foodRestriction.CurrentFoodRestriction = this.foodRestriction;
            if (pawn.outfits == null)
            {
                pawn.outfits = new Pawn_OutfitTracker();
            }
            pawn.outfits.CurrentOutfit = this.outfit;
            if (pawn.drugs == null)
            {
                pawn.drugs = new Pawn_DrugPolicyTracker();
            }
            pawn.drugs.CurrentPolicy = this.drugPolicy;
            pawn.ageTracker.AgeChronologicalTicks = this.ageChronologicalTicks;
            if (pawn.timetable == null)
            {
                pawn.timetable = new Pawn_TimetableTracker(pawn);
            }
            if (this.times != null)
            {
                pawn.timetable.times = this.times;
            }
            if (pawn.gender != this.gender)
            {
                if (pawn.story.traits.HasTrait(TraitDefOf.BodyPurist))
                {
                    pawn.needs.mood.thoughts.memories.TryGainMemory(AlteredCarbonDefOf.AC_WrongGenderDouble);
                }
                else
                {
                    pawn.needs.mood.thoughts.memories.TryGainMemory(AlteredCarbonDefOf.AC_WrongGender);
                }
            }

            if (pawn.kindDef.race != this.race)
            {
                pawn.needs.mood.thoughts.memories.TryGainMemory(AlteredCarbonDefOf.AC_WrongRace);
            }
            if (ModLister.RoyaltyInstalled)
            {
                if (pawn.royalty == null)
                {
                    pawn.royalty = new Pawn_RoyaltyTracker(pawn);
                }
                if (this.royalTitles != null)
                {
                    foreach (var title in this.royalTitles)
                    {
                        pawn.royalty.SetTitle(title.faction, title.def, false, false, false);
                    }
                }
                if (this.heirs != null)
                {
                    foreach (var heir in this.heirs)
                    {
                        pawn.royalty.SetHeir(heir.Value, heir.Key);
                    }
                }

                if (this.favor != null)
                {
                    foreach (var fav in this.favor)
                    {
                        pawn.royalty.SetFavor(fav.Key, fav.Value);
                    }
                }

                if (this.bondedThings != null)
                {
                    foreach (var bonded in this.bondedThings)
                    {
                        var comp = bonded.TryGetComp <CompBladelinkWeapon>();
                        if (comp != null)
                        {
                            comp.bondedPawn = pawn;
                        }
                    }
                }
                if (this.factionPermits != null)
                {
                    Traverse.Create(pawn.royalty).Field("factionPermits").SetValue(this.factionPermits);
                }
                if (this.permitPoints != null)
                {
                    Traverse.Create(pawn.royalty).Field("permitPoints").SetValue(this.permitPoints);
                }
            }
            if (ModCompatibility.IndividualityIsActive)
            {
                ModCompatibility.SetSyrTraitsSexuality(pawn, this.sexuality);
                ModCompatibility.SetSyrTraitsRomanceFactor(pawn, this.romanceFactor);
            }

            if (ModCompatibility.PsychologyIsActive)
            {
                ModCompatibility.SetPsychologyData(pawn, this.psychologyData);
            }
        }
コード例 #2
0
        public void SavePawnToCorticalStack(Pawn pawn)
        {
            this.name     = pawn.Name;
            this.origPawn = pawn;
            if (pawn.playerSettings != null)
            {
                this.hostilityMode       = (int)pawn.playerSettings.hostilityResponse;
                this.areaRestriction     = pawn.playerSettings.AreaRestriction;
                this.medicalCareCategory = pawn.playerSettings.medCare;
                this.selfTend            = pawn.playerSettings.selfTend;
            }
            if (pawn.ageTracker != null)
            {
                this.ageChronologicalTicks = pawn.ageTracker.AgeChronologicalTicks;
            }
            this.foodRestriction = pawn.foodRestriction?.CurrentFoodRestriction;
            this.outfit          = pawn.outfits?.CurrentOutfit;
            this.drugPolicy      = pawn.drugs?.CurrentPolicy;
            this.times           = pawn.timetable?.times;
            this.thoughts        = pawn.needs?.mood?.thoughts?.memories?.Memories;
            this.faction         = pawn.Faction;
            if (pawn.Faction.leader == pawn)
            {
                this.isFactionLeader = true;
            }
            this.traits       = pawn.story?.traits?.allTraits;
            this.relations    = pawn.relations?.DirectRelations;
            this.relatedPawns = pawn.relations?.RelatedPawns?.ToHashSet();
            foreach (var otherPawn in pawn.relations.RelatedPawns)
            {
                foreach (var rel2 in pawn.GetRelations(otherPawn))
                {
                    if (this.relations.Where(r => r.def == rel2 && r.otherPawn == otherPawn).Count() == 0)
                    {
                        //Log.Message("00000 Rel: " + otherPawn?.Name + " - " + rel2 + " - " + pawn.Name, true);
                        if (!rel2.implied)
                        {
                            this.relations.Add(new DirectPawnRelation(rel2, otherPawn, 0));
                        }
                    }
                }
                relatedPawns.Add(otherPawn);
            }
            this.skills    = pawn.skills?.skills;
            this.childhood = pawn.story?.childhood?.identifier;
            if (pawn.story?.adulthood != null)
            {
                this.adulthood = pawn.story.adulthood.identifier;
            }
            this.priorities = new Dictionary <WorkTypeDef, int>();
            if (pawn.workSettings != null && Traverse.Create(pawn.workSettings).Field("priorities").GetValue <DefMap <WorkTypeDef, int> >() != null)
            {
                foreach (WorkTypeDef w in DefDatabase <WorkTypeDef> .AllDefs)
                {
                    this.priorities[w] = pawn.workSettings.GetPriority(w);
                }
            }
            this.hasPawn = true;
            this.pawnID  = pawn.ThingID;
            if (ModLister.RoyaltyInstalled && pawn.royalty != null)
            {
                this.royalTitles = pawn.royalty?.AllTitlesForReading;
                this.favor       = Traverse.Create(pawn.royalty).Field("favor").GetValue <Dictionary <Faction, int> >();
                this.heirs       = Traverse.Create(pawn.royalty).Field("heirs").GetValue <Dictionary <Faction, Pawn> >();
                foreach (var map in Find.Maps)
                {
                    foreach (var thing in map.listerThings.AllThings)
                    {
                        var comp = thing.TryGetComp <CompBladelinkWeapon>();
                        if (comp != null && comp.bondedPawn == pawn)
                        {
                            this.bondedThings.Add(thing);
                        }
                    }
                    foreach (var gear in pawn.apparel?.WornApparel)
                    {
                        var comp = gear.TryGetComp <CompBladelinkWeapon>();
                        if (comp != null && comp.bondedPawn == pawn)
                        {
                            this.bondedThings.Add(gear);
                        }
                    }
                    foreach (var gear in pawn.equipment?.AllEquipmentListForReading)
                    {
                        var comp = gear.TryGetComp <CompBladelinkWeapon>();
                        if (comp != null && comp.bondedPawn == pawn)
                        {
                            this.bondedThings.Add(gear);
                        }
                    }
                    foreach (var gear in pawn.inventory?.innerContainer)
                    {
                        var comp = gear.TryGetComp <CompBladelinkWeapon>();
                        if (comp != null && comp.bondedPawn == pawn)
                        {
                            this.bondedThings.Add(gear);
                        }
                    }
                }
                this.factionPermits = Traverse.Create(pawn.royalty).Field("factionPermits").GetValue <List <FactionPermit> >();
                this.permitPoints   = Traverse.Create(pawn.royalty).Field("permitPoints").GetValue <Dictionary <Faction, int> >();
            }

            if (ModCompatibility.IndividualityIsActive)
            {
                this.sexuality     = ModCompatibility.GetSyrTraitsSexuality(pawn);
                this.romanceFactor = ModCompatibility.GetSyrTraitsRomanceFactor(pawn);
            }
            if (ModCompatibility.PsychologyIsActive)
            {
                this.psychologyData = ModCompatibility.GetPsychologyData(pawn);
            }
        }