Files @ r4574:26f71b3f860b
Branch filter:

Location: cpp/openttd-patchpack/source/airport_gui.c - annotation

bjarni
(svn r6424) -Codechange: [autoreplace] removed a loop though all vehicles from each time the window is redrawn
To do this, the player struct contains an array, that contains the count of each engine type that the player owns
Those arrays are updated each time a vehicle is build or deleted and is calculated on load (it's not saved)
It's possible to access the arrays outside of the autoreplace GUI, so feel free to read from them in other patches as well
r2186:5ee653b1b5e1
r2186:5ee653b1b5e1
r0:d63b455452f6
r1891:c5c5466afa35
r1363:a54abce83b4b
r507:b1b0a0a3c313
r2163:ae001e2aa5b0
r679:3a7b08cc8504
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r337:998f55d0b04c
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1313:da473558c9d7
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1093:18f56ef2d029
r0:d63b455452f6
r0:d63b455452f6
r1977:1f8b99c96041
r0:d63b455452f6
r0:d63b455452f6
r541:062eeec7f0a4
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1977:1f8b99c96041
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1977:1f8b99c96041
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1914:63c34ade2fdf
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r756:682ff57c5eb0
r0:d63b455452f6
r0:d63b455452f6
r606:8ecd7d248197
r0:d63b455452f6
r606:8ecd7d248197
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r606:8ecd7d248197
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r2639:e298192a7c03
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r756:682ff57c5eb0
r756:682ff57c5eb0
r0:d63b455452f6
r1019:90da3857ff29
r937:aef543f8d4d6
r937:aef543f8d4d6
r937:aef543f8d4d6
r937:aef543f8d4d6
r937:aef543f8d4d6
r2631:d39f0cdd1c56
r937:aef543f8d4d6
r937:aef543f8d4d6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r193:6aa65dc5a4b4
r0:d63b455452f6
r4077:259c4c4aacad
r0:d63b455452f6
r4077:259c4c4aacad
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r756:682ff57c5eb0
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r2619:14b1b02e2787
r2619:14b1b02e2787
r2619:14b1b02e2787
r2619:14b1b02e2787
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r176:7d9100f64c27
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r606:8ecd7d248197
r0:d63b455452f6
r756:682ff57c5eb0
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1093:18f56ef2d029
r0:d63b455452f6
r946:70fe894a35f5
r0:d63b455452f6
r0:d63b455452f6
r2619:14b1b02e2787
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1784:15b805156766
r0:d63b455452f6
r0:d63b455452f6
r792:aa02017763d6
r1784:15b805156766
r4171:bf306290d87e
r0:d63b455452f6
r1784:15b805156766
r0:d63b455452f6
r0:d63b455452f6
r1784:15b805156766
r1784:15b805156766
r1784:15b805156766
r1784:15b805156766
r1784:15b805156766
r2639:e298192a7c03
r2639:e298192a7c03
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r1784:15b805156766
r0:d63b455452f6
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r3876:7e1a3ac6cbb4
r3876:7e1a3ac6cbb4
r568:3ee180395698
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r2631:d39f0cdd1c56
r2631:d39f0cdd1c56
r867:c270355a1b34
r2639:e298192a7c03
r0:d63b455452f6
r0:d63b455452f6
r4077:259c4c4aacad
r4345:3e958e22413f
r4059:35d2ee7000b3
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r2639:e298192a7c03
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r541:062eeec7f0a4
r0:d63b455452f6
r0:d63b455452f6
r4059:35d2ee7000b3
r4059:35d2ee7000b3
r541:062eeec7f0a4
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1109:6c0cc4a443a2
r1072:ec4ee87185e5
r2639:e298192a7c03
r1072:ec4ee87185e5
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r4345:3e958e22413f
r176:7d9100f64c27
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r4059:35d2ee7000b3
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1093:18f56ef2d029
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1093:18f56ef2d029
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
/* $Id$ */

#include "stdafx.h"
#include "openttd.h"
#include "table/sprites.h"
#include "table/strings.h"
#include "functions.h"
#include "map.h"
#include "window.h"
#include "gui.h"
#include "viewport.h"
#include "gfx.h"
#include "sound.h"
#include "command.h"
#include "vehicle.h"
#include "station.h"
#include "airport.h"
#include "depot.h"

static byte _selected_airport_type;

static void ShowBuildAirportPicker(void);


void CcBuildAirport(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
	if (success) {
		SndPlayTileFx(SND_1F_SPLAT, tile);
		ResetObjectToPlace();
	}
}

static void PlaceAirport(TileIndex tile)
{
	DoCommandP(tile, _selected_airport_type, 0, CcBuildAirport, CMD_BUILD_AIRPORT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
}

static void PlaceAir_DemolishArea(TileIndex tile)
{
	VpStartPlaceSizing(tile, 4);
}


static void BuildAirClick_Airport(Window *w)
{
	if (HandlePlacePushButton(w, 3, SPR_CURSOR_AIRPORT, 1, PlaceAirport)) ShowBuildAirportPicker();
}

static void BuildAirClick_Demolish(Window *w)
{
	HandlePlacePushButton(w, 4, ANIMCURSOR_DEMOLISH, 1, PlaceAir_DemolishArea);
}

static void BuildAirClick_Landscaping(Window *w)
{
	ShowTerraformToolbar();
}

typedef void OnButtonClick(Window *w);
static OnButtonClick * const _build_air_button_proc[] = {
	BuildAirClick_Airport,
	BuildAirClick_Demolish,
	BuildAirClick_Landscaping,
};

static void BuildAirToolbWndProc(Window *w, WindowEvent *e)
{
	switch (e->event) {
	case WE_PAINT:
		DrawWindowWidgets(w);
		break;

	case WE_CLICK:
		if (e->click.widget - 3 >= 0)
			_build_air_button_proc[e->click.widget - 3](w);
		break;

	case WE_KEYPRESS: {
		switch (e->keypress.keycode) {
			case '1': BuildAirClick_Airport(w); break;
			case '2': BuildAirClick_Demolish(w); break;
			case 'l': BuildAirClick_Landscaping(w); break;
			default: return;
		}
	} break;

	case WE_PLACE_OBJ:
		_place_proc(e->place.tile);
		break;

	case WE_PLACE_DRAG:
		VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata);
		break;

	case WE_PLACE_MOUSEUP:
		if (e->place.pt.x != -1) {
			DoCommandP(e->place.tile, e->place.starttile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
		}
		break;

	case WE_ABORT_PLACE_OBJ:
		UnclickWindowButtons(w);
		SetWindowDirty(w);
		w = FindWindowById(WC_BUILD_STATION, 0);
		if (w != 0)
			WP(w,def_d).close = true;
		break;

	case WE_DESTROY:
		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
		break;
	}
}

static const Widget _air_toolbar_widgets[] = {
{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,            STR_018B_CLOSE_WINDOW },
{    WWT_CAPTION,   RESIZE_NONE,     7,    11,    73,     0,    13, STR_A000_AIRPORTS,   STR_018C_WINDOW_TITLE_DRAG_THIS },
{  WWT_STICKYBOX,   RESIZE_NONE,     7,    74,    85,     0,    13, 0x0,                 STR_STICKY_BUTTON },
{      WWT_PANEL,   RESIZE_NONE,     7,     0,    41,    14,    35, 0x2E8,               STR_A01E_BUILD_AIRPORT },
{      WWT_PANEL,   RESIZE_NONE,     7,    42,    63,    14,    35, 0x2BF,               STR_018D_DEMOLISH_BUILDINGS_ETC },
{      WWT_PANEL,   RESIZE_NONE,     7,    64,    85,    14,    35, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP },
{   WIDGETS_END},
};


static const WindowDesc _air_toolbar_desc = {
	640-86, 22, 86, 36,
	WC_BUILD_TOOLBAR,0,
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
	_air_toolbar_widgets,
	BuildAirToolbWndProc
};

void ShowBuildAirToolbar(void)
{
	if (_current_player == OWNER_SPECTATOR) return;
	DeleteWindowById(WC_BUILD_TOOLBAR, 0);
	AllocateWindowDescFront(&_air_toolbar_desc, 0);
	if (_patches.link_terraform_toolbar) ShowTerraformToolbar();
}

static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
{
	switch (e->event) {
	case WE_PAINT: {
		int sel;
		int rad = 4; // default catchment radious
		uint32 avail_airports;
		const AirportFTAClass *airport;

		if (WP(w,def_d).close) return;

		sel = _selected_airport_type;
		avail_airports = GetValidAirports();

		if (!HASBIT(avail_airports, 0) && sel == AT_SMALL) sel = AT_LARGE;
		if (!HASBIT(avail_airports, 1) && sel == AT_LARGE) sel = AT_SMALL;

		/* 'Country Airport' starts at widget 3, and if its bit is set, it is
		 * available, so take its opposite value to set the disabled_state. There
		 * are 9 buildable airports, so XOR with 0x01FF (1 1111 1111) */
		w->disabled_state = (avail_airports ^ 0x01FF) << 7;

		_selected_airport_type = sel;
		// select default the coverage area to 'Off' (16)
		w->click_state = ((1<<7) << sel) | ((1<<16) << _station_show_coverage);
		airport = GetAirport(sel);
		SetTileSelectSize(airport->size_x, airport->size_y);

		if (_patches.modified_catchment) {
			switch (sel) {
				case AT_OILRIG:        rad = CA_AIR_OILPAD;   break;
				case AT_HELIPORT:      rad = CA_AIR_HELIPORT; break;
				case AT_SMALL:         rad = CA_AIR_SMALL;    break;
				case AT_LARGE:         rad = CA_AIR_LARGE;    break;
				case AT_METROPOLITAN:  rad = CA_AIR_METRO;    break;
				case AT_INTERNATIONAL: rad = CA_AIR_INTER;    break;
				case AT_COMMUTER:      rad = CA_AIR_COMMUTER; break;
				case AT_HELIDEPOT:     rad = CA_AIR_HELIDEPOT; break;
				case AT_INTERCON:      rad = CA_AIR_INTERCON; break;
				case AT_HELISTATION:   rad = CA_AIR_HELISTATION; break;
			}
		}

		if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);

		DrawWindowWidgets(w);
		// strings such as 'Size' and 'Coverage Area'
		// 'Coverage Area'
		DrawStationCoverageAreaText(2, 206, (uint)-1, rad);
		break;
	}

	case WE_CLICK: {
		switch (e->click.widget) {
		case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
			_selected_airport_type = e->click.widget - 7;
			SndPlayFx(SND_15_BEEP);
			SetWindowDirty(w);
			break;
		case 16: case 17:
			_station_show_coverage = e->click.widget - 16;
			SndPlayFx(SND_15_BEEP);
			SetWindowDirty(w);
			break;
		}
	} break;

	case WE_MOUSELOOP: {
		if (WP(w,def_d).close) {
			DeleteWindow(w);
			return;
		}

		CheckRedrawStationCoverage(w);
	} break;

	case WE_DESTROY:
		if (!WP(w,def_d).close) ResetObjectToPlace();
		break;
	}
}

static const Widget _build_airport_picker_widgets[] = {
{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_3001_AIRPORT_SELECTION,       STR_018C_WINDOW_TITLE_DRAG_THIS},
{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    14,    52, 0x0,                              STR_NULL},
{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    53,    89, 0x0,                              STR_NULL},
{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,    90,   127, 0x0,                              STR_NULL},
{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,   128,   177, 0x0,                              STR_NULL},
{      WWT_PANEL,   RESIZE_NONE,     7,     0,   147,   178,   239, 0x0,                              STR_NULL},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,    27,    38, STR_SMALL_AIRPORT,                STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,    65,    76, STR_CITY_AIRPORT,                 STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,   141,   152, STR_HELIPORT,                     STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,    77,    88, STR_METRO_AIRPORT ,               STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,   103,   114, STR_INTERNATIONAL_AIRPORT,        STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,    39,    50, STR_COMMUTER_AIRPORT,             STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,   165,   176, STR_HELIDEPOT,                    STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,   115,   126, STR_INTERCONTINENTAL_AIRPORT,     STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{WWT_NODISTXTBTN,   RESIZE_NONE,    14,     2,   145,   153,   164, STR_HELISTATION,                  STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT},
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    73,   191,   202, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE},
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    74,   133,   191,   202, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},
{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    14,    27, STR_SMALL_AIRPORTS,               STR_NULL},
{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    52,    65, STR_LARGE_AIRPORTS,               STR_NULL},
{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    90,   103, STR_HUB_AIRPORTS,                 STR_NULL},
{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,   128,   141, STR_HELIPORTS,                    STR_NULL},
{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,   178,   191, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
{   WIDGETS_END},
};

static const WindowDesc _build_airport_desc = {
	-1, -1, 148, 240,
	WC_BUILD_STATION,WC_BUILD_TOOLBAR,
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
	_build_airport_picker_widgets,
	BuildAirportPickerWndProc
};

static void ShowBuildAirportPicker(void)
{
	AllocateWindowDesc(&_build_airport_desc);
}

void InitializeAirportGui(void)
{
	_selected_airport_type = AT_SMALL;
}