Skip to content

Instantly share code, notes, and snippets.

@SamuXarick
Last active December 13, 2023 16:04
Show Gist options
  • Save SamuXarick/2e70e77b4f049fc258866cc4ccd0a31d to your computer and use it in GitHub Desktop.
Save SamuXarick/2e70e77b4f049fc258866cc4ccd0a31d to your computer and use it in GitHub Desktop.
My attempt at creating a "circular tile search"
function MainClass::GetAirportMinDistanceToTown(tile, size_x, size_y)
{
local perimeter_min_x = GetTileX(tile);
local perimeter_min_y = GetTileY(tile);
local perimeter_max_x = perimeter_min_x + size_x - 1;
local perimeter_max_y = perimeter_min_y + size_y - 1;
local mindist = _map_size_x + _map_size_y;
for (local w = perimeter_min_x; w <= perimeter_max_x; w++) {
for (local h = perimeter_min_y; h <= perimeter_max_y; h++) {
local cur_tile = GSMap.GetTileIndex(w, h);
if (!GSMap.IsValidTile(cur_tile)) return _map_size_x + _map_size_y;
if (GetTileX(cur_tile) == perimeter_min_x || GetTileX(cur_tile) == perimeter_max_x || GetTileY(cur_tile) == perimeter_min_y || GetTileY(cur_tile) == perimeter_max_y) {
local dist = GSTown.GetDistanceManhattanToTile(_town, cur_tile);
if (mindist > dist) mindist = dist;
}
}
}
// GSLog.Info("tile: " + tile + "; size_x: " + size_x + "; size_y: " + size_y + "; mindist: " + mindist);
return mindist;
}
if (GetTileX(_tile_N) < GetTileX(_tile_W) && GetTileY(_tile_W) < GetTileY(_tile_S) && GetTileX(_tile_S) > GetTileX(_tile_E) && GetTileY(_tile_E) > GetTileY(_tile_N)) {
// GSLog.Info("_tile_N = " + _tile_N + "; _tile_W = " + _tile_W + "; _tile_S = " + _tile_S + "; _tile_E = " + _tile_E);
local old_n = _tile_num;
while (GetTileX(_tile) <= GetTileX(_tile_W)) {
if (!_tile_queue.HasItem(_tile)) {
if (GetAirportMinDistanceToTown(_tile, _noisiest_airport_width, _noisiest_airport_height) <= distance) {
_tile_queue.AddItem(_tile, _tile_num++);
} else {
_map_size--;
}
// GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + _tile + "; tileX = " + GetTileX(_tile) + "; tileX_W = " + GetTileX(_tile_W));
// GSSign.BuildSign(_tile, "" + _tile_num);
}
if (GetTileX(_tile) + 1 > GetTileX(_tile_W)) break;
_tile = GSMap.GetTileIndex(GetTileX(_tile) + 1, GetTileY(_tile));
}
_tile_N = GSMap.GetTileIndex(GetTileX(_tile_N) + 1, GetTileY(_tile_N) + 1);
// GSCompanyMode(_company) && GSSign.BuildSign(_tile_N, "_tile_N");
// GSController.Break("tileX_N = " + GetTileX(_tile_N) + "; tileY_N = " + GetTileY(_tile_N));
while (GetTileY(_tile) <= GetTileY(_tile_S)) {
if (!_tile_queue.HasItem(_tile)) {
if (GetAirportMinDistanceToTown(_tile, _noisiest_airport_width, _noisiest_airport_height) <= distance) {
_tile_queue.AddItem(_tile, _tile_num++);
} else {
_map_size--;
}
// GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + _tile + "; tileY = " + GetTileY(_tile) + "; tileY_S = " + GetTileY(_tile_S));
// GSSign.BuildSign(_tile, "" + _tile_num);
}
if (GetTileY(_tile) + 1 > GetTileY(_tile_S)) break;
_tile = GSMap.GetTileIndex(GetTileX(_tile), GetTileY(_tile) + 1);
}
_tile_W = GSMap.GetTileIndex(GetTileX(_tile_W) - 1, GetTileY(_tile_W) + 1);
// GSCompanyMode(_company) && GSSign.BuildSign(_tile_W, "_tile_W");
// GSController.Break("tileX_W = " + GetTileX(_tile_W) + "; tileY_W = " + GetTileY(_tile_W));
while (GetTileX(_tile) >= GetTileX(_tile_E)) {
if (!_tile_queue.HasItem(_tile)) {
if (GetAirportMinDistanceToTown(_tile, _noisiest_airport_width, _noisiest_airport_height) <= distance) {
_tile_queue.AddItem(_tile, _tile_num++);
} else {
_map_size--;
}
// GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + _tile + "; tileX = " + GetTileX(_tile) + "; tileX_E = " + GetTileX(_tile_E));
// GSSign.BuildSign(_tile, "" + _tile_num);
}
if (GetTileX(_tile) - 1 < GetTileX(_tile_E)) break;
_tile = GSMap.GetTileIndex(GetTileX(_tile) - 1, GetTileY(_tile));
}
_tile_S = GSMap.GetTileIndex(GetTileX(_tile_S) - 1, GetTileY(_tile_S) - 1);
// GSCompanyMode(_company) && GSSign.BuildSign(_tile_S, "_tile_S");
// GSController.Break("tileX_S = " + GetTileX(_tile_S) + "; tileY_S = " + GetTileY(_tile_S));
while (GetTileY(_tile) >= GetTileY(_tile_N)) {
if (!_tile_queue.HasItem(_tile)) {
if (GetAirportMinDistanceToTown(_tile, _noisiest_airport_width, _noisiest_airport_height) <= distance) {
_tile_queue.AddItem(_tile, _tile_num++);
} else {
_map_size--;
}
// GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + _tile + "; tileY = " + GetTileY(_tile) + "; tileY_N = " + GetTileY(_tile_N));
// GSSign.BuildSign(_tile, "" + _tile_num);
}
if (GetTileY(_tile) - 1 < GetTileY(_tile_N)) break;
_tile = GSMap.GetTileIndex(GetTileX(_tile), GetTileY(_tile) - 1);
}
_tile_E = GSMap.GetTileIndex(GetTileX(_tile_E) + 1, GetTileY(_tile_E) - 1);
// GSCompanyMode(_company) && GSSign.BuildSign(_tile_E, "_tile_E");
// GSController.Break("tileX_E = " + GetTileX(_tile_E) + "; tileY_E = " + GetTileY(_tile_E));
local added = _tile_num - old_n;
GSLog.Info("old_n: " + old_n + "; _tile_num: " + _tile_num + "; added: " + added + "; " + (_tile_num * 100 / _map_size) + "% queued");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment