Exemplo n.º 1
0
        // Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.Map == null)
            {
                //    Log.Message("map == null");
                return(null);
            }
            Map map = pawn.Map;

            if (!pawn.isXenomorph(out Comp_Xenomorph _Xenomorph))
            {
                //    Log.Message("not xenomorph");
                return(null);
            }
            IntVec3 HiveCenter = IntVec3.Invalid;

            if (_Xenomorph.HiveLoc.IsValid && _Xenomorph.HiveLoc.InBounds(map) && _Xenomorph.HiveLoc != IntVec3.Zero)
            {
                HiveCenter = _Xenomorph.HiveLoc;
            }
            else
            {
                //    Log.Message(string.Format("not _Xenomorph.HiveLoc({0})", _Xenomorph.HiveLoc));
                return(null);
            }

            Region region = pawn.GetRegion(RegionType.Set_Passable);

            if (region == null)
            {
                return(null);
            }
            bool flag1 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive) != null;
            bool flag2 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Child) != null;
            bool flag3 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Slime) != null;

            if (pawn.GetLord() is Lord L && L != null)
            {
                if ((L.CurLordToil is LordToil_DefendAndExpandHiveLike || L.CurLordToil is LordToil_DefendHiveLikeAggressively) && L.CurLordToil is LordToil_HiveLikeRelated THL)
                {
                    if (THL != null)
                    {
                        if (THL.Data != null)
                        {
                            HiveLike hive = THL.Data.assignedHiveLikes.TryGetValue(pawn);
                            if (hive != null)
                            {
                                flag1 = hive.def == XenomorphDefOf.RRY_Xenomorph_Hive;
                                flag2 = hive.def == XenomorphDefOf.RRY_Xenomorph_Hive_Child;
                            }
                        }
                    }
                }
            }
            if (flag1)
            {
                MiningRange = 7;
            }
            else
            if (flag2)
            {
                MiningRange = 3;
            }
            else
            {
                MiningRange = 5;
            }
            if (!pawn.CanReachMapEdge())
            {
                MiningRange = 10;
            }
            for (int i = 0; i < GenRadial.NumCellsInRadius(MiningRange); i++)
            {
                IntVec3 c = HiveCenter + GenRadial.RadialPattern[i];
                if (!HiveStructure.HiveStruct(HiveCenter).Contains(c) && !HiveStructure.HiveWalls(HiveCenter).Contains(c) && pawn.CanReach(c, PathEndMode.ClosestTouch, Danger.Deadly))
                {
                    Building edifice = c.GetEdifice(pawn.Map);
                    if (edifice != null && edifice.def.size == IntVec2.One && edifice.def != ThingDefOf.CollapsedRocks && edifice.def != XenomorphDefOf.RRY_Xenomorph_Hive_Wall && pawn.CanReserveAndReach(edifice, PathEndMode.ClosestTouch, Danger.Deadly, 1, 1) && XenomorphUtil.DistanceBetween(edifice.Position, HiveCenter) <= MiningRange)
                    {
                        bool xenobuilding = edifice.GetType() != typeof(Building_XenoEgg) && edifice.GetType() != typeof(Building_XenomorphCocoon) && edifice.GetType() != typeof(HiveLike);
                        if (xenobuilding)
                        {
                            return(new Job(JobDefOf.Mine, edifice)
                            {
                                ignoreDesignations = true
                            });
                        }
                    }
                }
            }

            return(null);
        }
        // Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54

        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!pawn.isXenomorph(out Comp_Xenomorph _Xenomorph))
            {
                return(null);
            }
            if (pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Queen && pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Drone && pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Predalien)
            {
                return(null);
            }
            Map     map        = pawn.Map;
            IntVec3 pos        = pawn.Position;
            IntVec3 HiveCenter = _Xenomorph.HiveLoc;
            Region  region     = pawn.GetRegion(RegionType.Set_Passable);

            if (region == null)
            {
                return(null);
            }
            if (HiveCenter == pawn.InteractionCell)
            {
                return(null);
            }
            bool centerNode   = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive) != null;
            bool centerChild  = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Child) != null;
            bool centerSlime  = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Slime) != null;
            bool centerFilled = HiveCenter.Filled(pawn.Map);

            if (centerNode)
            {
                MiningRange = 6;
            }
            else
            {
                MiningRange = 3;
                if (!centerChild)
                {
                    if (pawn.def == XenomorphRacesDefOf.RRY_Xenomorph_Queen || pawn.def == XenomorphRacesDefOf.RRY_Xenomorph_Drone)
                    {
                        if (!centerNode)
                        {
                            IntVec3 c = HiveCenter;
                            if (c.InBounds(pawn.Map) && c.Roofed(pawn.Map) && pawn.CanReserveAndReach(c, PathEndMode.OnCell, Danger.Deadly))
                            {
                                return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Node, c)
                                {
                                    ignoreDesignations = false
                                });
                            }
                        }
                        return(null);
                    }
                }
            }
            if (!centerChild)
            {
                foreach (var structure in HiveStructure.HiveStruct(HiveCenter).Where(x => x.GetThingList(map).Any(z => !z.def.defName.Contains("RRY_Xenomorph_Hive")) && x.DistanceTo(HiveCenter) <= MiningRange && pawn.CanReserveAndReach(x, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Floor) && x.GetFirstBuilding(map) == null))
                {
                    return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Wall, structure)
                    {
                        ignoreDesignations = false
                    });
                }
                foreach (var structure in HiveStructure.HiveWallGen(HiveCenter, MiningRange).Where(x => x.GetThingList(map).Any(z => !z.def.defName.Contains("RRY_Xenomorph_Hive")) && x.DistanceTo(HiveCenter) <= MiningRange + 2 && pawn.CanReserveAndReach(x, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Floor) && x.GetFirstBuilding(map) == null))
                {
                    return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Wall, structure)
                    {
                        ignoreDesignations = false
                    });
                }
                Predicate <IntVec3> validator2 = delegate(IntVec3 y)
                {
                    bool roofed = (y.Roofed(pawn.Map));
                    bool result = !roofed && XenomorphUtil.DistanceBetween(y, HiveCenter) <= MiningRange && pawn.CanReserveAndReach(y, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Ceiling);
                    return(result);
                };
                if (RCellFinder.TryFindRandomCellNearWith(HiveCenter, validator2, pawn.Map, out IntVec3 c2, MiningRange, MiningRange))
                {
                    if (c2.InBounds(pawn.Map) && pawn.CanReserveAndReach(c2, PathEndMode.OnCell, Danger.Deadly))
                    {
                        return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Roof, c2)
                        {
                            ignoreDesignations = false
                        });
                    }
                }
            }
            return(null);
        }