private static void SetAsBuilder(LordToilData_Siege data, Pawn p)
 {
     //LordToilData_Siege data = this.Data;
     p.mindState.duty = new PawnDuty(DutyDefOf.Build, data.siegeCenter, -1f);
     p.mindState.duty.radius = data.baseRadius;
     int minLevel = Mathf.Max(ThingDefOf.Sandbags.constructionSkillPrerequisite, ThingDefOf.Turret_Mortar.constructionSkillPrerequisite);
     p.skills.GetSkill(SkillDefOf.Construction).EnsureMinLevelWithMargin(minLevel);
     p.workSettings.EnableAndInitialize();
     List<WorkTypeDef> defsListForReading = DefDatabase<WorkTypeDef>.AllDefsListForReading;
     for (int index = 0; index < defsListForReading.Count; ++index)
     {
         WorkTypeDef w = defsListForReading[index];
         if (w == WorkTypeDefOf.Construction)
             p.workSettings.SetPriority(w, 1);
         else
             p.workSettings.Disable(w);
     }
 }
Example #2
0
        public static bool UpdateAllDuties(LordToil_Siege __instance)
        {
            LordToil           lordToil = __instance;
            LordToilData_Siege data     = (LordToilData_Siege)lordToil.data;

            if (__instance.lord.ticksInToil < 450)
            {
                for (int index = 0; index < __instance.lord.ownedPawns.Count; ++index)
                {
                    SetAsDefender(data, __instance.lord.ownedPawns[index]);
                }
            }
            else
            {
                lock (__instance.rememberedDuties)
                {
                    __instance.rememberedDuties.Clear();
                }
                int num1 = Mathf.RoundToInt((float)__instance.lord.ownedPawns.Count * data.desiredBuilderFraction);
                if (num1 <= 0)
                {
                    num1 = 1;
                }
                int num2 = __instance.Map.listerThings.ThingsInGroup(ThingRequestGroup.BuildingArtificial).Where <Thing>((Func <Thing, bool>)(b => b.def.hasInteractionCell && b.Faction == __instance.lord.faction && b.Position.InHorDistOf(__instance.FlagLoc, data.baseRadius))).Count <Thing>();
                if (num1 < num2)
                {
                    num1 = num2;
                }
                int num3 = 0;
                for (int index = 0; index < __instance.lord.ownedPawns.Count; ++index)
                {
                    Pawn ownedPawn = __instance.lord.ownedPawns[index];
                    if (ownedPawn.mindState.duty.def == DutyDefOf.Build)
                    {
                        lock (__instance.rememberedDuties)
                        {
                            if (__instance.rememberedDuties.ContainsKey(ownedPawn))
                            {
                                __instance.rememberedDuties.Add(ownedPawn, DutyDefOf.Build);
                            }
                        }
                        SetAsBuilder(data, ownedPawn);
                        ++num3;
                    }
                }
                int num4 = num1 - num3;
                for (int index = 0; index < num4; ++index)
                {
                    Pawn result;
                    if (__instance.lord.ownedPawns.Where <Pawn>((Func <Pawn, bool>)(pa => !__instance.rememberedDuties.ContainsKey(pa) && CanBeBuilder(pa))).TryRandomElement <Pawn>(out result))
                    {
                        lock (__instance.rememberedDuties)
                        {
                            __instance.rememberedDuties.Add(result, DutyDefOf.Build);
                        }
                        SetAsBuilder(data, result);
                        ++num3;
                    }
                }
                for (int index = 0; index < __instance.lord.ownedPawns.Count; ++index)
                {
                    Pawn ownedPawn = __instance.lord.ownedPawns[index];
                    if (!__instance.rememberedDuties.ContainsKey(ownedPawn))
                    {
                        SetAsDefender(data, ownedPawn);
                        lock (__instance.rememberedDuties)
                        {
                            __instance.rememberedDuties.Add(ownedPawn, DutyDefOf.Defend);
                        }
                    }
                }
                if (num3 != 0)
                {
                    return(false);
                }
                __instance.lord.ReceiveMemo("NoBuilders");
            }
            return(false);
        }
Example #3
0
 private static void SetAsDefender(LordToilData_Siege data, Pawn p)
 {
     //LordToilData_Siege data = __instance.Data;
     p.mindState.duty        = new PawnDuty(DutyDefOf.Defend, data.siegeCenter, -1f);
     p.mindState.duty.radius = data.baseRadius;
 }
        static bool Prefix(LordToil_Siege __instance)
        {
            LordToilTick(__instance);
            LordToilData_Siege data = __instance.Data;

            if (__instance.lord.ticksInToil == 450)
            {
                __instance.lord.CurLordToil.UpdateAllDuties();
            }
            if (__instance.lord.ticksInToil > 450 && __instance.lord.ticksInToil % 500 == 0)
            {
                __instance.UpdateAllDuties();
            }
            if (Find.TickManager.TicksGame % 500 > RefcellRespeedConfig.currentTimeMultiplier - 1)
            {
                return(false);
            }
            if (!__instance.Frames.Where <Frame>((Func <Frame, bool>)(frame => !frame.Destroyed)).Any <Frame>() && (!data.blueprints.Where <Blueprint>((Func <Blueprint, bool>)(blue => !blue.Destroyed)).Any <Blueprint>() && !__instance.Map.listerThings.ThingsInGroup(ThingRequestGroup.BuildingArtificial).Any <Thing>((Predicate <Thing>)(b => b.Faction == __instance.lord.faction && b.def.building.buildingTags.Contains("Artillery")))))
            {
                __instance.lord.ReceiveMemo("NoArtillery");
            }
            else
            {
                int num1 = GenRadial.NumCellsInRadius(20f);
                int num2 = 0;
                int num3 = 0;
                for (int index1 = 0; index1 < num1; ++index1)
                {
                    IntVec3 c = data.siegeCenter + GenRadial.RadialPattern[index1];
                    if (c.InBounds(__instance.Map))
                    {
                        List <Thing> thingList = c.GetThingList(__instance.Map);
                        for (int index2 = 0; index2 < thingList.Count; ++index2)
                        {
                            if (thingList[index2].def.IsShell)
                            {
                                num2 += thingList[index2].stackCount;
                            }
                            if (thingList[index2].def == ThingDefOf.MealSurvivalPack)
                            {
                                num3 += thingList[index2].stackCount;
                            }
                        }
                    }
                }
                if (num2 < 4)
                {
                    ThingDef randomShellDef = TurretGunUtility.TryFindRandomShellDef(ThingDefOf.Turret_Mortar, false, techLevel: __instance.lord.faction.def.techLevel, maxMarketValue: 250f);
                    if (randomShellDef != null)
                    {
                        __instance.DropSupplies(randomShellDef, 6);
                    }
                }
                if (num3 >= 5)
                {
                    return(false);
                }
                __instance.DropSupplies(ThingDefOf.MealSurvivalPack, 12);
            }
            return(false);
        }