private static void SetPathfinderDelegates(NewPathFinder pf, PathDataLog pathData) { if (pathData.tpMoveCardinal >= 0) { NewPathFinder.GetPawnPathCostSettings = (p) => new NewPathFinder.PawnPathCostSettings { moveTicksCardinal = pathData.tpMoveCardinal, moveTicksDiagonal = pathData.tpMoveDiagonal, area = pathData.allowedArea, avoidGrid = pathData.avoidGrid }; } NewPathFinder.GetPathCostForBuilding = (building, parms) => { if (building is Building_DoorIndex) { var fakeEdificeVal = pathData.fakeEdificeGrid[((Building_DoorIndex)building).edificeIndex]; switch (fakeEdificeVal) { case PathDataLog.Edifice_Impassible: //shouldn't happen, but might as well check case PathDataLog.Edifice_NonTraversableDoor: return(-1); default: return(fakeEdificeVal); } } if (building is Building_KnownArmedTrap) { return(800); } throw new Exception("Unknown Building"); }; }
static void Main() { InitGameData(); Console.WriteLine("-----"); var sw = new Stopwatch(); foreach (var file in Directory.GetFiles(pathDirectory, "*.xml")) //var file = Path.Combine(pathDirectory, "Darcie - 1215368.xml"); { GC.Collect(); Console.WriteLine(Path.GetFileNameWithoutExtension(file)); var pathData = PathDataLog.LoadFromFile(file); var pf = new NewPathFinder(MapBuilder.MapFromPathData(pathData)); var dest = new LocalTargetInfo(pathData.dest.CenterCell); var tp = new TraverseParms() { canBash = pathData.tpCanBash, maxDanger = pathData.tpMaxDanger, mode = pathData.tpMode }; SetPathfinderDelegates(pf, pathData); sw.Start(); //for (int i = 0; i < 4; i++) { var path = pf.FindPath(pathData.start, dest, tp, pathData.peMode); path.Dispose(); } sw.Stop(); Console.WriteLine(); } //Console.WriteLine($"pathmax: {true}, weight: {true}, pops: {pf.debug_openCellsPopped}, pathcost: {path.TotalCost}, elapsed: {sw.ElapsedTicks}"); Console.WriteLine($"\nAll Done!\nElapsed pathfinding time: {sw.ElapsedMilliseconds}ms"); Console.Read(); }