Ejemplo n.º 1
0
        public bool Allows(TraverseParms tp, bool isDestination)
        {
            if (tp.mode == TraverseMode.PassAllDestroyableThings || tp.mode == TraverseMode.PassAllDestroyableThingsNotWater || type.Passable())
            {
                if ((int)tp.maxDanger < 3 && tp.pawn != null)
                {
                    Danger danger = DangerFor(tp.pawn);
                    if (isDestination || danger == Danger.Deadly)
                    {
                        Region region = tp.pawn.GetRegion(RegionType.Set_All);
                        if ((region == null || (int)danger > (int)region.DangerFor(tp.pawn)) && (int)danger > (int)tp.maxDanger)
                        {
                            return(false);
                        }
                    }
                }
                switch (tp.mode)
                {
                case TraverseMode.ByPawn:
                    if (door != null)
                    {
                        ByteGrid avoidGrid = tp.pawn.GetAvoidGrid();
                        if (avoidGrid != null && avoidGrid[door.Position] == 255)
                        {
                            return(false);
                        }
                        if (tp.pawn.HostileTo(door))
                        {
                            return(door.CanPhysicallyPass(tp.pawn) || tp.canBash);
                        }
                        return(door.CanPhysicallyPass(tp.pawn) && !door.IsForbiddenToPass(tp.pawn));
                    }
                    return(true);

                case TraverseMode.NoPassClosedDoors:
                    return(door == null || door.FreePassage);

                case TraverseMode.PassDoors:
                    return(true);

                case TraverseMode.PassAllDestroyableThings:
                    return(true);

                case TraverseMode.NoPassClosedDoorsOrWater:
                    return(door == null || door.FreePassage);

                case TraverseMode.PassAllDestroyableThingsNotWater:
                    return(true);

                default:
                    throw new NotImplementedException();
                }
            }
            return(false);
        }