Skip to content

Instantly share code, notes, and snippets.

@SamuXarick
Created December 20, 2023 22:58
Show Gist options
  • Save SamuXarick/01f2d14c3248dd741c644f1215881d6c to your computer and use it in GitHub Desktop.
Save SamuXarick/01f2d14c3248dd741c644f1215881d6c to your computer and use it in GitHub Desktop.
The error is when calculating the inner area... Line 89
function MainClass::AreTilesQueued(min_noise_level_increase = null)
{
if (min_noise_level_increase == null) min_noise_level_increase = GSController.GetSetting("min_noise_level_increase");
local distance_outer = min_noise_level_increase == 1 ? _max_dist : min(_max_dist, GetMaxNoiseToleranceLevelDistance(min_noise_level_increase));
local distance_inner = min(_max_dist, GetMinNoiseToleranceLevelDistance(min_noise_level_increase));
if (!AreTileVariablesInitialized()) {
local town_location_x = GetTileX(_town_location);
local town_location_y = GetTileY(_town_location);
local tile_Nx_outer = max(_min_x, town_location_x - distance_outer - (_noisiest_airport_width - 1));
local tile_Ny_outer = max(_min_y, town_location_y - distance_outer - (_noisiest_airport_height - 1));
local tile_Wx_outer = min(_max_x, town_location_x + distance_outer);
local tile_Wy_outer = max(_min_y, town_location_y - distance_outer - (_noisiest_airport_height - 1));
local tile_Sx_outer = min(_max_x, town_location_x + distance_outer);
local tile_Sy_outer = min(_max_y, town_location_y + distance_outer);
local tile_Ex_outer = max(_min_x, town_location_x - distance_outer - (_noisiest_airport_width - 1));
local tile_Ey_outer = min(_max_y, town_location_y + distance_outer);
// local tile_N_outer = GSMap.GetTileIndex(tile_Nx_outer, tile_Ny_outer);
// local tile_W_outer = GSMap.GetTileIndex(tile_Wx_outer, tile_Wy_outer);
// local tile_S_outer = GSMap.GetTileIndex(tile_Sx_outer, tile_Sy_outer);
// local tile_E_outer = GSMap.GetTileIndex(tile_Ex_outer, tile_Ey_outer);
local tile_Nx_inner = max(_min_x, town_location_x - distance_inner / 2 - (_noisiest_airport_width - 1));
local tile_Ny_inner = max(_min_y, town_location_y - distance_inner / 2 - (_noisiest_airport_height - 1));
local tile_Wx_inner = min(_max_x, town_location_x + distance_inner / 2);
local tile_Wy_inner = max(_min_y, town_location_y - distance_inner / 2 - (_noisiest_airport_height - 1));
local tile_Sx_inner = min(_max_x, town_location_x + distance_inner / 2);
local tile_Sy_inner = min(_max_y, town_location_y + distance_inner / 2);
local tile_Ex_inner = max(_min_x, town_location_x - distance_inner / 2 - (_noisiest_airport_width - 1));
local tile_Ey_inner = min(_max_y, town_location_y + distance_inner / 2);
local tile_N_inner = GSMap.GetTileIndex(tile_Nx_inner, tile_Ny_inner);
local tile_W_inner = GSMap.GetTileIndex(tile_Wx_inner, tile_Wy_inner);
local tile_S_inner = GSMap.GetTileIndex(tile_Sx_inner, tile_Sy_inner);
local tile_E_inner = GSMap.GetTileIndex(tile_Ex_inner, tile_Ey_inner);
local virtual_Nx_outer = town_location_x - distance_outer - (_noisiest_airport_width - 1);
local virtual_Ny_outer = town_location_y - distance_outer - (_noisiest_airport_height - 1);
local virtual_Wx_outer = town_location_x + distance_outer;
local virtual_Wy_outer = town_location_y - distance_outer - (_noisiest_airport_height - 1);
local virtual_Sx_outer = town_location_x + distance_outer;
local virtual_Sy_outer = town_location_y + distance_outer;
local virtual_Ex_outer = town_location_x - distance_outer - (_noisiest_airport_width - 1);
local virtual_Ey_outer = town_location_y + distance_outer;
local virtual_Nx_inner = town_location_x - distance_inner / 2 - (_noisiest_airport_width - 1);
local virtual_Ny_inner = town_location_y - distance_inner / 2 - (_noisiest_airport_height - 1);
local virtual_Wx_inner = town_location_x + distance_inner / 2;
local virtual_Wy_inner = town_location_y - distance_inner / 2 - (_noisiest_airport_height - 1);
local virtual_Sx_inner = town_location_x + distance_inner / 2;
local virtual_Sy_inner = town_location_y + distance_inner / 2;
local virtual_Ex_inner = town_location_x - distance_inner / 2 - (_noisiest_airport_width - 1);
local virtual_Ey_inner = town_location_y + distance_inner / 2;
// PlaceSign(tile_N_outer, "tile_N_outer");
// PlaceSign(tile_W_outer, "tile_W_outer");
// PlaceSign(tile_S_outer, "tile_S_outer");
// PlaceSign(tile_E_outer, "tile_E_outer");
PlaceSign(tile_N_inner, "tile_N_inner", true);
PlaceSign(tile_W_inner, "tile_W_inner", true);
PlaceSign(tile_S_inner, "tile_S_inner", true);
PlaceSign(tile_E_inner, "tile_E_inner", true);
local diff_Nx = tile_Nx_outer - virtual_Nx_outer;
local diff_Ny = tile_Ny_outer - virtual_Ny_outer;
local diff_Wx = virtual_Wx_outer - tile_Wx_outer;
local diff_Wy = tile_Wy_outer - virtual_Wy_outer;
local diff_Sx = virtual_Sx_outer - tile_Sx_outer;
local diff_Sy = virtual_Sy_outer - tile_Sy_outer;
local diff_Ex = tile_Ex_outer - virtual_Ex_outer;
local diff_Ey = virtual_Ey_outer - tile_Ey_outer;
local min_diff = min(diff_Nx, min(diff_Ny, min(diff_Wx, min(diff_Wy, min(diff_Sx, min(diff_Sy, min(diff_Ex, diff_Ey)))))));
GSLog.Info("virtual_N_outer = " + virtual_Nx_outer + "," + virtual_Ny_outer + " ; virtual_W_outer = " + virtual_Wx_outer + "," + virtual_Wy_outer + " ; virtual_S_outer = " + virtual_Sx_outer + "," + virtual_Sy_outer + " ; virtual_E_outer = " + virtual_Ex_outer + "," + virtual_Ey_outer);
virtual_Nx_outer += min_diff;
virtual_Ny_outer += min_diff;
virtual_Wx_outer -= min_diff;
virtual_Wy_outer += min_diff;
virtual_Sx_outer -= min_diff;
virtual_Sy_outer -= min_diff;
virtual_Ex_outer += min_diff;
virtual_Ey_outer -= min_diff;
local area_outer = (tile_Sx_outer - tile_Nx_outer + 1) * (tile_Sy_outer - tile_Ny_outer + 1);
local area_inner = (((min(tile_Sx_inner - 1, _max_x)) - (max(tile_Nx_inner + 1, _min_x)) + 1) * ((min(tile_Sy_inner - 1, _max_y)) - (max(tile_Ny_inner + 1, _min_y)) + 1));
local tile_map = area_outer - area_inner;
GSLog.Info("tile_N_outer = " + tile_Nx_outer + "," + tile_Ny_outer + " ; tile_W_outer = " + tile_Wx_outer + "," + tile_Wy_outer + " ; tile_S_outer = " + tile_Sx_outer + "," + tile_Sy_outer + " ; tile_E_outer = " + tile_Ex_outer + "," + tile_Ey_outer);
GSLog.Info("virtual_N_outer = " + virtual_Nx_outer + "," + virtual_Ny_outer + " ; virtual_W_outer = " + virtual_Wx_outer + "," + virtual_Wy_outer + " ; virtual_S_outer = " + virtual_Sx_outer + "," + virtual_Sy_outer + " ; virtual_E_outer = " + virtual_Ex_outer + "," + virtual_Ey_outer);
GSLog.Info("tile_N_inner = " + tile_Nx_inner + "," + tile_Ny_inner + " ; tile_S_inner = " + tile_Sx_inner + "," + tile_Sy_inner);
// GSLog.Info("virtual_N_inner = " + virtual_Nx_inner + "," + virtual_Ny_inner + " ; virtual_W_inner = " + virtual_Wx_inner + "," + virtual_Wy_inner + " ; virtual_S_inner = " + virtual_Sx_inner + "," + virtual_Sy_inner + " ; virtual_E_inner = " + virtual_Ex_inner + "," + virtual_Ey_inner);
GSLog.Info("diff_Nx = " + diff_Nx + "; diff_Wx = " + diff_Wx + "; diff_Sx = " + diff_Sx + "; diff_Ex = " + diff_Ex);
GSLog.Info("diff_Ny = " + diff_Ny + "; diff_Wy = " + diff_Wy + "; diff_Sy = " + diff_Sy + "; diff_Ey = " + diff_Ey);
GSLog.Info("min_diff = " + min_diff);
assert(abs(virtual_Nx_outer - virtual_Wx_outer) == abs(virtual_Sx_outer - virtual_Ex_outer));
assert(abs(virtual_Ny_outer - virtual_Ey_outer) == abs(virtual_Sy_outer - virtual_Wy_outer));
_tile = {
/* Current tile in iteration */
x = virtual_Nx_outer,
y = virtual_Ny_outer
/* North corner */
N = {
x = virtual_Nx_outer,
y = virtual_Ny_outer
},
/* West corner */
W = {
x = virtual_Wx_outer,
y = virtual_Wy_outer
},
/* South Corner */
S = {
x = virtual_Sx_outer,
y = virtual_Sy_outer
},
/* East Corner */
E = {
x = virtual_Ex_outer,
y = virtual_Ey_outer
},
min_x = tile_Nx_outer,
max_x = tile_Sx_outer,
min_y = tile_Ny_outer,
max_y = tile_Sy_outer,
map = tile_map
};
// GSController.Break("");
}
if ((_tile.N.x < _tile.W.x || _tile.W.y < _tile.S.y || _tile.S.x > _tile.E.x || _tile.E.y > _tile.N.y)) {
GSLog.Info("_tile.N = " + _tile.N.x + "," + _tile.N.y + " ; _tile.W = " + _tile.W.x + "," + _tile.W.y + " ; _tile.S = " + _tile.S.x + "," + _tile.S.y + " ; _tile.E = " + _tile.E.x + "," + _tile.E.y);
local old_n = _tile_num;
/* Walk N -> W */
while (_tile.x <= _tile.W.x) {
if (_tile.x >= _tile.min_x && _tile.x <= _tile.max_x && _tile.y >= _tile.min_y && _tile.y <= _tile.max_y && !_tile_queue.HasItem(GSMap.GetTileIndex(_tile.x, _tile.y))) {
EvaluateTile(GSMap.GetTileIndex(_tile.x, _tile.y));
GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + GSMap.GetTileIndex(_tile.x, _tile.y) + "; tileX = " + _tile.x + "; tileX_W = " + _tile.W.x);
PlaceSign(GSMap.GetTileIndex(_tile.x, _tile.y), "" + _tile_num);
}
if ((_tile.x + 1) > _tile.W.x) break;
_tile.x++;
}
_tile.N.x++;
_tile.N.y++;
if (_tile.N.x >= _tile.min_x && _tile.N.x <= _tile.max_x && _tile.N.y >= _tile.min_y && _tile.N.y <= _tile.max_y) PlaceSign(GSMap.GetTileIndex(_tile.N.x, _tile.N.y), "_tile.N");
GSController.Break("_tile.N.x = " + _tile.N.x + "; _tile.N.y = " + _tile.N.y);
/* Walk W -> S */
while (_tile.y <= _tile.S.y) {
if (_tile.x >= _tile.min_x && _tile.x <= _tile.max_x && _tile.y >= _tile.min_y && _tile.y <= _tile.max_y && !_tile_queue.HasItem(GSMap.GetTileIndex(_tile.x, _tile.y))) {
EvaluateTile(GSMap.GetTileIndex(_tile.x, _tile.y));
GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + GSMap.GetTileIndex(_tile.x, _tile.y) + "; tileY = " + _tile.y + "; tileY_S = " + _tile.S.y);
PlaceSign(GSMap.GetTileIndex(_tile.x, _tile.y), "" + _tile_num);
}
if ((_tile.y + 1) > _tile.S.y) break;
_tile.y++;
}
_tile.W.x--;
_tile.W.y++;
if (_tile.W.x >= _tile.min_x && _tile.W.x <= _tile.max_x && _tile.W.y >= _tile.min_y && _tile.W.y <= _tile.max_y) PlaceSign(GSMap.GetTileIndex(_tile.W.x, _tile.W.y), "_tile.W");
GSController.Break("_tile.W.x = " + _tile.W.x + "; _tile.W.y = " + _tile.W.y);
/* Walk S -> E */
while (_tile.x >= _tile.E.x) {
if (_tile.x >= _tile.min_x && _tile.x <= _tile.max_x && _tile.y >= _tile.min_y && _tile.y <= _tile.max_y && !_tile_queue.HasItem(GSMap.GetTileIndex(_tile.x, _tile.y))) {
EvaluateTile(GSMap.GetTileIndex(_tile.x, _tile.y));
GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + GSMap.GetTileIndex(_tile.x, _tile.y) + "; tileX = " + _tile.x + "; tileX_E = " + _tile.E.x);
PlaceSign(GSMap.GetTileIndex(_tile.x, _tile.y), "" + _tile_num);
}
if ((_tile.x - 1) < _tile.E.x) break;
_tile.x--;
}
_tile.S.x--;
_tile.S.y--;
if (_tile.S.x >= _tile.min_x && _tile.S.x <= _tile.max_x && _tile.S.y >= _tile.min_y && _tile.S.y <= _tile.max_y) PlaceSign(GSMap.GetTileIndex(_tile.S.x, _tile.S.y), "_tile.S");
GSController.Break("_tile.S.x = " + _tile.S.x + "; _tile.S.y = " + _tile.S.y);
/* Walk E -> N */
while (_tile.y >= _tile.N.y) {
if (_tile.x >= _tile.min_x && _tile.x <= _tile.max_x && _tile.y >= _tile.min_y && _tile.y <= _tile.max_y && !_tile_queue.HasItem(GSMap.GetTileIndex(_tile.x, _tile.y))) {
EvaluateTile(GSMap.GetTileIndex(_tile.x, _tile.y));
GSLog.Info("_tile_num = " + _tile_num + "; _tile = " + GSMap.GetTileIndex(_tile.x, _tile.y) + "; tileY = " + _tile.y + "; tileY_N = " + _tile.N.y);
PlaceSign(GSMap.GetTileIndex(_tile.x, _tile.y), "" + _tile_num);
}
if ((_tile.y - 1) < _tile.N.y) break;
_tile.y--;
}
_tile.E.x++;
_tile.E.y--;
if (_tile.E.x >= _tile.min_x && _tile.E.x <= _tile.max_x && _tile.E.y >= _tile.min_y && _tile.E.y <= _tile.max_y) PlaceSign(GSMap.GetTileIndex(_tile.E.x, _tile.E.y), "_tile.E");
GSController.Break("_tile.E.x = " + _tile.E.x + "; _tile.E.y = " + _tile.E.y);
local added = _tile_num - old_n;
GSLog.Info("_tile.map: " + _tile.map + "; _tile_num: " + _tile_num + "; added: " + added + "; " + (_tile_num * 100 / _tile.map) + "% queued");
} else {
assert(_tile_num == _tile_queue.Count());
}
return _tile_num == _tile.map;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment