//Runs A* on every tile on the edge of the speed radius, thus getting distances for all intervening tiles. void Level::GetPaths(int x, int y, int speed) { for(int i = 0; i <= speed + 1; i++) { //Find paths for tile in each quadrant, redundancies foregone if(x + i < map.size() && y + speed - i < map[0].size() && map[x + i][y + speed - i]) if(map[x + i][y + speed - i]->IsWalkable() && i != 0 && speed - i !=0) { map[x + i][y + speed - i]->SetPath(Pathfind(x, y, x + i, y + speed - i, speed)); OpenNodes(); } if(x + i < map.size() && y - speed + i < map[0].size() && map[x + i][y - speed + i]) if(map[x + i][y - speed + i]->IsWalkable() && speed - i != 0) { map[x + i][y - speed + i]->SetPath(Pathfind(x, y, x + i, y - speed + i, speed)); OpenNodes(); } if(x - i < map.size() && y - speed + i < map[0].size() && map[x - i][y - speed + i]) if(map[x - i][y - speed + i]->IsWalkable() && i != 0 && speed - i !=0) { map[x - i][y - speed + i]->SetPath(Pathfind(x, y, x - i, y - speed + i, speed)); OpenNodes(); } if(x - i < map.size() && y + speed - i < map[0].size() && map[x - i][y + speed - i]) if(map[x - i][y + speed - i]->IsWalkable() && i != 0) { map[x - i][y + speed - i]->SetPath(Pathfind(x, y, x - i, y + speed - i, speed)); OpenNodes(); } } }
void DijkstraPathfinder::init(Pos& arg_start, Pos& arg_end) { start = arg_start; end = arg_end; path.clear(); if (start.x == end.x && start.y == end.y) { state = ALREADY_ON_GOAL; return; } // initing node_field for(int y = 0; y < node_field.get_height(); ++y) for(int x = 0; x < node_field.get_width(); ++x) { Node& node = node_field(x,y); node.visited = 0; node.parent = PARENT_NONE; node.cost = 0; node.x = x; node.y = y; } open_nodes = OpenNodes(); state = WORKING; Node& node = node_field(start.x, start.y); node.visited = 1; node.cost = 0; node.parent = PARENT_GOAL; make_neighbors_open(node); }