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); }
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; }
private bool CanUseCache(TraverseMode mode) { if (mode != TraverseMode.PassAllDestroyableThingsNotWater) { return(mode != TraverseMode.NoPassClosedDoorsOrWater); } return(false); }
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)); }
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)); }
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)); }
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)); }
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 }); }
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); }
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); }
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); }
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); }
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); }
public bool CanReach(IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseMode traverseMode, Danger maxDanger) { return(this.CanReach(start, dest, peMode, TraverseParms.For(traverseMode, maxDanger, false))); }
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)); }
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); } } }
IList <Node <TVal> > ISorttedBinaryTree <TVal> .Traverse(TraverseMode mode) { throw new NotImplementedException(); }
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 !"); }
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)); }
public static DimensionDescription CreateIncrementDescription(int max, DimensionAssignment assignment, TraverseMode mode) { return CreateIncrementDescription(max, assignment, mode, 1, default(Order)); }
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(); } }