void getGroundWalkDistanceMap(int walkx, int walky, RectangleArray<double>& distanceMap) { distanceMap.resize(BWAPI::Broodwar->mapWidth()*4,BWAPI::Broodwar->mapHeight()*4); Heap< BWAPI::TilePosition , int > heap(true); for(unsigned int x=0;x<distanceMap.getWidth();x++) { for(unsigned int y=0;y<distanceMap.getHeight();y++) { distanceMap[x][y]=-1; } } BWAPI::TilePosition start(walkx,walky); heap.push(std::make_pair(start,0)); int sx=(int)start.x(); int sy=(int)start.y(); distanceMap[sx][sy]=0; while (!heap.empty()) { BWAPI::TilePosition pos=heap.top().first; int distance=heap.top().second; heap.pop(); int x=(int)pos.x(); int y=(int)pos.y(); int min_x=max(x-1,0); int max_x=min(x+1,distanceMap.getWidth()-1); int min_y=max(y-1,0); int max_y=min(y+1,distanceMap.getHeight()-1); for(int ix=min_x;ix<=max_x;ix++) { for(int iy=min_y;iy<=max_y;iy++) { int f=abs(ix-x)*32+abs(iy-y)*32; if (f>32) {f=45;} if (MapData::walkability[ix][iy]==false) f+=100000; int v=distance+f; if (distanceMap[ix][iy]>v) { heap.set(BWAPI::TilePosition(x,y),v); distanceMap[ix][iy]=v; } else { if (distanceMap[ix][iy]==-1) { distanceMap[ix][iy]=v; heap.push(std::make_pair(BWAPI::TilePosition(ix,iy),v)); } } } } } }
void calculate_walk_distances(const RectangleArray<bool>& read_map , const BWAPI::Position& start , int max_distance , RectangleArray<int>& distance_map) { Heap<BWAPI::Position, int> heap(true); for (unsigned int x = 0;x < distance_map.getWidth();x++) { for (unsigned int y = 0;y < distance_map.getHeight();y++) { distance_map[x][y] = -1; } } heap.push(std::make_pair(start, 0)); int sx = (int)start.x(); int sy = (int)start.y(); distance_map[sx][sy] = 0; while (!heap.empty()) { BWAPI::Position pos = heap.top().first; int distance = heap.top().second; heap.pop(); int x = (int)pos.x(); int y = (int)pos.y(); if (distance > max_distance && max_distance > 0) break; int min_x = max(x - 1, 0); int max_x = min(x + 1, read_map.getWidth() - 1); int min_y = max(y - 1, 0); int max_y = min(y + 1, read_map.getHeight() - 1); for (int ix = min_x;ix <= max_x;ix++) { for (int iy = min_y;iy <= max_y;iy++) { int f = abs(ix - x) * 10 + abs(iy - y) * 10; if (f > 10) { f = 14; } int v = distance + f; if (distance_map[ix][iy] > v) { heap.set(BWAPI::Position(x, y), v); distance_map[ix][iy] = v; } else { if (distance_map[ix][iy] == -1 && read_map[ix][iy] == true) { distance_map[ix][iy] = v; heap.push(std::make_pair(BWAPI::Position(ix, iy), v)); } } } } } }
//---------------------------------------------------------------------------------------------------------- RectangleArray<char> Strings::makeBorder(const RectangleArray<char>& input, bool coordinates) { int leftBorder = (int)log10((float)input.getHeight()) + 2; int topBorder = 3; RectangleArray<char> returnValue = RectangleArray<char>(input.getWidth() + leftBorder*2, input.getHeight() + topBorder*2); for (unsigned int x = 0; x < returnValue.getWidth(); x++) for (unsigned int y = 0; y < returnValue.getHeight(); y++) returnValue[x][y] = ' '; Strings::makeWindow(returnValue, leftBorder - 1, topBorder - 1, input.getWidth() + 2, input.getHeight() + 2); for (unsigned int x = 0; x < input.getWidth(); x++) for (unsigned int y = 0; y < input.getHeight(); y++) returnValue[x + leftBorder ][y + topBorder] = input[x][y]; for (unsigned int i = 0; i < input.getWidth(); i+=10) { Strings::printTo(returnValue, Strings::intToString(i), i + leftBorder, 0); Strings::printTo(returnValue, Strings::intToString(i), i + leftBorder, returnValue.getHeight() - 1); } for (unsigned int i = 0; i < input.getWidth(); i++) { Strings::printTo(returnValue, Strings::intToString(i%10), i + leftBorder, 1); Strings::printTo(returnValue, Strings::intToString(i%10), i + leftBorder, returnValue.getHeight() - 2); } for (unsigned int i = 0; i < input.getHeight(); i++) { Strings::printTo(returnValue, Strings::intToString(i), 0 , i + topBorder); Strings::printTo(returnValue, Strings::intToString(i), leftBorder + input.getWidth() + 1, i + topBorder); } return returnValue; }
void calculate_walk_distances_area(const BWAPI::Position& start , int width , int height , int max_distance , RectangleArray<int>& distance_map) { Heap<BWAPI::Position, int> heap(true); for (unsigned int x = 0;x < distance_map.getWidth();x++) { for (unsigned int y = 0;y < distance_map.getHeight();y++) { distance_map[x][y] = -1; } } int sx = (int)start.x(); int sy = (int)start.y(); for (int x = sx;x < sx + width;x++) { for (int y = sy;y < sy + height;y++) { heap.push(std::make_pair(BWAPI::Position(x, y), 0)); distance_map[x][y] = 0; } } while (!heap.empty()) { BWAPI::Position pos = heap.top().first; int distance = heap.top().second; heap.pop(); int x = (int)pos.x(); int y = (int)pos.y(); if (distance > max_distance && max_distance > 0) break; int min_x = max(x - 1, 0); int max_x = min(x + 1, BWAPI::Broodwar->mapWidth() * 4 - 1); int min_y = max(y - 1, 0); int max_y = min(y + 1, BWAPI::Broodwar->mapHeight() * 4 - 1); for (int ix = min_x;ix <= max_x;ix++) { for (int iy = min_y;iy <= max_y;iy++) { int f = abs(ix - x) * 10 + abs(iy - y) * 10; if (f > 10) { f = 14; } int v = distance + f; if (distance_map[ix][iy] > v) { heap.set(BWAPI::Position(x, y), v); distance_map[ix][iy] = v; } else { if (distance_map[ix][iy] == -1 && MapData::rawWalkability[ix][iy] == true) { distance_map[ix][iy] = v; heap.push(std::make_pair(BWAPI::Position(ix, iy), v)); } } } } } }
//---------------------------------------------------------------------------------------------------------- void Strings::makeWindow(RectangleArray<char>& input, unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int frameType) { for (unsigned int i = x + 1; i < x + width - 1 && x < input.getWidth(); i++) { input[i][y] = Strings::FrameCharacters[frameType][0]; input[i][y + height - 1] = Strings::FrameCharacters[frameType][0]; } for (unsigned int i = y + 1; i < y + height - 1 && y < input.getHeight(); i++) { input[x][i] = Strings::FrameCharacters[frameType][1]; input[x + width - 1][i] = Strings::FrameCharacters[frameType][1]; } input[x][y] = Strings::FrameCharacters[frameType][2]; input[x + width - 1][y] = Strings::FrameCharacters[frameType][3]; input[x][y + height - 1] = Strings::FrameCharacters[frameType][4]; input[x + width - 1][y + height- 1] = Strings::FrameCharacters[frameType][5]; }