Changeset - r9334:6d079081ec24
[Not reviewed]
master
0 16 0
belugas - 16 years ago 2008-05-24 02:54:47
belugas@openttd.org
(svn r13226) -Feature: Allow to have more than only two airports per town. The number of airports is now controlled by the noise each of them generates, the distance from town's center and how tolerant the town is.
Initial concept : TTDPatch (moreairpots), Initial code : Pasky
Thanks to BigBB (help coding), Smatz Skidd13 and frosch for bugcatches and advices
16 files changed with 279 insertions and 26 deletions:
0 comments (0 inline, 0 general)
src/airport.cpp
Show inline comments
 
@@ -43,7 +43,7 @@ void InitializeAirports()
 
		_airport_fta_dummy,
 
		NULL,
 
		0,
 
		0, 0,
 
		0, 0, 0,
 
		0,
 
		0
 
	);
 
@@ -57,7 +57,7 @@ void InitializeAirports()
 
		_airport_fta_country,
 
		_airport_depots_country,
 
		lengthof(_airport_depots_country),
 
		4, 3,
 
		4, 3, 3,
 
		0,
 
		4
 
	);
 
@@ -71,7 +71,7 @@ void InitializeAirports()
 
		_airport_fta_city,
 
		_airport_depots_city,
 
		lengthof(_airport_depots_city),
 
		6, 6,
 
		6, 6, 5,
 
		0,
 
		5
 
	);
 
@@ -85,7 +85,7 @@ void InitializeAirports()
 
		_airport_fta_metropolitan,
 
		_airport_depots_metropolitan,
 
		lengthof(_airport_depots_metropolitan),
 
		6, 6,
 
		6, 6, 8,
 
		0,
 
		6
 
	);
 
@@ -99,7 +99,7 @@ void InitializeAirports()
 
		_airport_fta_international,
 
		_airport_depots_international,
 
		lengthof(_airport_depots_international),
 
		7, 7,
 
		7, 7, 17,
 
		0,
 
		8
 
	);
 
@@ -113,7 +113,7 @@ void InitializeAirports()
 
		_airport_fta_intercontinental,
 
		_airport_depots_intercontinental,
 
		lengthof(_airport_depots_intercontinental),
 
		9, 11,
 
		9, 11, 25,
 
		0,
 
		10
 
	);
 
@@ -127,7 +127,7 @@ void InitializeAirports()
 
		_airport_fta_heliport_oilrig,
 
		NULL,
 
		0,
 
		1, 1,
 
		1, 1, 1,
 
		60,
 
		4
 
	);
 
@@ -141,7 +141,7 @@ void InitializeAirports()
 
		_airport_fta_heliport_oilrig,
 
		NULL,
 
		0,
 
		1, 1,
 
		1, 1, 0,
 
		54,
 
		3
 
	);
 
@@ -155,7 +155,7 @@ void InitializeAirports()
 
		_airport_fta_commuter,
 
		_airport_depots_commuter,
 
		lengthof(_airport_depots_commuter),
 
		5, 4,
 
		5, 4, 4,
 
		0,
 
		4
 
	);
 
@@ -169,7 +169,7 @@ void InitializeAirports()
 
		_airport_fta_helidepot,
 
		_airport_depots_helidepot,
 
		lengthof(_airport_depots_helidepot),
 
		2, 2,
 
		2, 2, 2,
 
		0,
 
		4
 
	);
 
@@ -183,7 +183,7 @@ void InitializeAirports()
 
		_airport_fta_helistation,
 
		_airport_depots_helistation,
 
		lengthof(_airport_depots_helistation),
 
		4, 2,
 
		4, 2, 3,
 
		0,
 
		4
 
	);
 
@@ -225,6 +225,7 @@ AirportFTAClass::AirportFTAClass(
 
	const byte nof_depots_,
 
	uint size_x_,
 
	uint size_y_,
 
	byte noise_level_,
 
	byte delta_z_,
 
	byte catchment_
 
) :
 
@@ -238,6 +239,7 @@ AirportFTAClass::AirportFTAClass(
 
	entry_points(entry_points_),
 
	size_x(size_x_),
 
	size_y(size_y_),
 
	noise_level(noise_level_),
 
	delta_z(delta_z_),
 
	catchment(catchment_)
 
{
src/airport.h
Show inline comments
 
@@ -7,6 +7,7 @@
 

	
 
#include "direction_type.h"
 
#include "map_type.h"
 
#include "tile_type.h"
 

	
 
enum {MAX_TERMINALS =  10};
 
enum {MAX_HELIPADS  =   4};
 
@@ -144,6 +145,7 @@ struct AirportFTAClass {
 
			byte nof_depots,
 
			uint size_x,
 
			uint size_y,
 
			uint8 noise_level,
 
			byte delta_z,
 
			byte catchment
 
		);
 
@@ -167,6 +169,7 @@ struct AirportFTAClass {
 
	const byte *entry_points;             ///< when an airplane arrives at this airport, enter it at position entry_point, index depends on direction
 
	byte size_x;
 
	byte size_y;
 
	uint8 noise_level;                    ///< noise that this airport generates
 
	byte delta_z;                         ///< Z adjustment for helicopter pads
 
	byte catchment;
 
};
 
@@ -194,4 +197,8 @@ const AirportFTAClass *GetAirport(const 
 
 */
 
uint32 GetValidAirports();
 

	
 

	
 
/* Calculate the noise this type airport will generate */
 
uint8 GetAirportNoiseLevelForTown(const AirportFTAClass *afc, TileIndex town_tile, TileIndex tile);
 

	
 
#endif /* AIRPORT_H */
src/airport_gui.cpp
Show inline comments
 
@@ -12,6 +12,7 @@
 
#include "airport.h"
 
#include "sound_func.h"
 
#include "window_func.h"
 
#include "strings_func.h"
 
#include "settings_type.h"
 
#include "viewport_func.h"
 
#include "gfx_func.h"
 
@@ -177,12 +178,17 @@ public:
 
		this->SetWidgetLoweredState(BAW_BTN_DOHILIGHT, _station_show_coverage);
 
		this->LowerWidget(_selected_airport_type + BAW_SMALL_AIRPORT);
 

	
 
		if (_patches.station_noise_level) {
 
			ResizeWindowForWidget(this, BAW_BOTTOMPANEL, 0, 10);
 
		}
 

	
 
		this->FindWindowPlacementAndResize(desc);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		int i; // airport enabling loop
 
		uint16 y_noise_offset = 0;
 
		uint32 avail_airports;
 
		const AirportFTAClass *airport;
 

	
 
@@ -210,8 +216,17 @@ public:
 
		if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 

	
 
		this->DrawWidgets();
 

	
 
		/* only show the station (airport) noise, if the noise option is activated */
 
		if (_patches.station_noise_level) {
 
			/* show the noise of the selected airport */
 
			SetDParam(0, airport->noise_level);
 
			DrawString(2, 206, STR_STATION_NOISE, 0);
 
			y_noise_offset = 10;
 
		}
 

	
 
		/* strings such as 'Size' and 'Coverage Area' */
 
		int text_end = DrawStationCoverageAreaText(2, 206, SCT_ALL, rad, false);
 
		int text_end = DrawStationCoverageAreaText(2, this->widget[BAW_BTN_DOHILIGHT].bottom + 4 + y_noise_offset, SCT_ALL, rad, false);
 
		text_end = DrawStationCoverageAreaText(2, text_end + 4, SCT_ALL, rad, true) + 4;
 
		if (text_end != this->widget[BAW_BOTTOMPANEL].bottom) {
 
			this->SetDirty();
src/lang/english.txt
Show inline comments
 
@@ -3553,3 +3553,9 @@ STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP   
 
STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
 
STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
 
########
 

	
 
############ town controlled noise level
 
STR_CONFIG_PATCHES_NOISE_LEVEL                                  :{LTBLUE}Allow town controlled noise level for airports: {ORANGE}{STRING}
 
STR_NOISE_IN_TOWN                                               :{BLACK}Noise limit in town: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
 
STR_STATION_NOISE                                               :{BLACK}Noise generated: {GOLD}{COMMA}
 
########
src/misc_cmd.cpp
Show inline comments
 
@@ -22,6 +22,7 @@
 
#include "player_base.h"
 
#include "player_gui.h"
 
#include "settings_type.h"
 
#include "station_func.h"
 

	
 
#include "table/strings.h"
 

	
 
@@ -402,6 +403,15 @@ CommandCost CmdChangeDifficultyLevel(Til
 
			_opt_ptr->diff_level = p2;
 
		}
 

	
 
		/* Since the tolerance of the town council has a direct impact on the noise generation/tolerance,
 
		 * launch a re-evaluation of the actual values only when setting has changed */
 
		if (p2 == GAME_DIFFICULTY_TOWNCOUNCIL_TOLERANCE && _game_mode == GM_NORMAL) {
 
			UpdateAirportsNoise();
 
			if (_patches.station_noise_level) {
 
				InvalidateWindowClassesData(WC_TOWN_VIEW, 0);
 
			}
 
		}
 

	
 
		/* If we are a network-client, update the difficult setting (if it is open).
 
		 * Use this instead of just dirtying the window because we need to load in
 
		 * the new difficulty settings */
src/newgrf.cpp
Show inline comments
 
@@ -5091,7 +5091,7 @@ static void InitializeGRFSpecial()
 
	                   |                                        (1 << 0x1D)  // lowmemory
 
	                   |                                        (1 << 0x1E); // generalfixes
 

	
 
	_ttdpatch_flags[1] =                                        (0 << 0x07)  // moreairports - based on units of noise
 
	_ttdpatch_flags[1] =   ((_patches.station_noise_level ? 1 : 0) << 0x07)  // moreairports - based on units of noise
 
	                   |        ((_patches.mammoth_trains ? 1 : 0) << 0x08)  // mammothtrains
 
	                   |                                        (1 << 0x09)  // trainrefit
 
	                   |                                        (0 << 0x0B)  // subsidiaries
src/openttd.cpp
Show inline comments
 
@@ -1345,6 +1345,11 @@ static bool InitializeWindowsAndCaches()
 

	
 
	SetCachedEngineCounts();
 

	
 
	/* Towns have a noise controlled number of airports system
 
	 * So each airport's noise value must be added to the town->noise_reached value
 
	 * Reset each town's noise_reached value to '0' before. */
 
	UpdateAirportsNoise();
 

	
 
	return true;
 
}
 

	
src/saveload.cpp
Show inline comments
 
@@ -35,7 +35,7 @@
 

	
 
#include "table/strings.h"
 

	
 
extern const uint16 SAVEGAME_VERSION = 95;
 
extern const uint16 SAVEGAME_VERSION = 96;
 

	
 
SavegameType _savegame_type; ///< type of savegame we are loading
 

	
src/settings.cpp
Show inline comments
 
@@ -758,8 +758,11 @@ static void ini_load_settings(IniFile *i
 
			break;
 

	
 
		case SDT_INTLIST: {
 
			if (!load_intlist((const char*)p, ptr, sld->length, GetVarMemType(sld->conv)))
 
			if (!load_intlist((const char*)p, ptr, sld->length, GetVarMemType(sld->conv))) {
 
				ShowInfoF("ini: error in array '%s'", sdb->name);
 
			} else if (sd->desc.proc_cnvt != NULL) {
 
				sd->desc.proc_cnvt((const char*)p);
 
			}
 
			break;
 
		}
 
		default: NOT_REACHED(); break;
 
@@ -1054,8 +1057,8 @@ static void ini_save_setting_list(IniFil
 
	SDT_GENERAL(#var, SDT_INTLIST, SL_ARR, type, flags, guiflags, base, var, lengthof(((base*)8)->var), def, 0, 0, 0, NULL, str, proc, NULL, from, to)
 
#define SDT_LIST(base, var, type, flags, guiflags, def, str, proc)\
 
	SDT_CONDLIST(base, var, type, 0, SL_MAX_VERSION, flags, guiflags, def, str, proc)
 
#define SDT_CONDLISTO(base, var, length, type, from, to, flags, guiflags, def, str, proc)\
 
	SDT_GENERAL(#var, SDT_INTLIST, SL_ARR, type, flags, guiflags, base, var, length, def, 0, 0, 0, NULL, str, proc, NULL, from, to)
 
#define SDT_CONDLISTO(base, var, length, type, from, to, flags, guiflags, def, str, proc, load)\
 
	SDT_GENERAL(#var, SDT_INTLIST, SL_ARR, type, flags, guiflags, base, var, length, def, 0, 0, 0, NULL, str, proc, load, from, to)
 

	
 
#define SDT_CONDSTR(base, var, type, from, to, flags, guiflags, def, str, proc)\
 
	SDT_GENERAL(#var, SDT_STRING, SL_STR, type, flags, guiflags, base, var, lengthof(((base*)8)->var), def, 0, 0, 0, NULL, str, proc, NULL, from, to)
 
@@ -1161,6 +1164,12 @@ static int32 CloseSignalGUI(int32 p1)
 
	return 0;
 
}
 

	
 
static int32 InvalidateTownViewWindow(int32 p1)
 
{
 
	InvalidateWindowClassesData(WC_TOWN_VIEW, p1);
 
	return 0;
 
}
 

	
 
static int32 UpdateConsists(int32 p1)
 
{
 
	Vehicle *v;
 
@@ -1260,6 +1269,21 @@ static int32 ConvertLandscape(const char
 
	return lookup_oneofmany("normal|hilly|desert|candy", value);
 
}
 

	
 
/**
 
 * Check for decent values been supplied by the user for the noise tolerance setting.
 
 * The primary idea is to avoid division by zero in game mode.
 
 * The secondary idea is to make it so the values will be somewhat sane and that towns will
 
 * not be overcrowed with airports.  It would be easy to abuse such a feature
 
 * So basically, 200, 400, 800 are the lowest allowed values */
 
static int32 CheckNoiseToleranceLevel(const char *value)
 
{
 
	Patches *patches_ptr = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 
	for (uint16 i = 0; i < lengthof(patches_ptr->town_noise_population); i++) {
 
		patches_ptr->town_noise_population[i] = max(uint16(200 * (i + 1)), patches_ptr->town_noise_population[i]);
 
	}
 
	return 0;
 
}
 

	
 
/* End - Callback Functions */
 

	
 
#ifndef EXTERNAL_PLAYER
 
@@ -1490,6 +1514,7 @@ const SettingDesc _patch_settings[] = {
 
	SDT_CONDBOOL(Patches, gradual_loading, 40, SL_MAX_VERSION, 0, 0,  true, STR_CONFIG_PATCHES_GRADUAL_LOADING,    NULL),
 
	SDT_CONDBOOL(Patches, road_stop_on_town_road, 47, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD, NULL),
 
	SDT_CONDBOOL(Patches, adjacent_stations,      62, SL_MAX_VERSION, 0, 0, true,  STR_CONFIG_PATCHES_ADJACENT_STATIONS, NULL),
 
	SDT_CONDBOOL(Patches, station_noise_level,    96, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_NOISE_LEVEL,       InvalidateTownViewWindow),
 

	
 
	/***************************************************************************/
 
	/* Economy section of the GUI-configure patches window */
 
@@ -1531,6 +1556,7 @@ const SettingDesc _patch_settings[] = {
 
	 SDT_VAR(Patches, dist_local_authority,SLE_UINT8, 0, 0, 20, 5,  60, 0, STR_NULL, NULL),
 
	 SDT_VAR(Patches, wait_oneway_signal,  SLE_UINT8, 0, 0, 15, 2, 100, 0, STR_NULL, NULL),
 
	 SDT_VAR(Patches, wait_twoway_signal,  SLE_UINT8, 0, 0, 41, 2, 100, 0, STR_NULL, NULL),
 
	SDT_CONDLISTO(Patches, town_noise_population, 3, SLE_UINT16, 96, SL_MAX_VERSION, 0, D0, "800,2000,4000", STR_NULL, NULL, CheckNoiseToleranceLevel),
 

	
 
	/***************************************************************************/
 
	/* New Pathfinding patch settings */
src/settings_gui.cpp
Show inline comments
 
@@ -718,6 +718,7 @@ static const char *_patches_stations[] =
 
	"gradual_loading",
 
	"road_stop_on_town_road",
 
	"adjacent_stations",
 
	"station_noise_level",
 
};
 

	
 
static const char *_patches_economy[] = {
src/settings_type.h
Show inline comments
 
@@ -10,7 +10,27 @@
 
#include "town_type.h"
 
#include "transport_type.h"
 

	
 
#define GAME_DIFFICULTY_NUM 18
 
enum {
 
	GAME_DIFFICULTY_AI_NUMBER,
 
	GAME_DIFFICULTY_AI_STARTTIME,
 
	GAME_DIFFICULTY_TOWN_NUMBER,
 
	GAME_DIFFICULTY_INDUSTRIE_NUMBER,
 
	GAME_DIFFICULTY_MAX_LOAN,
 
	GAME_DIFFICULTY_INITIAL_INTEREST,
 
	GAME_DIFFICULTY_VEHICLE_COST,
 
	GAME_DIFFICULTY_AI_SPEED,
 
	GAME_DIFFICULTY_AI_INTELLIGENCE, ///< no longer in use
 
	GAME_DIFFICULTY_VEHICLES_BREAKDOWN,
 
	GAME_DIFFICULTY_SUBSIDY_MULTIPLIER,
 
	GAME_DIFFICULTY_CONSTRUCTION_COST,
 
	GAME_DIFFICULTY_TYPE_TERRAIN,
 
	GAME_DIFFICULTY_SEALAKE_NUMBER,
 
	GAME_DIFFICULTY_ECONOMY,
 
	GAME_DIFFICULTY_LINE_REVERSEMODE,
 
	GAME_DIFFICULTY_DISASTERS,
 
	GAME_DIFFICULTY_TOWNCOUNCIL_TOLERANCE, ///< minimum required town ratings to be allowed to demolish stuff
 
	GAME_DIFFICULTY_NUM,
 
};
 

	
 
/** Specific type for Game Difficulty to ease changing the type */
 
typedef uint16 GDType;
 
@@ -221,6 +241,8 @@ struct Patches {
 
	bool pause_on_newgame;       ///< Whether to start new games paused or not.
 

	
 
	TownLayoutByte town_layout;  ///< Select town layout
 
	bool station_noise_level;        ///< build new airports when the town noise level is still within accepted limits
 
	uint16 town_noise_population[3];  ///< Population to base decision on noise evaluation (@see town_council_tolerance)
 

	
 
	bool timetabling;            ///< Whether to allow timetabling.
 
	bool timetable_in_ticks;     ///< Whether to show the timetable in ticks rather than days.
src/station_cmd.cpp
Show inline comments
 
@@ -1610,6 +1610,88 @@ static const byte * const _airport_secti
 
	_airport_sections_helistation        // Helistation
 
};
 

	
 
/** Recalculate the noise generated by the airports of each town */
 
void UpdateAirportsNoise()
 
{
 
	Town *t;
 
	const Station *st;
 

	
 
	FOR_ALL_TOWNS(t) t->noise_reached = 0;
 

	
 
	FOR_ALL_STATIONS(st) {
 
		if (IsAirport(st->xy)) {
 
			st->town->noise_reached += GetAirportNoiseLevelForTown(GetAirport(st->airport_type), st->town->xy, st->xy);
 
		}
 
	}
 
}
 

	
 
/** Get a possible noise reduction factor based on distance from town center.
 
 * The further you get, the less noise you generate.
 
 * So all those folks at city council can now happily slee...  work in their offices
 
 * @param afc AirportFTAClass pointer of the class being proposed
 
 * @param town_tile TileIndex of town's center, the one who will receive the airport's candidature
 
 * @param tile TileIndex where the new airport might be built
 
 * @return the noise that will be generated, according to distance
 
 */
 
uint8 GetAirportNoiseLevelForTown(const AirportFTAClass *afc, TileIndex town_tile, TileIndex tile)
 
{
 
	struct TileIndexDistance {
 
		TileIndex index;
 
		uint distance;
 
	};
 

	
 
	uint distance;
 

	
 
	/* 0 cannot be accounted, and 1 is the lowest that can be reduced from town.
 
	 * So no need to go any further*/
 
	if (afc->noise_level < 2) return afc->noise_level;
 

	
 
	/* Find the airport-to-be's closest corner to the town */
 
	if (afc->size_x == 1 && afc->size_y == 1) {
 
		distance = DistanceManhattan(town_tile, tile);  // ont tile, one corner, it's THE corner
 
	} else {
 
		/* calculate manhattan distance to town of each side of the airport */
 
		TileIndexDistance dist[4]; ///< Array that will contain all 4 corners in TileIndex and distance
 
		uint min_tile = UINT_MAX;  ///< Sentinel value
 
		uint min_indice = 4;
 

	
 
		/* Based on the size of the airport, establish location of each corner*/
 
		dist[0].index = tile; // north tile
 
		dist[1].index = TileAddWrap(tile, afc->size_x - 1, afc->size_y - 1);  // south tile
 
		dist[2].index = TileAddWrap(tile, afc->size_x - 1, 0);  // west tile
 
		dist[3].index = TileAddWrap(tile, 0, afc->size_y - 1); //east tile
 

	
 
		/* now, go and find the smallest one, thus the closest to town */
 
		for (uint i = 0; i < 4; i++) {
 
			dist[i].distance = DistanceManhattan(town_tile, dist[i].index);
 

	
 
			if (dist[i].distance < min_tile) {
 
				min_tile = dist[i].distance;  // here's a new candidate
 
				min_indice = i;
 
			}
 
		}
 

	
 
		distance = dist[min_indice].distance;
 
	}
 

	
 
	/* The steps for measuring noise reduction are based on the "magical" (and arbitrary) 8 base distance
 
	 * adding the town_council_tolerance 4 times, as a way to graduate, depending of the tolerance.
 
	 * Basically, it says that the less tolerant a town is, the bigger the distance before
 
	 * an actual decrease can be granted */
 
	uint8 town_tolerance_distance = 8 + (_opt.diff.town_council_tolerance * 4);
 

	
 
	/* The airport is in the "inner" distance where there is no noise reduction */
 
	if (distance < town_tolerance_distance) return afc->noise_level;
 

	
 
	/* now, we want to have the distance segmented using the distance judged bareable by town
 
	 * This will give us the coefficient of reduction the distance provides. */
 
	uint noise_reduction = min(afc->noise_level, distance / town_tolerance_distance);
 

	
 
	/* If the noise reduction equals the airport noise itself, don't give it for free. Use it all minus 1.
 
	 * Otherwise, simply reduce the airport's level. */
 
	return max(1U, noise_reduction == afc->noise_level ? afc->noise_level - 1 : afc->noise_level - noise_reduction);
 
}
 

	
 
/** Place an Airport.
 
 * @param tile tile where airport will be built
 
 * @param flags operation to perform
 
@@ -1641,12 +1723,25 @@ CommandCost CmdBuildAirport(TileIndex ti
 
	CommandCost cost = CheckFlatLandBelow(tile, w, h, flags, 0, NULL);
 
	if (CmdFailed(cost)) return cost;
 

	
 
	/* Check if local auth refuses a new airport */
 
	uint num = 0;
 
	FOR_ALL_STATIONS(st) {
 
		if (st->town == t && st->facilities & FACIL_AIRPORT && st->airport_type != AT_OILRIG) num++;
 
	/* Go get the final noise level, that is base noise minus factor from distance to town center */
 
	uint newnoise_level = GetAirportNoiseLevelForTown(afc, t->xy, tile);
 

	
 
	/* Check if local auth would allow a new airport */
 
	bool autority_refused;
 

	
 
	if (_patches.station_noise_level) {
 
		/* do not allow to build a new airport if this raise the town noise over the maximum allowed by town */
 
		autority_refused = (t->noise_reached + newnoise_level) > t->MaxTownNoise();
 
	} else {
 
		uint num = 0;
 
		const Station *st;
 
		FOR_ALL_STATIONS(st) {
 
			if (st->town == t && st->facilities & FACIL_AIRPORT && st->airport_type != AT_OILRIG) num++;
 
		}
 
		autority_refused = (num >= 2);
 
	}
 
	if (num >= 2) {
 

	
 
	if (autority_refused) {
 
		SetDParam(0, t->index);
 
		return_cmd_error(STR_2035_LOCAL_AUTHORITY_REFUSES);
 
	}
 
@@ -1693,6 +1788,9 @@ CommandCost CmdBuildAirport(TileIndex ti
 
	cost.AddCost(_price.build_airport * w * h);
 

	
 
	if (flags & DC_EXEC) {
 
		/* Always add the noise, so there will be no need to recalculate when option toggles */
 
		st->town->noise_reached += newnoise_level;
 

	
 
		st->airport_tile = tile;
 
		st->AddFacility(FACIL_AIRPORT, tile);
 
		st->airport_type = (byte)p1;
 
@@ -1722,6 +1820,10 @@ CommandCost CmdBuildAirport(TileIndex ti
 
		UpdateStationAcceptance(st, false);
 
		InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
 
		InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_PLANES);
 

	
 
		if (_patches.station_noise_level) {
 
			InvalidateWindow(WC_TOWN_VIEW, st->town->index);
 
		}
 
	}
 

	
 
	return cost;
 
@@ -1764,12 +1866,22 @@ static CommandCost RemoveAirport(Station
 
			);
 
		}
 

	
 
		/* Go get the final noise level, that is base noise minus factor from distance to town center.
 
		 * And as for construction, always remove it, even if the patch is not set, in order to avoid the
 
		 * need of recalculation */
 
		st->town->noise_reached -= GetAirportNoiseLevelForTown(afc, st->town->xy, tile);
 

	
 
		st->rect.AfterRemoveRect(st, tile, w, h);
 

	
 
		st->airport_tile = 0;
 
		st->facilities &= ~FACIL_AIRPORT;
 

	
 
		InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_PLANES);
 

	
 
		if (_patches.station_noise_level) {
 
			InvalidateWindow(WC_TOWN_VIEW, st->town->index);
 
		}
 

	
 
		UpdateStationVirtCoordDirty(st);
 
		DeleteStationIfEmpty(st);
 
	}
src/station_func.h
Show inline comments
 
@@ -47,5 +47,6 @@ bool IsStationTileBlocked(TileIndex tile
 
/* Check if a rail station tile is electrifiable. */
 
bool IsStationTileElectrifiable(TileIndex tile);
 

	
 
void UpdateAirportsNoise();
 

	
 
#endif /* STATION_FUNC_H */
src/town.h
Show inline comments
 
@@ -116,6 +116,9 @@ struct Town : PoolItem<Town, TownID, &_T
 
	 * bit 2 = STADIUM */
 
	byte flags12;
 

	
 
	/* level of noise that all the airports are generating */
 
	uint16 noise_reached;
 

	
 
	/* Which players have a statue? */
 
	byte statues;
 

	
 
@@ -184,6 +187,18 @@ struct Town : PoolItem<Town, TownID, &_T
 
	void InitializeLayout();
 

	
 
	inline TownLayout GetActiveLayout() const;
 

	
 
	/** Calculate the max town noise
 
	 * The value is counted using the population divided by the content of the
 
	 * entry in town_noise_population corespondig to the town's tolerance.
 
	 * To this result, we add 3, which is the noise of the lowest airport.
 
	 * So user can at least buld that airport
 
	 * @return the maximum noise level the town will tolerate */
 
	inline uint16 MaxTownNoise() const {
 
		if (this->population == 0) return 0; // no population? no noise
 

	
 
		return ((this->population / _patches.town_noise_population[_opt.diff.town_council_tolerance]) + 3);
 
	}
 
};
 

	
 
/**
src/town_cmd.cpp
Show inline comments
 
@@ -1490,6 +1490,8 @@ static void DoCreateTown(Town *t, TileIn
 
			break;
 
	}
 

	
 
	t->noise_reached = 0;
 

	
 
	t->num_houses += x;
 
	UpdateTownRadius(t);
 

	
 
@@ -1578,7 +1580,7 @@ Town *CreateRandomTown(uint attempts, To
 
	return NULL;
 
}
 

	
 
static const byte _num_initial_towns[4] = {5, 11, 23, 46};
 
static const byte _num_initial_towns[4] = {5, 11, 23, 46};  // very low, low, normal, high
 

	
 
bool GenerateTowns()
 
{
src/town_gui.cpp
Show inline comments
 
@@ -280,7 +280,9 @@ private:
 
	enum TownViewWidget {
 
		TVW_CAPTION = 1,
 
		TVW_STICKY,
 
		TVW_CENTERVIEW = 6,
 
		TVW_VIEWPORTPANEL,
 
		TVW_INFOPANEL = 5,
 
		TVW_CENTERVIEW,
 
		TVW_SHOWAUTORITY,
 
		TVW_CHANGENAME,
 
		TVW_EXPAND,
 
@@ -310,6 +312,11 @@ public:
 
			this->widget[TVW_CHANGENAME].right = this->widget[TVW_STICKY].right;
 
		}
 

	
 
		/* Space required for showing noise level information */
 
		if (_patches.station_noise_level) {
 
			ResizeWindowForWidget(this, TVW_INFOPANEL, 0, 10);
 
		}
 

	
 
		this->FindWindowPlacementAndResize(desc);
 
	}
 

	
 
@@ -334,6 +341,13 @@ public:
 
		DrawString(2, 127, STR_200E_MAIL_LAST_MONTH_MAX, TC_FROMSTRING);
 

	
 
		this->DrawViewport();
 

	
 
		/* only show the town noise, if the noise option is activated. */
 
		if (_patches.station_noise_level) {
 
			SetDParam(0, this->town->noise_reached);
 
			SetDParam(1, this->town->MaxTownNoise());
 
			DrawString(2, 137, STR_NOISE_IN_TOWN, 0);
 
		}
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget)
 
@@ -366,6 +380,22 @@ public:
 
		}
 
	}
 

	
 
	virtual void OnInvalidateData(int data = 0)
 
	{
 
		/* Called when setting station noise have changed, in order to resize the window */
 
		this->SetDirty(); // refresh display for current size. This will allow to avoid glitches when downgrading
 

	
 
		if (_patches.station_noise_level) { // adjust depending
 
			if (this->height == 150) { // window is smaller, needs to be bigger
 
				ResizeWindowForWidget(this, TVW_INFOPANEL, 0, 10);
 
			}
 
		} else {
 
			if (this->height != 150) { // window is bigger, needs to be smaller
 
				ResizeWindowForWidget(this, TVW_INFOPANEL, 0, -10);
 
			}
 
		}
 
	}
 

	
 
	virtual void OnQueryTextFinished(char *str)
 
	{
 
		if (!StrEmpty(str)) {
 
@@ -636,7 +666,6 @@ private:
 
	};
 

	
 
public:
 

	
 
	ScenarioEditorTownGenerationWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
 
	{
 
		this->LowerWidget(_scengen_town_size + TSEW_SMALLTOWN);
0 comments (0 inline, 0 general)