Esempio n. 1
0
        public override bool Applies()
        {
            TraverseMode mode = pathfindData.traverseParms.mode;

            return(mode == TraverseMode.NoPassClosedDoorsOrWater ||
                   mode == TraverseMode.PassAllDestroyableThingsNotWater);
        }
        public IList <Node <TVal> > Traverse(TraverseMode mode)
        {
            IList <Node <TVal> > list = new List <Node <TVal> >();

            switch (mode)
            {
            case TraverseMode.MidOrder:
            {
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.MidOrder);
                return(list);
            }

            case TraverseMode.PreOrder:
            {
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.PreOrder);
                return(list);
            }

            case TraverseMode.PostOrder:
            {
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.PostOrder);
                return(list);
            }

            default:
            {
                throw new Exception("Error TraverseMode !");
            }
            }
        }
        public static bool TryFindBestExitSpot(Pawn pawn, out IntVec3 spot, TraverseMode mode = TraverseMode.ByPawn)
        {
            if (mode == TraverseMode.PassAllDestroyableThings && !pawn.Map.reachability.CanReachMapEdge(pawn.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true)))
            {
                return(RCellFinder_Zombiefied.TryFindRandomPawnEntryCell(out spot, pawn.Map, 0f, true, delegate(IntVec3 x)
                {
                    Pawn pawn2 = pawn;
                    LocalTargetInfo dest = x;
                    PathEndMode peMode = PathEndMode.OnCell;
                    Danger maxDanger = Danger.Deadly;
                    TraverseMode mode2 = mode;
                    return pawn2.CanReach(dest, peMode, maxDanger, false, mode2);
                }));
            }
            int     num  = 0;
            int     num2 = 0;
            IntVec3 intVec2;

            while (true)
            {
                num2++;
                if (num2 > 30)
                {
                    break;
                }
                IntVec3 intVec;
                bool    flag = CellFinder.TryFindRandomCellNear(pawn.Position, pawn.Map, num, null, out intVec, -1);
                num += 4;
                if (flag)
                {
                    int num3 = intVec.x;
                    intVec2 = new IntVec3(0, 0, intVec.z);
                    if (pawn.Map.Size.z - intVec.z < num3)
                    {
                        num3    = pawn.Map.Size.z - intVec.z;
                        intVec2 = new IntVec3(intVec.x, 0, pawn.Map.Size.z - 1);
                    }
                    if (pawn.Map.Size.x - intVec.x < num3)
                    {
                        num3    = pawn.Map.Size.x - intVec.x;
                        intVec2 = new IntVec3(pawn.Map.Size.x - 1, 0, intVec.z);
                    }
                    if (intVec.z < num3)
                    {
                        intVec2 = new IntVec3(intVec.x, 0, 0);
                    }
                    if (intVec2.Standable(pawn.Map) && pawn.CanReach(intVec2, PathEndMode.OnCell, Danger.Deadly, true, mode))
                    {
                        goto Block_9;
                    }
                }
            }
            spot = pawn.Position;
            return(false);

Block_9:
            spot = intVec2;
            return(true);
        }
Esempio n. 4
0
        public static bool TryFindRandomExitSpot(Pawn pawn, out IntVec3 spot, TraverseMode mode = TraverseMode.ByPawn)
        {
            Danger danger = Danger.Some;
            int    num    = 0;

            goto IL_0004;
IL_0004:
            IntVec3 intVec;

            while (true)
            {
                num++;
                if (num > 40)
                {
                    spot = pawn.Position;
                    return(false);
                }
                if (num > 15)
                {
                    danger = Danger.Deadly;
                }
                intVec = CellFinder.RandomCell(pawn.Map);
                int num2 = Rand.RangeInclusive(0, 3);
                if (num2 == 0)
                {
                    intVec.x = 0;
                }
                if (num2 == 1)
                {
                    IntVec3 size = pawn.Map.Size;
                    intVec.x = size.x - 1;
                }
                if (num2 == 2)
                {
                    intVec.z = 0;
                }
                if (num2 == 3)
                {
                    IntVec3 size2 = pawn.Map.Size;
                    intVec.z = size2.z - 1;
                }
                if (intVec.Standable(pawn.Map))
                {
                    LocalTargetInfo dest      = intVec;
                    PathEndMode     peMode    = PathEndMode.OnCell;
                    Danger          maxDanger = danger;
                    TraverseMode    mode2     = mode;
                    if (pawn.CanReach(dest, peMode, maxDanger, canBash: false, mode2))
                    {
                        break;
                    }
                }
            }
            spot = intVec;
            return(true);

IL_00ee:
            goto IL_0004;
        }
Esempio n. 5
0
 private bool CanUseCache(TraverseMode mode)
 {
     if (mode != TraverseMode.PassAllDestroyableThingsNotWater)
     {
         return(mode != TraverseMode.NoPassClosedDoorsOrWater);
     }
     return(false);
 }
Esempio n. 6
0
        public static TraverseParms For(TraverseMode mode, Danger maxDanger = Danger.Deadly, bool canBash = false)
        {
            TraverseParms result = default(TraverseParms);

            result.pawn      = null;
            result.mode      = mode;
            result.maxDanger = maxDanger;
            result.canBash   = canBash;
            return(result);
        }
 public static TraverseParms For(TraverseMode mode, Danger maxDanger = Danger.Deadly, bool canBash = false)
 {
     return(new TraverseParms
     {
         pawn = null,
         mode = mode,
         maxDanger = maxDanger,
         canBash = canBash
     });
 }
        public CellPassabilityRule_PathGrid(PathfindData pathfindData) : base(pathfindData)
        {
            edificeGrid = pathfindData.map.edificeGrid;
            pathGrid    = pathfindData.map.pathGrid;
            pawn        = pathfindData.traverseParms.pawn;
            TraverseMode mode = pathfindData.traverseParms.mode;

            canDestroy = mode == TraverseMode.PassAllDestroyableThings ||
                         mode == TraverseMode.PassAllDestroyableThingsNotWater;
        }
    void SwitchEnum(int inputDir)
    {
        currChannel = (currChannel + inputDir) % Enum.GetValues(typeof(TraverseMode)).Length;

        if (currChannel < 0)
        {
            currChannel = Enum.GetValues(typeof(TraverseMode)).Length - 1;
        }

        traverseMode = (TraverseMode)currChannel;
    }
 public static bool TryFindExitSpotNear(Pawn pawn, IntVec3 near, float radius, out IntVec3 spot, TraverseMode mode = TraverseMode.ByPawn)
 {
     return((mode == TraverseMode.PassAllDestroyableThings && CellFinder.TryFindRandomEdgeCellNearWith(near, radius, pawn.Map, (IntVec3 x) => pawn.CanReach(x, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn), out spot)) || CellFinder.TryFindRandomEdgeCellNearWith(near, radius, pawn.Map, delegate(IntVec3 x)
     {
         Pawn pawn2 = pawn;
         LocalTargetInfo dest = x;
         PathEndMode peMode = PathEndMode.OnCell;
         Danger maxDanger = Danger.Deadly;
         TraverseMode mode2 = mode;
         return pawn2.CanReach(dest, peMode, maxDanger, false, mode2);
     }, out spot));
 }
Esempio n. 11
0
        protected override bool TryFindGoodExitDest(Pawn pawn, bool canDig, out IntVec3 spot)
        {
            TraverseMode mode = (TraverseMode)(canDig ? 3 : 0);
            IntVec3      near = pawn.DutyLocation();
            float        num  = pawn.mindState.duty.radius;

            if (num <= 0.0)
            {
                num = 12f;
            }
            return(RCellFinder.TryFindExitSpotNear(pawn, near, num, out spot, mode));
        }
Esempio n. 12
0
        protected override bool TryFindGoodExitDest(Pawn pawn, bool canDig, out IntVec3 spot)
        {
            TraverseMode mode = (!canDig) ? TraverseMode.ByPawn : TraverseMode.PassAllDestroyableThings;
            IntVec3      near = pawn.DutyLocation();
            float        num  = pawn.mindState.duty.radius;

            if (num <= 0f)
            {
                num = 12f;
            }
            return(RCellFinder.TryFindExitSpotNear(pawn, near, num, out spot, mode));
        }
Esempio n. 13
0
        private static void CheckReachability()
        {
            List <DebugMenuOption> list = new List <DebugMenuOption>();

            TraverseMode[] array = (TraverseMode[])Enum.GetValues(typeof(TraverseMode));
            for (int i = 0; i < array.Length; i++)
            {
                TraverseMode traverseMode2 = array[i];
                TraverseMode traverseMode  = traverseMode2;
                list.Add(new DebugMenuOption(traverseMode2.ToString(), DebugMenuOptionMode.Action, delegate
                {
                    DebugTool tool = null;
                    IntVec3 from   = default(IntVec3);
                    Pawn fromPawn  = default(Pawn);
                    tool           = new DebugTool("from...", delegate
                    {
                        from        = UI.MouseCell();
                        fromPawn    = from.GetFirstPawn(Find.CurrentMap);
                        string text = "to...";
                        if (fromPawn != null)
                        {
                            text = text + " (pawn=" + fromPawn.LabelShort + ")";
                        }
                        DebugTools.curTool = new DebugTool(text, delegate
                        {
                            DebugTools.curTool = tool;
                        }, delegate
                        {
                            IntVec3 c = UI.MouseCell();
                            bool flag;
                            IntVec3 intVec;
                            if (fromPawn != null)
                            {
                                flag   = fromPawn.CanReach(c, PathEndMode.OnCell, Danger.Deadly, canBash: false, traverseMode);
                                intVec = fromPawn.Position;
                            }
                            else
                            {
                                flag   = Find.CurrentMap.reachability.CanReach(from, c, PathEndMode.OnCell, traverseMode, Danger.Deadly);
                                intVec = from;
                            }
                            Color color = flag ? Color.green : Color.red;
                            Widgets.DrawLine(intVec.ToUIPosition(), c.ToUIPosition(), color, 2f);
                        });
                    });
                    DebugTools.curTool = tool;
                }));
            }
            Find.WindowStack.Add(new Dialog_DebugOptionListLister(list));
        }
Esempio n. 14
0
        public static TraverseParms For(Pawn pawn, Danger maxDanger = Danger.Deadly, TraverseMode mode = TraverseMode.ByPawn, bool canBash = false)
        {
            if (pawn == null)
            {
                Log.Error("TraverseParms for null pawn.");
                return(For(TraverseMode.NoPassClosedDoors, maxDanger, canBash));
            }
            TraverseParms result = default(TraverseParms);

            result.pawn      = pawn;
            result.maxDanger = maxDanger;
            result.mode      = mode;
            result.canBash   = canBash;
            return(result);
        }
 public static TraverseParms For(Pawn pawn, Danger maxDanger = Danger.Deadly, TraverseMode mode = TraverseMode.ByPawn, bool canBash = false)
 {
     if (pawn == null)
     {
         Log.Error("TraverseParms for null pawn.", false);
         return(TraverseParms.For(TraverseMode.NoPassClosedDoors, maxDanger, canBash));
     }
     return(new TraverseParms
     {
         pawn = pawn,
         maxDanger = maxDanger,
         mode = mode,
         canBash = canBash
     });
 }
Esempio n. 16
0
        public static bool TryFindBestExitSpot(Pawn pawn, out IntVec3 spot, TraverseMode mode = TraverseMode.ByPawn)
        {
            if (mode == TraverseMode.PassAllDestroyableThings && !pawn.Map.reachability.CanReachMapEdge(pawn.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, canBash: true)))
            {
                return(TryFindRandomPawnEntryCell(out spot, pawn.Map, 0f, allowFogged: true, (IntVec3 x) => pawn.CanReach(x, PathEndMode.OnCell, Danger.Deadly, canBash: false, mode)));
            }
            int     num  = 0;
            int     num2 = 0;
            IntVec3 intVec;

            while (true)
            {
                num2++;
                if (num2 > 30)
                {
                    spot = pawn.Position;
                    return(false);
                }
                IntVec3 result;
                bool    num3 = CellFinder.TryFindRandomCellNear(pawn.Position, pawn.Map, num, null, out result);
                num += 4;
                if (num3)
                {
                    int num4 = result.x;
                    intVec = new IntVec3(0, 0, result.z);
                    if (pawn.Map.Size.z - result.z < num4)
                    {
                        num4   = pawn.Map.Size.z - result.z;
                        intVec = new IntVec3(result.x, 0, pawn.Map.Size.z - 1);
                    }
                    if (pawn.Map.Size.x - result.x < num4)
                    {
                        num4   = pawn.Map.Size.x - result.x;
                        intVec = new IntVec3(pawn.Map.Size.x - 1, 0, result.z);
                    }
                    if (result.z < num4)
                    {
                        intVec = new IntVec3(result.x, 0, 0);
                    }
                    if (intVec.Standable(pawn.Map) && pawn.CanReach(intVec, PathEndMode.OnCell, Danger.Deadly, canBash: true, mode))
                    {
                        break;
                    }
                }
            }
            spot = intVec;
            return(true);
        }
Esempio n. 17
0
 static bool Prefix(ref bool __result, Pawn pawn, bool canDig, out IntVec3 spot)
 {
     spot = IntVec3.Invalid;
     // Check if the animal involved prefers to swim over walk
     if (pawn.GetStatValue(StatDefOf.MoveSpeed) >= pawn.GetStatValue(StatDef.Named(SwimmingLoader.SwimStat)) + 0.001)
     {
         ToggledDeepWaterWalkable.DeepWaterValid = false;
         try
         {
             TraverseMode mode = canDig ? TraverseMode.PassAllDestroyableThings : TraverseMode.ByPawn;
             __result = RCellFinder.TryFindBestExitSpot(pawn, out spot, mode);
         }
         finally
         {
             ToggledDeepWaterWalkable.DeepWaterValid = true;
         }
     }
     return(!__result);
 }
 private static bool CanReach(Thing searcher, Thing target, bool canBash)
 {
     if (searcher is Pawn pawn)
     {
         if (!pawn.CanReach(target, PathEndMode.Touch, Danger.Some, canBash, TraverseMode.ByPawn))
         {
             return(false);
         }
     }
     else
     {
         TraverseMode mode = (!canBash) ? TraverseMode.NoPassClosedDoors : TraverseMode.PassDoors;
         if (!searcher.Map.reachability.CanReach(searcher.Position, target, PathEndMode.Touch, TraverseParms.For(mode, Danger.Deadly, false)))
         {
             return(false);
         }
     }
     return(true);
 }
        protected override bool TryFindGoodExitDest(Pawn pawn, bool canDig, out IntVec3 dest)
        {
            foreach (Vehicle_Cart vehicle_Cart in ToolsForHaulUtility.Cart)
            {
                if (vehicle_Cart.mountableComp.IsMounted && !vehicle_Cart.mountableComp.Driver.RaceProps.Animal && vehicle_Cart.mountableComp.Driver.ThingID == pawn.ThingID)
                {
                    vehicle_Cart.despawnAtEdge = true;
                }
            }
            foreach (Vehicle_Turret vehicle_Cart in ToolsForHaulUtility.CartTurret)
            {
                if (vehicle_Cart.mountableComp.IsMounted && !vehicle_Cart.mountableComp.Driver.RaceProps.Animal && vehicle_Cart.mountableComp.Driver.ThingID == pawn.ThingID)
                {
                    vehicle_Cart.despawnAtEdge = true;
                }
            }
            TraverseMode mode = canDig ? TraverseMode.PassAnything : TraverseMode.ByPawn;

            return(RCellFinder.TryFindBestExitSpot(pawn, out dest, mode));
        }
        private static void FlashRuleCost(DebugCellCostRule rule, Pawn pawn, TraverseMode traverseMode, bool canBash)
        {
            Map             map           = pawn.Map;
            CellRef         pawnPosition  = map.GetCellRef(pawn.Position);
            TraverseParms   traverseParms = TraverseParms.For(pawn, mode: traverseMode, canBash: canBash);
            LocalTargetInfo targetInfo    = new LocalTargetInfo(pawnPosition);
            PathfindData    pathfindData  = new PathfindData(map, pawnPosition, targetInfo, traverseParms, PathEndMode.OnCell);

            CellCostRule costRule = rule.ruleFactory.Invoke(pathfindData);

            if (costRule.Applies())
            {
                foreach (IntVec3 c in map.AllCells)
                {
                    int cost = costRule.GetCost(map.GetCellRef(c));
                    map.debugDrawer.FlashCell(c, cost / 100f, cost.ToString());
                }
            }
            DebugActionsUtility.DustPuffFrom(pawn);
        }
Esempio n. 21
0
        private static void FlashRulePassability(DebugCellPassRule rule, Pawn pawn, TraverseMode traverseMode, bool canBash)
        {
            Map             map           = pawn.Map;
            CellRef         pawnPosition  = map.GetCellRef(pawn.Position);
            TraverseParms   traverseParms = TraverseParms.For(pawn, mode: traverseMode, canBash: canBash);
            LocalTargetInfo targetInfo    = new LocalTargetInfo(pawnPosition);
            PathfindData    pathfindData  = new PathfindData(map, pawnPosition, targetInfo, traverseParms, PathEndMode.OnCell);

            CellPassabilityRule passRule = rule.ruleFactory.Invoke(pathfindData);

            if (passRule.Applies())
            {
                foreach (IntVec3 c in map.AllCells)
                {
                    float color = passRule.IsPassable(map.GetCellRef(c)) ? 0.5f : 0f;
                    map.debugDrawer.FlashCell(c, color);
                }
            }
            DebugActionsUtility.DustPuffFrom(pawn);
        }
Esempio n. 22
0
        private static bool CanReach(Thing searcher, Thing target, bool canBash)
        {
            Pawn pawn = searcher as Pawn;

            if (pawn != null)
            {
                if (!pawn.CanReach(target, PathEndMode.Touch, Danger.Some, canBash, TraverseMode.ByPawn))
                {
                    return(false);
                }
            }
            else
            {
                TraverseMode mode = (TraverseMode)(canBash ? 1 : 2);
                if (!searcher.Map.reachability.CanReach(searcher.Position, target, PathEndMode.Touch, TraverseParms.For(mode, Danger.Deadly, false)))
                {
                    return(false);
                }
            }
            return(true);
        }
        private static bool CanReach(Thing searcher, Thing target, bool canBash)
        {
            Pawn pawn = searcher as Pawn;

            if (pawn != null)
            {
                if (!pawn.CanReach(target, PathEndMode.Touch, Danger.Some, canBash))
                {
                    return(false);
                }
            }
            else
            {
                TraverseMode mode = (canBash ? TraverseMode.PassDoors : TraverseMode.NoPassClosedDoors);
                if (!searcher.Map.reachability.CanReach(searcher.Position, target, PathEndMode.Touch, TraverseParms.For(mode)))
                {
                    return(false);
                }
            }
            return(true);
        }
Esempio n. 24
0
        public static bool TryFindRandomExitSpot(Pawn pawn, out IntVec3 spot, TraverseMode mode = TraverseMode.ByPawn)
        {
            Danger  maxDanger = Danger.Some;
            int     num       = 0;
            IntVec3 intVec;

            do
            {
                num++;
                if (num > 40)
                {
                    spot = pawn.Position;
                    return(false);
                }
                if (num > 15)
                {
                    maxDanger = Danger.Deadly;
                }
                intVec = CellFinder.RandomCell(pawn.Map);
                int num2 = Rand.RangeInclusive(0, 3);
                if (num2 == 0)
                {
                    intVec.x = 0;
                }
                if (num2 == 1)
                {
                    intVec.x = pawn.Map.Size.x - 1;
                }
                if (num2 == 2)
                {
                    intVec.z = 0;
                }
                if (num2 == 3)
                {
                    intVec.z = pawn.Map.Size.z - 1;
                }
            }while (!intVec.Standable(pawn.Map) || !pawn.CanReach(intVec, PathEndMode.OnCell, maxDanger, canBash: false, mode));
            spot = intVec;
            return(true);
        }
Esempio n. 25
0
 public bool CanReach(IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseMode traverseMode, Danger maxDanger)
 {
     return(this.CanReach(start, dest, peMode, TraverseParms.For(traverseMode, maxDanger, false)));
 }
Esempio n. 26
0
 public bool CanReachNonLocal(IntVec3 start, TargetInfo dest, PathEndMode peMode, TraverseMode traverseMode, Danger maxDanger)
 {
     return((dest.Map == null || dest.Map == this.map) && this.CanReach(start, (LocalTargetInfo)dest, peMode, traverseMode, maxDanger));
 }
Esempio n. 27
0
 private void DoGetAllNodes(global::CJBasic.ObjectManagement.Trees.Binary.Node <TVal> childTreeRoot, bool ascend, ref IList <global::CJBasic.ObjectManagement.Trees.Binary.Node <TVal> > list, TraverseMode mode)
 {
     if (childTreeRoot != null)
     {
         if (mode == TraverseMode.MidOrder)
         {
             if (ascend)
             {
                 this.DoGetAllNodes(childTreeRoot.LeftChild, ascend, ref list, mode);
                 list.Add(childTreeRoot);
                 this.DoGetAllNodes(childTreeRoot.RightChild, ascend, ref list, mode);
             }
             else
             {
                 this.DoGetAllNodes(childTreeRoot.RightChild, ascend, ref list, mode);
                 list.Add(childTreeRoot);
                 this.DoGetAllNodes(childTreeRoot.LeftChild, ascend, ref list, mode);
             }
         }
         else if (mode == TraverseMode.PreOrder)
         {
             list.Add(childTreeRoot);
             this.DoGetAllNodes(childTreeRoot.LeftChild, ascend, ref list, mode);
             this.DoGetAllNodes(childTreeRoot.RightChild, ascend, ref list, mode);
         }
         else
         {
             this.DoGetAllNodes(childTreeRoot.LeftChild, ascend, ref list, mode);
             this.DoGetAllNodes(childTreeRoot.RightChild, ascend, ref list, mode);
             list.Add(childTreeRoot);
         }
     }
 }
Esempio n. 28
0
 IList <Node <TVal> > ISorttedBinaryTree <TVal> .Traverse(TraverseMode mode)
 {
     throw new NotImplementedException();
 }
Esempio n. 29
0
        public IList <global::CJBasic.ObjectManagement.Trees.Binary.Node <TVal> > Traverse(TraverseMode mode)
        {
            IList <global::CJBasic.ObjectManagement.Trees.Binary.Node <TVal> > list = new List <global::CJBasic.ObjectManagement.Trees.Binary.Node <TVal> >();

            switch (mode)
            {
            case TraverseMode.PreOrder:
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.PreOrder);
                return(list);

            case TraverseMode.MidOrder:
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.MidOrder);
                return(list);

            case TraverseMode.PostOrder:
                this.DoGetAllNodes(this.root, true, ref list, TraverseMode.PostOrder);
                return(list);
            }
            throw new Exception("Error TraverseMode !");
        }
Esempio n. 30
0
        protected override bool TryFindGoodExitDest(Pawn pawn, bool canDig, out IntVec3 spot)
        {
            TraverseMode mode = (canDig ? TraverseMode.PassAllDestroyableThings : TraverseMode.ByPawn);

            return(RCellFinder.TryFindRandomExitSpot(pawn, out spot, mode));
        }
Esempio n. 31
0
 public static DimensionDescription CreateIncrementDescription(int max, DimensionAssignment assignment, TraverseMode mode)
 {
     return CreateIncrementDescription(max, assignment, mode, 1, default(Order));
 }
Esempio n. 32
0
 public static DimensionDescription CreateIncrementDescription(int max, DimensionAssignment assignment, TraverseMode mode, int breadth, Order startSubOrder)
 {
     switch (mode)
     {
         case TraverseMode.Serpentine:
             return CreateIncrementDescriptionSerpentine(max, assignment, breadth, startSubOrder);
         case TraverseMode.Circular:
             return CreateIncrementDescriptionCircular(max, assignment);
         default:
             throw new ArgumentException();
     }
 }