Changeset - r23554:d690e3d46135
[Not reviewed]
master
0 2 0
PeterN - 5 years ago 2019-03-27 23:10:02
peter@fuzzle.org
Fix: Incorrect display of industry production around tiles. (#7426)

Display of industry production around tiles (as shown when placing a station)
did not take account of the station catchment changes, so still showed production
from an industry even if it was not covered by a tile.

This is fixed by making a set of nearby industries that are covered, instead of
looping over all possible industries.
2 files changed with 12 insertions and 12 deletions:
0 comments (0 inline, 0 general)
bin/ai/regression/tst_regression/result.txt
Show inline comments
 
@@ -8533,22 +8533,20 @@ ERROR: IsEnd() is invalid as Begin() is 
 
    19694 => 8
 
    19693 => 8
 

	
 
--TileList_IndustryProducing--
 
  Count():             92
 
  Location ListDump:
 
    46920 => 1
 
    46919 => 1
 
    46918 => 1
 
    46917 => 1
 
    46916 => 1
 
    46915 => 1
 
    46914 => 1
 
    46913 => 1
 
    46912 => 1
 
    46911 => 1
 
    46664 => 1
 
    46663 => 1
 
    46662 => 1
 
    46661 => 1
 
    46660 => 1
 
    46659 => 1
 
@@ -8625,12 +8623,14 @@ ERROR: IsEnd() is invalid as Begin() is 
 
    44356 => 1
 
    44355 => 1
 
    44354 => 1
 
    44353 => 1
 
    44352 => 1
 
    44351 => 1
 
    46920 => 0
 
    46911 => 0
 

	
 
--TileList_StationType--
 
  Count():             4
 
  Location ListDump:
 
    33667 => 0
 
    33415 => 0
src/station_cmd.cpp
Show inline comments
 
@@ -509,27 +509,27 @@ CargoArray GetProductionAroundTiles(Tile
 

	
 
	assert(x1 < x2);
 
	assert(y1 < y2);
 
	assert(w > 0);
 
	assert(h > 0);
 

	
 
	std::set<IndustryID> industries;
 
	TileArea ta(TileXY(x1, y1), TileXY(x2 - 1, y2 - 1));
 

	
 
	/* Loop over all tiles to get the produced cargo of
 
	 * everything except industries */
 
	TILE_AREA_LOOP(tile, ta) AddProducedCargo(tile, produced);
 

	
 
	/* Loop over the industries. They produce cargo for
 
	 * anything that is within 'rad' from their bounding
 
	 * box. As such if you have e.g. a oil well the tile
 
	 * area loop might not hit an industry tile while
 
	 * the industry would produce cargo for the station.
 
	TILE_AREA_LOOP(tile, ta) {
 
		if (IsTileType(tile, MP_INDUSTRY)) industries.insert(GetIndustryIndex(tile));
 
		AddProducedCargo(tile, produced);
 
	}
 

	
 
	/* Loop over the seen industries. They produce cargo for
 
	 * anything that is within 'rad' of any one of their tiles.
 
	 */
 
	const Industry *i;
 
	FOR_ALL_INDUSTRIES(i) {
 
		if (!ta.Intersects(i->location)) continue;
 
	for (IndustryID industry : industries) {
 
		const Industry *i = Industry::Get(industry);
 
		/* Skip industry with neutral station */
 
		if (i->neutral_station != NULL && !_settings_game.station.serve_neutral_industries) continue;
 

	
 
		for (uint j = 0; j < lengthof(i->produced_cargo); j++) {
 
			CargoID cargo = i->produced_cargo[j];
 
			if (cargo != CT_INVALID) produced[cargo]++;
0 comments (0 inline, 0 general)