コード例 #1
0
 public static bool Prefix(LordToil_Siege __instance, Pawn p)
 {
     if (p.skills != null)
     {
         return(true);
     }
     if (__instance.rememberedDuties.ContainsKey(p))
     {
         __instance.rememberedDuties.Remove(p);
     }
     return(false);
 }
コード例 #2
0
ファイル: LordToil_Siege.cs プロジェクト: xywf221/RimThreaded
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 static void LordToilTick(LordToil_Siege instance)
 {
 }