Changeset - r7086:b7eeb7315994
[Not reviewed]
master
0 9 0
rubidium - 17 years ago 2007-06-27 14:15:48
rubidium@openttd.org
(svn r10353) -Fix/Feature [FS#669]: disallow (in the GUI) the building of infrastructure you do not have available vehicles for. This means that the airport building button is disabled till you can actually build aircraft. The game itself will not disallow you to build the infrastructure and this "new" behaviour can be overriden with a patch setting.
9 files changed with 68 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/dock_gui.cpp
Show inline comments
 
@@ -91,22 +91,25 @@ static void BuildDocksClick_Demolish(Win
 
{
 
	HandlePlacePushButton(w, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceDocks_DemolishArea);
 
}
 

	
 
static void BuildDocksClick_Depot(Window *w)
 
{
 
	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
 
	if (HandlePlacePushButton(w, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, 1, PlaceDocks_Depot)) ShowBuildDocksDepotPicker();
 
}
 

	
 
static void BuildDocksClick_Dock(Window *w)
 
{
 
	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
 
	if (HandlePlacePushButton(w, DTW_STATION, SPR_CURSOR_DOCK, 3, PlaceDocks_Dock)) ShowBuildDockStationPicker();
 
}
 

	
 
static void BuildDocksClick_Buoy(Window *w)
 
{
 
	if (!CanBuildVehicleInfrastructure(VEH_SHIP)) return;
 
	HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, 1, PlaceDocks_Buoy);
 
}
 

	
 

	
 
typedef void OnButtonClick(Window *w);
 
static OnButtonClick * const _build_docks_button_proc[] = {
 
@@ -121,12 +124,13 @@ static OnButtonClick * const _build_dock
 

	
 
static void BuildDocksToolbWndProc(Window *w, WindowEvent *e)
 
{
 
	switch (e->event) {
 
	case WE_PAINT:
 
		DrawWindowWidgets(w);
 
		SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_SHIP), 7, 8, 9, WIDGET_LIST_END);
 
		break;
 

	
 
	case WE_CLICK:
 
		if (e->we.click.widget - 3 >= 0 && e->we.click.widget != 5) _build_docks_button_proc[e->we.click.widget - 3](w);
 
		break;
 

	
src/lang/english.txt
Show inline comments
 
@@ -1112,12 +1112,13 @@ STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELR
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monorail
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :First available
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Last available
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Most used
 

	
 
STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Show building tools when no suitable vehicles are available: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max trains per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max road vehicles per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Max aircraft per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Max ships per player: {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Disable trains for computer: {ORANGE}{STRING1}
src/main_gui.cpp
Show inline comments
 
@@ -1864,12 +1864,15 @@ static void MainToolbarWndProc(Window *w
 
		 * ie : Build road, rail, ships, airports and landscaping
 
		 * Since enabled state is the default, just disable when needed */
 
		SetWindowWidgetsDisabledState(w, _current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
 
		/* disable company list drop downs, if there are no companies */
 
		SetWindowWidgetsDisabledState(w, ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
 

	
 
		SetWindowWidgetDisabledState(w, 19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
 
		SetWindowWidgetDisabledState(w, 22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
 

	
 
		DrawWindowWidgets(w);
 
		break;
 

	
 
	case WE_CLICK: {
 
		if (_game_mode != GM_MENU && !IsWindowWidgetDisabled(w, e->we.click.widget))
 
			_toolbar_button_procs[e->we.click.widget](w);
 
@@ -1892,22 +1895,22 @@ static void MainToolbarWndProc(Window *w
 
		case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
 
		case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
 
		case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
 
		case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
 
		case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
 
		case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
 
		case WKC_SHIFT | WKC_F7: ShowBuildRailToolbar(_last_built_railtype, -1); break;
 
		case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
 
		case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
 
		case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
 
		case WKC_SHIFT | WKC_F10: ShowBuildAirToolbar(); break;
 
		case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
 
		case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
 
		case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
 
		case WKC_CTRL  | 'S': MenuClickSmallScreenshot(); break;
 
		case WKC_CTRL  | 'G': MenuClickWorldScreenshot(); break;
 
		case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
 
		case 'A': ShowBuildRailToolbar(_last_built_railtype, 4); break; /* Invoke Autorail */
 
		case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; /* Invoke Autorail */
 
		case 'L': ShowTerraformToolbar(); break;
 
		default: return;
 
		}
 
		e->we.keypress.cont = false;
 
	} break;
 

	
src/road_gui.cpp
Show inline comments
 
@@ -210,25 +210,25 @@ static void BuildRoadClick_Demolish(Wind
 
{
 
	HandlePlacePushButton(w, RTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceRoad_DemolishArea);
 
}
 

	
 
static void BuildRoadClick_Depot(Window *w)
 
{
 
	if (_game_mode == GM_EDITOR) return;
 
	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
 
	if (HandlePlacePushButton(w, RTW_DEPOT, SPR_CURSOR_ROAD_DEPOT, 1, PlaceRoad_Depot)) ShowRoadDepotPicker();
 
}
 

	
 
static void BuildRoadClick_BusStation(Window *w)
 
{
 
	if (_game_mode == GM_EDITOR) return;
 
	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
 
	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, 1, PlaceRoad_BusStation)) ShowRVStationPicker(RoadStop::BUS);
 
}
 

	
 
static void BuildRoadClick_TruckStation(Window *w)
 
{
 
	if (_game_mode == GM_EDITOR) return;
 
	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
 
	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, 1, PlaceRoad_TruckStation)) ShowRVStationPicker(RoadStop::TRUCK);
 
}
 

	
 
static void BuildRoadClick_Bridge(Window *w)
 
{
 
	HandlePlacePushButton(w, RTW_BUILD_BRIDGE, SPR_CURSOR_BRIDGE, 1, PlaceRoad_Bridge);
 
@@ -267,12 +267,13 @@ static void BuildRoadToolbWndProc(Window
 
	case WE_CREATE: DisableWindowWidget(w, RTW_REMOVE); break;
 

	
 
	case WE_PAINT:
 
		if (IsWindowWidgetLowered(w, RTW_ROAD_X) || IsWindowWidgetLowered(w, RTW_ROAD_Y) || IsWindowWidgetLowered(w, RTW_BUS_STATION) || IsWindowWidgetLowered(w, RTW_TRUCK_STATION)) {
 
			EnableWindowWidget(w, RTW_REMOVE);
 
		}
 
		SetWindowWidgetsDisabledState(w, !CanBuildVehicleInfrastructure(VEH_ROAD), 6, 7, 8, WIDGET_LIST_END);
 
		DrawWindowWidgets(w);
 
		break;
 

	
 
	case WE_CLICK: {
 
		if (e->we.click.widget >= 3) _build_road_button_proc[e->we.click.widget - 3](w);
 
	} break;
src/settings.cpp
Show inline comments
 
@@ -1381,16 +1381,17 @@ const SettingDesc _patch_settings[] = {
 
	 SDT_VAR(Patches, order_review_system,SLE_UINT8, S,MS,     2,     0,       2, 0, STR_CONFIG_PATCHES_ORDER_REVIEW,         NULL),
 
	SDT_BOOL(Patches, never_expire_vehicles,         0, 0, false,                    STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES,NULL),
 
	SDT_BOOL(Patches, lost_train_warn,               S, 0,  true,                    STR_CONFIG_PATCHES_WARN_LOST_TRAIN,      NULL),
 
	SDT_BOOL(Patches, autorenew,                     S, 0, false,                    STR_CONFIG_PATCHES_AUTORENEW_VEHICLE,    EngineRenewUpdate),
 
	 SDT_VAR(Patches, autorenew_months,   SLE_INT16, S, 0,     6,   -12,      12, 0, STR_CONFIG_PATCHES_AUTORENEW_MONTHS,     EngineRenewMonthsUpdate),
 
	 SDT_VAR(Patches, autorenew_money,     SLE_UINT, S,CR,100000,     0, 2000000, 0, STR_CONFIG_PATCHES_AUTORENEW_MONEY,      EngineRenewMoneyUpdate),
 
	 SDT_VAR(Patches, max_trains,        SLE_UINT16, 0, 0,   500,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_TRAINS,           NULL),
 
	 SDT_VAR(Patches, max_roadveh,       SLE_UINT16, 0, 0,   500,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_ROADVEH,          NULL),
 
	 SDT_VAR(Patches, max_aircraft,      SLE_UINT16, 0, 0,   200,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_AIRCRAFT,         NULL),
 
	 SDT_VAR(Patches, max_ships,         SLE_UINT16, 0, 0,   300,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_SHIPS,            NULL),
 
	SDT_BOOL(Patches, always_build_infrastructure,   S, 0, false,                    STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE, RedrawScreen),
 
	 SDT_VAR(Patches, max_trains,        SLE_UINT16, 0, 0,   500,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_TRAINS,           RedrawScreen),
 
	 SDT_VAR(Patches, max_roadveh,       SLE_UINT16, 0, 0,   500,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_ROADVEH,          RedrawScreen),
 
	 SDT_VAR(Patches, max_aircraft,      SLE_UINT16, 0, 0,   200,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_AIRCRAFT,         RedrawScreen),
 
	 SDT_VAR(Patches, max_ships,         SLE_UINT16, 0, 0,   300,     0,    5000, 0, STR_CONFIG_PATCHES_MAX_SHIPS,            RedrawScreen),
 
	SDT_BOOL(Patches, servint_ispercent,             0, 0, false,                    STR_CONFIG_PATCHES_SERVINT_ISPERCENT,    CheckInterval),
 
	 SDT_VAR(Patches, servint_trains,    SLE_UINT16, 0,D0,   150,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_TRAINS,       InValidateDetailsWindow),
 
	 SDT_VAR(Patches, servint_roadveh,   SLE_UINT16, 0,D0,   150,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_ROADVEH,      InValidateDetailsWindow),
 
	 SDT_VAR(Patches, servint_ships,     SLE_UINT16, 0,D0,   360,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_SHIPS,        InValidateDetailsWindow),
 
	 SDT_VAR(Patches, servint_aircraft,  SLE_UINT16, 0,D0,   100,     5,     800, 0, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT,     InValidateDetailsWindow),
 
	SDT_BOOL(Patches, no_servicing_if_no_breakdowns, 0, 0, false,                    STR_CONFIG_PATCHES_NOSERVICE,            NULL),
src/settings_gui.cpp
Show inline comments
 
@@ -652,12 +652,13 @@ static const char *_patches_ui[] = {
 
	"scrollwheel_multiplier",
 
	"pause_on_newgame",
 
	"advanced_vehicle_list",
 
	"loading_indicators",
 
	"timetable_in_ticks",
 
	"default_rail_type",
 
	"always_build_infrastructure",
 
};
 

	
 
static const char *_patches_construction[] = {
 
	"build_on_slopes",
 
	"extra_dynamite",
 
	"longbridges",
src/variables.h
Show inline comments
 
@@ -136,12 +136,13 @@ struct Patches {
 
	bool loading_indicators;            // Show loading indicators
 
	uint8 default_rail_type;            ///< The default rail type for the rail GUI
 

	
 
	uint8 toolbar_pos;                  // position of toolbars, 0=left, 1=center, 2=right
 
	uint8 window_snap_radius;           // Windows snap at each other if closer than this
 

	
 
	bool always_build_infrastructure;   ///< Always allow building of infrastructure, even when you do not have the vehicles for it
 
	UnitID max_trains;                  // max trains in game per player (these are 16bit because the unitnumber field can't hold more)
 
	UnitID max_roadveh;                 // max trucks in game per player
 
	UnitID max_aircraft;                // max planes in game per player
 
	UnitID max_ships;                   // max ships in game per player
 

	
 
	bool servint_ispercent;             // service intervals are in percents
src/vehicle.cpp
Show inline comments
 
@@ -2612,12 +2612,56 @@ UnitID GetFreeUnitNumber(VehicleType typ
 
	}
 

	
 
	return unit;
 
}
 

	
 

	
 
/**
 
 * Check whether we can build infrastructure for the given
 
 * vehicle type. This to disable building stations etc. when
 
 * you are not allowed/able to have the vehicle type yet.
 
 * @param type the vehicle type to check this for
 
 * @return true if there is any reason why you may build
 
 *         the infrastructure for the given vehicle type
 
 */
 
bool CanBuildVehicleInfrastructure(VehicleType type)
 
{
 
	assert(IsPlayerBuildableVehicleType(type));
 

	
 
	if (_patches.always_build_infrastructure) return true;
 

	
 
	UnitID max;
 
	switch (type) {
 
		case VEH_TRAIN:    max = _patches.max_trains; break;
 
		case VEH_ROAD:     max = _patches.max_roadveh; break;
 
		case VEH_SHIP:     max = _patches.max_ships; break;
 
		case VEH_AIRCRAFT: max = _patches.max_aircraft; break;
 
		default: NOT_REACHED();
 
	}
 

	
 
	/* We can build vehicle infrastructure when we may build the vehicle type */
 
	if (max > 0) {
 

	
 
		/* Can we actually build the vehicle type? */
 
		EngineID e;
 
		FOR_ALL_ENGINEIDS_OF_TYPE(e, type) {
 
			if (HASBIT(GetEngine(e)->player_avail, _local_player)) return true;
 
		}
 
		return false;
 
	}
 

	
 
	/* We should be able to build infrastructure when we have the actual vehicle type */
 
	const Vehicle *v;
 
	FOR_ALL_VEHICLES(v) {
 
		if (v->owner == _local_player && v->type == type) return true;
 
	}
 

	
 
	return false;
 
}
 

	
 

	
 
const Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
 
{
 
	const Player *p = GetPlayer(player);
 
	LiveryScheme scheme = LS_DEFAULT;
 
	CargoID cargo_type = v == NULL ? (CargoID)CT_INVALID : v->cargo_type;
 

	
src/vehicle.h
Show inline comments
 
@@ -74,12 +74,13 @@ enum VehicleType {
 
	VEH_AIRCRAFT,
 
	VEH_SPECIAL,
 
	VEH_DISASTER,
 
	VEH_END,
 
	VEH_INVALID = 0xFF,
 
};
 
DECLARE_POSTFIX_INCREMENT(VehicleType);
 
template <> struct EnumPropsT<VehicleType> : MakeEnumPropsT<VehicleType, byte, VEH_TRAIN, VEH_END, VEH_INVALID> {};
 
typedef TinyEnumT<VehicleType> VehicleTypeByte;
 

	
 
enum VehStatus {
 
	VS_HIDDEN          = 0x01,
 
	VS_STOPPED         = 0x02,
 
@@ -566,12 +567,13 @@ CommandCost SendAllVehiclesToDepot(Vehic
 
bool IsVehicleInDepot(const Vehicle *v);
 
void VehicleEnterDepot(Vehicle *v);
 

	
 
void InvalidateAutoreplaceWindow(EngineID e);
 

	
 
CommandCost MaybeReplaceVehicle(Vehicle *v, bool check, bool display_costs);
 
bool CanBuildVehicleInfrastructure(VehicleType type);
 

	
 
/* Flags to add to p2 for goto depot commands */
 
/* Note: bits 8-10 are used for VLW flags */
 
enum {
 
	DEPOT_SERVICE       = (1 << 0), // The vehicle will leave the depot right after arrival (serivce only)
 
	DEPOT_MASS_SEND     = (1 << 1), // Tells that it's a mass send to depot command (type in VLW flag)
0 comments (0 inline, 0 general)