Merge branch 'master' into jgrpp
# Conflicts: # src/core/alloc_type.hpp # src/group_gui.cpp # src/newgrf.cpp # src/saveload/economy_sl.cpp # src/saveload/map_sl.cpp # src/station_cmd.cpp
This commit is contained in:
@@ -49,6 +49,32 @@ void ScriptTileList::RemoveTile(TileIndex tile)
|
||||
this->RemoveItem(tile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to get list of tiles that will cover an industry's production or acceptance.
|
||||
* @param i Industry in question
|
||||
* @param radius Catchment radius to test
|
||||
* @param bta BitmapTileArea to fill
|
||||
*/
|
||||
static void FillIndustryCatchment(const Industry *i, int radius, BitmapTileArea &bta)
|
||||
{
|
||||
TILE_AREA_LOOP(cur_tile, i->location) {
|
||||
if (!::IsTileType(cur_tile, MP_INDUSTRY) || ::GetIndustryIndex(cur_tile) != i->index) continue;
|
||||
|
||||
int tx = TileX(cur_tile);
|
||||
int ty = TileY(cur_tile);
|
||||
for (int y = -radius; y <= radius; y++) {
|
||||
if (ty + y < 0 || ty + y > (int)MapMaxY()) continue;
|
||||
for (int x = -radius; x <= radius; x++) {
|
||||
if (tx + x < 0 || tx + x > (int)MapMaxX()) continue;
|
||||
TileIndex tile = TileXY(tx + x, ty + y);
|
||||
if (!IsValidTile(tile)) continue;
|
||||
if (::IsTileType(tile, MP_INDUSTRY) && ::GetIndustryIndex(tile) == i->index) continue;
|
||||
bta.SetTile(tile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ScriptTileList_IndustryAccepting::ScriptTileList_IndustryAccepting(IndustryID industry_id, int radius)
|
||||
{
|
||||
if (!ScriptIndustry::IsValidIndustry(industry_id) || radius <= 0) return;
|
||||
@@ -66,12 +92,11 @@ ScriptTileList_IndustryAccepting::ScriptTileList_IndustryAccepting(IndustryID in
|
||||
|
||||
if (!_settings_game.station.modified_catchment) radius = CA_UNMODIFIED + _settings_game.station.catchment_increase;
|
||||
|
||||
TileArea ta(i->location.tile - ::TileDiffXY(radius, radius), i->location.w + radius * 2, i->location.h + radius * 2);
|
||||
TILE_AREA_LOOP(cur_tile, ta) {
|
||||
if (!::IsValidTile(cur_tile)) continue;
|
||||
/* Exclude all tiles that belong to this industry */
|
||||
if (::IsTileType(cur_tile, MP_INDUSTRY) && ::GetIndustryIndex(cur_tile) == industry_id) continue;
|
||||
BitmapTileArea bta(TileArea(i->location).Expand(radius));
|
||||
FillIndustryCatchment(i, radius, bta);
|
||||
|
||||
BitmapTileIterator it(bta);
|
||||
for (TileIndex cur_tile = it; cur_tile != INVALID_TILE; cur_tile = ++it) {
|
||||
/* Only add the tile if it accepts the cargo (sometimes just 1 tile of an
|
||||
* industry triggers the acceptance). */
|
||||
CargoArray acceptance = ::GetAcceptanceAroundTiles(cur_tile, 1, 1, radius);
|
||||
@@ -102,12 +127,11 @@ ScriptTileList_IndustryProducing::ScriptTileList_IndustryProducing(IndustryID in
|
||||
|
||||
if (!_settings_game.station.modified_catchment) radius = CA_UNMODIFIED + _settings_game.station.catchment_increase;
|
||||
|
||||
TileArea ta(i->location.tile - ::TileDiffXY(radius, radius), i->location.w + radius * 2, i->location.h + radius * 2);
|
||||
TILE_AREA_LOOP(cur_tile, ta) {
|
||||
if (!::IsValidTile(cur_tile)) continue;
|
||||
/* Exclude all tiles that belong to this industry */
|
||||
if (::IsTileType(cur_tile, MP_INDUSTRY) && ::GetIndustryIndex(cur_tile) == industry_id) continue;
|
||||
BitmapTileArea bta(TileArea(i->location).Expand(radius));
|
||||
FillIndustryCatchment(i, radius, bta);
|
||||
|
||||
BitmapTileIterator it(bta);
|
||||
for (TileIndex cur_tile = it; cur_tile != INVALID_TILE; cur_tile = ++it) {
|
||||
this->AddTile(cur_tile);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user