static void Prefix(Pawn_WorkSettings __instance)
        {
            //clean favourite in case of pawn reccurect to avoid overriding
            var pawn = __instance.Pawn();

            FavouriteManager.Get[pawn] = null;
        }
Exemple #2
0
 public static void Postfix(Pawn_WorkSettings __instance, Pawn ___pawn, DefMap <WorkTypeDef, int> ___priorities)
 {
     if (___priorities != null)
     {
         __instance.SetPriority(BeatPrisonersDefOf.CM_Beat_Prisoners_WorkType_Break_Resistance, 0);
     }
 }
        static void Prefix(Pawn_WorkSettings __instance, WorkTypeDef w, ref int priority)
        {
            __instance.Pawn().SetPriority(w, priority, null);

            // TODO: find a more elegant way to stop RW complaining about bad priorities.
            priority = Mathf.Min(priority, 4);
        }
 static void InitializeForFormerHumans([NotNull] Pawn_WorkSettings __instance, [NotNull] Pawn ___pawn)
 {
     if (___pawn.IsFormerHuman() && ___pawn.workSettings != null)
     {
         FormerHumanUtilities.InitializeWorkSettingsFor(___pawn, __instance);
     }
 }
Exemple #5
0
 static void InitializeForFormerHumans([NotNull] Pawn_WorkSettings __instance, [NotNull] Pawn ___pawn)
 {
     if (___pawn.IsSapientOrFeralFormerHuman())
     {
         FormerHumanUtilities.InitializeWorkSettingsFor(___pawn, __instance);
     }
 }
Exemple #6
0
 private static void SetPriority(Pawn_WorkSettings workSettings, WorkTypeDef workTypeDef, int priority)
 {
     if (pfi == null)
     {
         pfi = typeof(Pawn_WorkSettings).GetField("priorities", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     ((DefMap <WorkTypeDef, int>)pfi.GetValue(workSettings))[workTypeDef] = priority;
 }
 public static void                  WorkGiversDirtySet(this Pawn_WorkSettings p, bool value)
 {
     if (_workGiversDirty == null)
     {
         _workGiversDirty = typeof(Pawn_WorkSettings).GetField("workGiversDirty", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     _workGiversDirty.SetValue(p, value);
 }
 public static bool                  WorkGiversDirtyGet(this Pawn_WorkSettings p)
 {
     if (_workGiversDirty == null)
     {
         _workGiversDirty = typeof(Pawn_WorkSettings).GetField("workGiversDirty", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     return((bool)_workGiversDirty.GetValue(p));
 }
 public static Pawn                  Pawn(this Pawn_WorkSettings p)
 {
     if (_pawn == null)
     {
         _pawn = typeof(Pawn_WorkSettings).GetField("pawn", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     return((Pawn)_pawn.GetValue(p));
 }
 public static DefMap <WorkTypeDef, int> Priorities(this Pawn_WorkSettings p)
 {
     if (_priorities == null)
     {
         _priorities = typeof(Pawn_WorkSettings).GetField("priorities", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     return((DefMap <WorkTypeDef, int>)_priorities.GetValue(p));
 }
 public static void                  ConfirmInitializedDebug(this Pawn_WorkSettings p)
 {
     if (_ConfirmInitializedDebug == null)
     {
         _ConfirmInitializedDebug = typeof(Pawn_WorkSettings).GetMethod("ConfirmInitializedDebug", BindingFlags.Instance | BindingFlags.NonPublic);
     }
     _ConfirmInitializedDebug.Invoke(p, null);
 }
 public static void Postfix(Pawn_WorkSettings __instance, ref int __result, Pawn ___pawn)
 {
     if (___pawn.kindDef == MeeseeksDefOf.MeeseeksKind)
     {
         __result = Pawn_WorkSettings.DefaultPriority;
         //Logger.MessageFormat(__instance, "Forcing default work priority of: {0}", __result);
     }
 }
Exemple #13
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;
        }
Exemple #14
0
        static void Postfix(Pawn_WorkSettings __instance, object __state, WorkTypeDef w)
        {
            if (__state != null)
            {
                DefMap <WorkTypeDef, int> pawnPriorities = AccessTools.Field(typeof(Pawn_WorkSettings), "priorities").GetValue(__instance) as DefMap <WorkTypeDef, int>;

                pawnPriorities[w] = (int)__state;
            }
        }
Exemple #15
0
 private static void CheckForDisabledTypes(Pawn_WorkSettings _this, Pawn pawn)
 {
     foreach (var workTypeDef in WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder)
     {
         if (pawn.story.WorkTypeIsDisabled(workTypeDef))
         {
             _this.Disable(workTypeDef);
         }
     }
 }
        public static bool CacheWorkGiversInOrder(Pawn_WorkSettings __instance)
        {
            //Pawn_WorkSettings.wtsByPrio.Clear();
            List <WorkTypeDef> wtsByPrio          = new List <WorkTypeDef>(); //ADD
            List <WorkTypeDef> defsListForReading = DefDatabase <WorkTypeDef> .AllDefsListForReading;
            int num1 = 999;

            for (int index = 0; index < defsListForReading.Count; ++index)
            {
                WorkTypeDef w        = defsListForReading[index];
                int         priority = __instance.GetPriority(w);
                if (priority > 0)
                {
                    if (priority < num1 && w.workGiversByPriority.Any(wg => !wg.emergency))
                    {
                        num1 = priority;
                    }
                    wtsByPrio.Add(w); //FIND REPLACE
                }
            }
            //FIND REPLACE
            wtsByPrio.InsertionSort((a, b) =>
            {
                float num2 = a.naturalPriority + (4 - __instance.GetPriority(a)) * 100000;
                return(((float)(b.naturalPriority + (4 - __instance.GetPriority(b)) * 100000)).CompareTo(num2));
            });
            WorkGiverListClear(workGiversInOrderEmerg(__instance));
            for (int index1 = 0; index1 < wtsByPrio.Count; ++index1) //FIND REPLACE
            {
                WorkTypeDef workTypeDef = wtsByPrio[index1];         ////FIND REPLACE
                for (int index2 = 0; index2 < workTypeDef.workGiversByPriority.Count; ++index2)
                {
                    WorkGiver worker = workTypeDef.workGiversByPriority[index2].Worker;
                    if (worker.def.emergency && __instance.GetPriority(worker.def.workType) <= num1)
                    {
                        WorkGiverListAdd(workGiversInOrderEmerg(__instance), worker);
                    }
                }
            }
            WorkGiverListClear(workGiversInOrderNormal(__instance));
            for (int index1 = 0; index1 < wtsByPrio.Count; ++index1) //FIND REPLACE
            {
                WorkTypeDef workTypeDef = wtsByPrio[index1];         //FIND REPLACE
                for (int index2 = 0; index2 < workTypeDef.workGiversByPriority.Count; ++index2)
                {
                    WorkGiver worker = workTypeDef.workGiversByPriority[index2].Worker;
                    if (!worker.def.emergency || __instance.GetPriority(worker.def.workType) > num1)
                    {
                        WorkGiverListAdd(workGiversInOrderNormal(__instance), worker);
                    }
                }
            }
            workGiversDirty(__instance) = false;
            return(false);
        }
Exemple #17
0
    private static void UpdatePriorities(Pawn_WorkSettings __instance)
    {
        var fieldInfo =
            typeof(Pawn_WorkSettings).GetField("pawn", BindingFlags.NonPublic | BindingFlags.Instance);
        var pawn = (Pawn)fieldInfo?.GetValue(__instance);

        if (pawn != null)
        {
            pawn.GetSaveablePawn().ForceStatUpdate = true;
        }
    }
        //TODO Finding a good way to Cache pawn.workSettings may increase performence
        public override Job TryGiveJob()
        {
            Job result = null;

            if (!(cachedSleepTimeList.Contains(GenLocalDate.HourOfDay(this).ToString())))
            {
                //Only plausibel enhancment would be to cache the pawn
                //MakeDrone Average time of 1ms
                Pawn pawn = MakeDrone();

                //Spawn is cheap
                GenSpawn.Spawn(pawn, Position, Map);

                if (workSettings == null)
                {
                    //This case takes an Average of 3.31ms
                    pawn.workSettings = new Pawn_WorkSettings(pawn);
                    pawn.workSettings.EnableAndInitialize();
                    pawn.workSettings.DisableAll();
                    workSettings = pawn.workSettings;
                }
                else
                {
                    pawn.workSettings = workSettings;
                }

                //This loop is cheap
                //Set the workSettings based upon the settings
                foreach (WorkTypeDef def in WorkSettings.Keys)
                {
                    if (WorkSettings[def])
                    {
                        pawn.workSettings.SetPriority(def, 3);
                    }
                    else
                    {
                        pawn.workSettings.SetPriority(def, 0);
                    }
                }

                //Each call to TryIssueJobPackageDrone takes an Average of 1ms
                result = TryIssueJobPackageDrone(pawn, true).Job;
                if (result == null)
                {
                    result = TryIssueJobPackageDrone(pawn, false).Job;
                }

                pawn.Destroy();
                Notify_DroneGained();
            }
            return(result);
        }
Exemple #19
0
        public static Pawn Pawn(this Pawn_WorkSettings worksettings)
        {
            if (pawnFieldInfo == null)
            {
                pawnFieldInfo = typeof(Pawn_WorkSettings).GetField("pawn", AccessTools.all);
                if (pawnFieldInfo == null)
                {
                    throw new NullReferenceException("could not get pawn field");
                }
            }

            return(pawnFieldInfo.GetValue(worksettings) as Pawn);
        }
Exemple #20
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);
        }
Exemple #21
0
            public static void Postfix(Pawn_WorkSettings __instance)
            {
                var fieldPriorities = Traverse.Create(__instance).Field("priorities");
                var pawn            = Traverse.Create(__instance).Field("pawn").GetValue();
                var priorities      = (DefMap <WorkTypeDef, int>)fieldPriorities.GetValue();

                // Added: Make checks?
                if (Scribe.mode == LoadSaveMode.PostLoadInit && priorities != null)
                {
                    CheckForRemovedOrAdded(ref priorities, fieldPriorities);

                    CheckForDisabledTypes(__instance, (Pawn)pawn);
                }

                // Apply
                fieldPriorities.SetValue(priorities);
            }
        public static bool Prefix(Pawn_WorkSettings __instance)
        {
            var pawn          = pawnField.GetValue(__instance) as Pawn;
            var allWorkgivers = DefDatabase <WorkGiverDef> .AllDefsListForReading
                                .Select(wgd => wgd.Worker)
                                .Where(wg => pawn.GetPriority(wg.def, -1) > 0);

            var normalWorkgivers    = new List <WorkGiver>();
            var emergencyWorkgivers = new List <WorkGiver>();

            // sort by player set workgiver priorities => worktype order => workgiver order
            if (allWorkgivers.Any())
            {
                allWorkgivers = allWorkgivers
                                .OrderBy(wg => pawn.GetPriority(wg.def, -1))
                                .ThenByDescending(wg => wg.def.workType.naturalPriority)
                                .ThenByDescending(wg => wg.def.priorityInType).ToList();

                // lowest priority non-emergency job
                int maxEmergPrio = allWorkgivers
                                   .Where(wg => !wg.def.emergency)
                                   .Min(wg => pawn.GetPriority(wg.def, -1));

                // create lists of workgivers
                normalWorkgivers = allWorkgivers
                                   .Where(wg => !wg.def.emergency || pawn.GetPriority(wg.def, -1) > maxEmergPrio)
                                   .ToList();
                emergencyWorkgivers = allWorkgivers
                                      .Where(wg => wg.def.emergency && pawn.GetPriority(wg.def, -1) <= maxEmergPrio)
                                      .ToList();
            }

            Logger.Debug($"Updating priorities for {pawn.LabelShort};\n\t" +
                         $"{string.Join("\n\t", emergencyWorkgivers.Select(wg => wg.def.label).ToArray())}" +
                         $"{string.Join("\n\t", normalWorkgivers.Select(wg => wg.def.label).ToArray())}");

            // update cached lists of workgivers
            workgiversNormalField.SetValue(__instance, normalWorkgivers);
            workgiversEmergencyField.SetValue(__instance, emergencyWorkgivers);
            workgiversDirtyField.SetValue(__instance, false);

            // stop vanilla execution
            return(false);
        }
Exemple #23
0
        private void SpawnSetupWorkSettings()
        {
            if (workTypes == null)
            {
                //Log.Warning("Unexpected creation of converted pawn.");
                workTypes = GetRandomWorkTypes(story);
            }

            WorkType = workTypes.Count > 0 ? workTypes[0].ToString() : String.Empty;

            // Work
            workSettings = new Pawn_WorkSettings(this);
            workSettings.EnableAndInitialize();
            var skillsDefs = new List <SkillDef>();

            foreach (WorkTypeDef current in DefDatabase <WorkTypeDef> .AllDefs)
            {
                if (workTypes.Contains(current))
                {
                    workSettings.SetPriority(current, 1);
                    skillsDefs.AddRange(current.relevantSkills);
                }
                else
                {
                    workSettings.Disable(current);
                }
            }
            skillsDefs.RemoveDuplicates();
            foreach (var skillDef in skillsDefs)
            {
                var record        = skills.GetSkill(skillDef);
                var minSkillLevel = KindDef.minSkillPoints;
                if (record == null || record.XpTotalEarned < minSkillLevel)
                {
                    skills.Learn(skillDef, Rand.Range(minSkillLevel, KindDef.maxSkillPoints));
                }
            }
            //foreach (WorkTypeDef current in DefDatabase<WorkTypeDef>.AllDefs)
            //{
            //    if (workTypes.Contains(current))
            //    {
            //    }
            //}
        }
        public static void                  ForcePriority(this Pawn_WorkSettings p, WorkTypeDef w, int priority)
        {
            p.ConfirmInitializedDebug();
            if (
                (priority < 0) ||
                (priority > 4)
                )
            {
                Log.Message("Trying to set work to invalid priority " + (object)priority);
            }
            var priorities = p.Priorities();

            priorities[w] = priority;
            if (priority == 0)
            {
                p.Pawn().mindState.Notify_WorkPriorityDisabled(w);
            }
            p.WorkGiversDirtySet(true);
        }
Exemple #25
0
        public PawnSurface(Pawn pawn)
        {
            this.pawn = pawn;

            Pawn_WorkSettings workSettings = this.pawn.workSettings;

            for (int i = 0; i < Controller.GetPrimaries.PrimaryWorkList.Count; i++)
            {
                WorkTypeDef def               = Controller.GetPrimaries.PrimaryWorkList[i].def;
                bool        incapablePawn     = this.pawn.story.WorkTypeIsDisabled(def);
                bool        currentlyDisabled = workSettings.GetPriority(def) == 0;          //Account for pre-existing priorities

                DraggableWork newWork = new DraggableWork(def, incapablePawn, this, currentlyDisabled);

                this.children.Add(newWork);
            }

            this.RefreshChildrenDictionary();

            this.children = this.children.OrderByDescending(d => !d.CompletelyDisabled).ThenByDescending(d => workSettings.GetPriority(d.Def) != 0).ThenBy(d => workSettings.GetPriority(d.Def)).ToList();             //Account for pre-existing priorities

            this.UpdatePawnPriorities();
        }
Exemple #26
0
 static void Prefix(Pawn_WorkSettings __instance, WorkTypeDef w, int priority)
 {
     __instance.Pawn().SetPriority(w, priority, null);
 }
 static void SetPriority(Pawn_WorkSettings settings, WorkTypeDef def, int p) => settings.priorities[def] = p;
Exemple #28
0
 public static void Prefix(Pawn_WorkSettings __instance)
 {
     __instance.Pawn().DisableAll();
 }
 static bool Prefix(WorkTypeDef w, Pawn_WorkSettings __instance, ref int __result)
 {
     __result = __instance.Pawn().GetPriority(w, -1);
     return(false);
 }
Exemple #30
0
        static bool CacheWorkGiversInOrder(ref Pawn_WorkSettings __instance)
        {
            List <WorkTypeDef> wtsByPrio = new List <WorkTypeDef>();
            List <WorkGiver>   workGiversInOrderEmerg  = ((List <WorkGiver>)__instance.GetField("workGiversInOrderEmerg"));
            List <WorkGiver>   workGiversInOrderNormal = ((List <WorkGiver>)__instance.GetField("workGiversInOrderNormal"));

            List <WorkTypeDef> allDefsListForReading = DefDatabase <WorkTypeDef> .AllDefsListForReading;

            int num = 999;

            for (int i = 0; i < allDefsListForReading.Count; i++)
            {
                WorkTypeDef workTypeDef = allDefsListForReading[i];
                int         priority    = __instance.GetPriority(workTypeDef);
                if (priority > 0)
                {
                    if (priority < num)
                    {
                        if (workTypeDef.workGiversByPriority.Any((WorkGiverDef wg) => !wg.emergency))
                        {
                            num = priority;
                        }
                    }
                    wtsByPrio.Add(workTypeDef);
                }
            }
            var tmp = __instance;

            wtsByPrio.InsertionSort(delegate(WorkTypeDef a, WorkTypeDef b)
            {
                float value = (float)(a.naturalPriority + (4 - tmp.GetPriority(a)) * 100000);
                return(((float)(b.naturalPriority + (4 - tmp.GetPriority(b)) * 100000)).CompareTo(value));
            });
            workGiversInOrderEmerg.Clear();
            for (int j = 0; j < wtsByPrio.Count; j++)
            {
                WorkTypeDef workTypeDef2 = wtsByPrio[j];
                for (int k = 0; k < workTypeDef2.workGiversByPriority.Count; k++)
                {
                    WorkGiver worker = workTypeDef2.workGiversByPriority[k].Worker;
                    if (worker.def.emergency && __instance.GetPriority(worker.def.workType) <= num)
                    {
                        workGiversInOrderEmerg.Add(worker);
                    }
                }
            }
            workGiversInOrderNormal.Clear();
            for (int l = 0; l < wtsByPrio.Count; l++)
            {
                WorkTypeDef workTypeDef3 = wtsByPrio[l];
                for (int m = 0; m < workTypeDef3.workGiversByPriority.Count; m++)
                {
                    WorkGiver worker2 = workTypeDef3.workGiversByPriority[m].Worker;
                    if (!worker2.def.emergency || __instance.GetPriority(worker2.def.workType) > num)
                    {
                        workGiversInOrderNormal.Add(worker2);
                    }
                }
            }
            __instance.SetField("workGiversDirty", false);
            return(false);
        }