src/player_gui.cpp
branchnoai
changeset 9724 b39bc69bb2f2
parent 9723 eee46cb39750
child 9732 f8eb3e208514
equal deleted inserted replaced
9723:eee46cb39750 9724:b39bc69bb2f2
     2 
     2 
     3 /** @file player_gui.cpp */
     3 /** @file player_gui.cpp */
     4 
     4 
     5 #include "stdafx.h"
     5 #include "stdafx.h"
     6 #include "openttd.h"
     6 #include "openttd.h"
     7 #include "table/sprites.h"
       
     8 #include "table/strings.h"
       
     9 #include "gui.h"
     7 #include "gui.h"
    10 #include "window_gui.h"
     8 #include "window_gui.h"
    11 #include "textbuf_gui.h"
     9 #include "textbuf_gui.h"
    12 #include "viewport_func.h"
    10 #include "viewport_func.h"
    13 #include "gfx_func.h"
    11 #include "gfx_func.h"
    14 #include "player.h"
    12 #include "player_func.h"
       
    13 #include "player_base.h"
    15 #include "command_func.h"
    14 #include "command_func.h"
    16 #include "network/network.h"
    15 #include "network/network.h"
    17 #include "variables.h"
    16 #include "variables.h"
    18 #include "roadveh.h"
    17 #include "roadveh.h"
    19 #include "train.h"
    18 #include "train.h"
    26 #include "strings_func.h"
    25 #include "strings_func.h"
    27 #include "functions.h"
    26 #include "functions.h"
    28 #include "window_func.h"
    27 #include "window_func.h"
    29 #include "date_func.h"
    28 #include "date_func.h"
    30 #include "string_func.h"
    29 #include "string_func.h"
       
    30 #include "settings_type.h"
       
    31 #include "widgets/dropdown_func.h"
       
    32 
       
    33 #include "table/sprites.h"
       
    34 #include "table/strings.h"
       
    35 
       
    36 /* player face selection window */
       
    37 struct facesel_d {
       
    38 	PlayerFace face; // player face bits
       
    39 	bool advanced;   // advance player face selection window
       
    40 };
       
    41 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(facesel_d));
    31 
    42 
    32 static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied);
    43 static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied);
    33 static void DoSelectPlayerFace(PlayerID player, bool show_big);
    44 static void DoSelectPlayerFace(PlayerID player, bool show_big);
    34 
    45 
    35 static void DrawPlayerEconomyStats(const Player *p, byte mode)
    46 static void DrawPlayerEconomyStats(const Player *p, byte mode)
   106 
   117 
   107 	SetDParam(0, p->player_money - p->current_loan);
   118 	SetDParam(0, p->player_money - p->current_loan);
   108 	DrawStringRightAligned(182, y, STR_7028, TC_FROMSTRING);
   119 	DrawStringRightAligned(182, y, STR_7028, TC_FROMSTRING);
   109 }
   120 }
   110 
   121 
       
   122 enum PlayerFinancesWindowWidgets {
       
   123 	PFW_WIDGET_TOGGLE_SIZE   = 2,
       
   124 	PFW_WIDGET_INCREASE_LOAN = 6,
       
   125 	PFW_WIDGET_REPAY_LOAN    = 7,
       
   126 };
       
   127 
   111 static const Widget _player_finances_widgets[] = {
   128 static const Widget _player_finances_widgets[] = {
   112 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,               STR_018B_CLOSE_WINDOW},
   129 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,               STR_018B_CLOSE_WINDOW},
   113 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   379,     0,    13, STR_700E_FINANCES,      STR_018C_WINDOW_TITLE_DRAG_THIS},
   130 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   379,     0,    13, STR_700E_FINANCES,      STR_018C_WINDOW_TITLE_DRAG_THIS},
   114 {     WWT_IMGBTN,   RESIZE_NONE,    14,   380,   394,     0,    13, SPR_LARGE_SMALL_WINDOW, STR_7075_TOGGLE_LARGE_SMALL_WINDOW},
   131 {     WWT_IMGBTN,   RESIZE_NONE,    14,   380,   394,     0,    13, SPR_LARGE_SMALL_WINDOW, STR_7075_TOGGLE_LARGE_SMALL_WINDOW},
   115 {  WWT_STICKYBOX,   RESIZE_NONE,    14,   395,   406,     0,    13, 0x0,                    STR_STICKY_BUTTON},
   132 {  WWT_STICKYBOX,   RESIZE_NONE,    14,   395,   406,     0,    13, 0x0,                    STR_STICKY_BUTTON},
   146 			/* Make window dirty before and after resizing */
   163 			/* Make window dirty before and after resizing */
   147 			SetWindowDirty(w);
   164 			SetWindowDirty(w);
   148 			w->height = new_height;
   165 			w->height = new_height;
   149 			SetWindowDirty(w);
   166 			SetWindowDirty(w);
   150 
   167 
   151 			w->SetWidgetHiddenState(6, player != _local_player);
   168 			w->SetWidgetHiddenState(PFW_WIDGET_INCREASE_LOAN, player != _local_player);
   152 			w->SetWidgetHiddenState(7, player != _local_player);
   169 			w->SetWidgetHiddenState(PFW_WIDGET_REPAY_LOAN,    player != _local_player);
   153 		}
   170 		}
   154 
   171 
   155 		/* Borrow button only shows when there is any more money to loan */
   172 		/* Borrow button only shows when there is any more money to loan */
   156 		w->SetWidgetDisabledState(6, p->current_loan == _economy.max_loan);
   173 		w->SetWidgetDisabledState(PFW_WIDGET_INCREASE_LOAN, p->current_loan == _economy.max_loan);
   157 
   174 
   158 		/* Repay button only shows when there is any more money to repay */
   175 		/* Repay button only shows when there is any more money to repay */
   159 		w->SetWidgetDisabledState(7, player != _local_player || p->current_loan == 0);
   176 		w->SetWidgetDisabledState(PFW_WIDGET_REPAY_LOAN, player != _local_player || p->current_loan == 0);
   160 
   177 
   161 		SetDParam(0, p->index);
   178 		SetDParam(0, p->index);
   162 		SetDParam(1, p->index);
   179 		SetDParam(1, p->index);
   163 		SetDParam(2, LOAN_INTERVAL);
   180 		SetDParam(2, LOAN_INTERVAL);
   164 		DrawWindowWidgets(w);
   181 		DrawWindowWidgets(w);
   166 		DrawPlayerEconomyStats(p, (byte)WP(w, def_d).data_1);
   183 		DrawPlayerEconomyStats(p, (byte)WP(w, def_d).data_1);
   167 	} break;
   184 	} break;
   168 
   185 
   169 	case WE_CLICK:
   186 	case WE_CLICK:
   170 		switch (e->we.click.widget) {
   187 		switch (e->we.click.widget) {
   171 		case 2: {/* toggle size */
   188 		case PFW_WIDGET_TOGGLE_SIZE: {/* toggle size */
   172 			byte mode = (byte)WP(w, def_d).data_1;
   189 			byte mode = (byte)WP(w, def_d).data_1;
   173 			bool stickied = !!(w->flags4 & WF_STICKY);
   190 			bool stickied = !!(w->flags4 & WF_STICKY);
   174 			PlayerID player = (PlayerID)w->window_number;
   191 			PlayerID player = (PlayerID)w->window_number;
   175 			DeleteWindow(w);
   192 			DeleteWindow(w);
   176 			DoShowPlayerFinances(player, !HasBit(mode, 0), stickied);
   193 			DoShowPlayerFinances(player, !HasBit(mode, 0), stickied);
   177 		} break;
   194 		} break;
   178 
   195 
   179 		case 6: /* increase loan */
   196 		case PFW_WIDGET_INCREASE_LOAN: /* increase loan */
   180 			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY));
   197 			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY));
   181 			break;
   198 			break;
   182 
   199 
   183 		case 7: /* repay loan */
   200 		case PFW_WIDGET_REPAY_LOAN: /* repay loan */
   184 			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_DECREASE_LOAN | CMD_MSG(STR_702F_CAN_T_REPAY_LOAN));
   201 			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_DECREASE_LOAN | CMD_MSG(STR_702F_CAN_T_REPAY_LOAN));
   185 			break;
   202 			break;
   186 		}
   203 		}
   187 		break;
   204 		break;
   188 	}
   205 	}
   243 };
   260 };
   244 
   261 
   245 /* Association of liveries to livery classes */
   262 /* Association of liveries to livery classes */
   246 static const LiveryClass livery_class[LS_END] = {
   263 static const LiveryClass livery_class[LS_END] = {
   247 	LC_OTHER,
   264 	LC_OTHER,
   248 	LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL,
   265 	LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL,
   249 	LC_ROAD, LC_ROAD,
   266 	LC_ROAD, LC_ROAD,
   250 	LC_SHIP, LC_SHIP,
   267 	LC_SHIP, LC_SHIP,
   251 	LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
   268 	LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
   252 	LC_ROAD, LC_ROAD,
   269 	LC_ROAD, LC_ROAD,
   253 };
   270 };
   254 
   271 
   255 /* Number of liveries in each class, used to determine the height of the livery window */
   272 /* Number of liveries in each class, used to determine the height of the livery window */
   256 static const byte livery_height[] = {
   273 static const byte livery_height[] = {
   257 	1,
   274 	1,
   258 	11,
   275 	13,
   259 	4,
   276 	4,
   260 	2,
   277 	2,
   261 	3,
   278 	3,
   262 };
   279 };
   263 
   280 
   265 	uint32 sel;
   282 	uint32 sel;
   266 	LiveryClass livery_class;
   283 	LiveryClass livery_class;
   267 };
   284 };
   268 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(livery_d));
   285 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(livery_d));
   269 
   286 
       
   287 
       
   288 enum PlayerLiveryWindowWidgets {
       
   289 	PLW_WIDGET_CLASS_GENERAL = 2,
       
   290 	PLW_WIDGET_CLASS_RAIL,
       
   291 	PLW_WIDGET_CLASS_ROAD,
       
   292 	PLW_WIDGET_CLASS_SHIP,
       
   293 	PLW_WIDGET_CLASS_AIRCRAFT,
       
   294 
       
   295 	PLW_WIDGET_PRI_COL_DROPDOWN = 9,
       
   296 	PLW_WIDGET_SEC_COL_DROPDOWN,
       
   297 	PLW_WIDGET_MATRIX,
       
   298 };
       
   299 
   270 static void ShowColourDropDownMenu(Window *w, uint32 widget)
   300 static void ShowColourDropDownMenu(Window *w, uint32 widget)
   271 {
   301 {
   272 	uint32 used_colours = 0;
   302 	uint32 used_colours = 0;
   273 	const Livery *livery;
   303 	const Livery *livery;
   274 	LiveryScheme scheme;
   304 	LiveryScheme scheme;
   275 
   305 
   276 	/* Disallow other player colours for the primary colour */
   306 	/* Disallow other player colours for the primary colour */
   277 	if (HasBit(WP(w, livery_d).sel, LS_DEFAULT) && widget == 10) {
   307 	if (HasBit(WP(w, livery_d).sel, LS_DEFAULT) && widget == PLW_WIDGET_PRI_COL_DROPDOWN) {
   278 		const Player *p;
   308 		const Player *p;
   279 		FOR_ALL_PLAYERS(p) {
   309 		FOR_ALL_PLAYERS(p) {
   280 			if (p->is_active && p->index != _local_player) SetBit(used_colours, p->player_color);
   310 			if (p->is_active && p->index != _local_player) SetBit(used_colours, p->player_color);
   281 		}
   311 		}
   282 	}
   312 	}
   286 		if (HasBit(WP(w, livery_d).sel, scheme)) break;
   316 		if (HasBit(WP(w, livery_d).sel, scheme)) break;
   287 	}
   317 	}
   288 	if (scheme == LS_END) scheme = LS_DEFAULT;
   318 	if (scheme == LS_END) scheme = LS_DEFAULT;
   289 	livery = &GetPlayer((PlayerID)w->window_number)->livery[scheme];
   319 	livery = &GetPlayer((PlayerID)w->window_number)->livery[scheme];
   290 
   320 
   291 	ShowDropDownMenu(w, _colour_dropdown, widget == 10 ? livery->colour1 : livery->colour2, widget, used_colours, 0);
   321 	ShowDropDownMenu(w, _colour_dropdown, widget == PLW_WIDGET_PRI_COL_DROPDOWN ? livery->colour1 : livery->colour2, widget, used_colours, 0);
   292 }
   322 }
   293 
   323 
   294 static void SelectPlayerLiveryWndProc(Window *w, WindowEvent *e)
   324 static void SelectPlayerLiveryWndProc(Window *w, WindowEvent *e)
   295 {
   325 {
   296 	switch (e->event) {
   326 	switch (e->event) {
   297 		case WE_CREATE:
   327 		case WE_CREATE:
   298 			w->LowerWidget(WP(w, livery_d).livery_class + 2);
   328 			w->LowerWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
   299 			if (!_loaded_newgrf_features.has_2CC) {
   329 			if (!_loaded_newgrf_features.has_2CC) {
   300 				w->HideWidget(11);
   330 				w->HideWidget(PLW_WIDGET_SEC_COL_DROPDOWN);
   301 				w->HideWidget(12);
       
   302 			}
   331 			}
   303 			break;
   332 			break;
   304 
   333 
   305 		case WE_PAINT: {
   334 		case WE_PAINT: {
   306 			const Player *p = GetPlayer((PlayerID)w->window_number);
   335 			const Player *p = GetPlayer((PlayerID)w->window_number);
   307 			LiveryScheme scheme = LS_DEFAULT;
   336 			LiveryScheme scheme = LS_DEFAULT;
   308 			int y = 51;
   337 			int y = 51;
   309 
   338 
   310 			/* Disable dropdown controls if no scheme is selected */
   339 			/* Disable dropdown controls if no scheme is selected */
   311 			w->SetWidgetDisabledState( 9, (WP(w, livery_d).sel == 0));
   340 			w->SetWidgetDisabledState(PLW_WIDGET_PRI_COL_DROPDOWN, (WP(w, livery_d).sel == 0));
   312 			w->SetWidgetDisabledState(10, (WP(w, livery_d).sel == 0));
   341 			w->SetWidgetDisabledState(PLW_WIDGET_SEC_COL_DROPDOWN, (WP(w, livery_d).sel == 0));
   313 			w->SetWidgetDisabledState(11, (WP(w, livery_d).sel == 0));
       
   314 			w->SetWidgetDisabledState(12, (WP(w, livery_d).sel == 0));
       
   315 
   342 
   316 			if (!(WP(w, livery_d).sel == 0)) {
   343 			if (!(WP(w, livery_d).sel == 0)) {
   317 				for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
   344 				for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
   318 					if (HasBit(WP(w, livery_d).sel, scheme)) break;
   345 					if (HasBit(WP(w, livery_d).sel, scheme)) break;
   319 				}
   346 				}
   350 		}
   377 		}
   351 
   378 
   352 		case WE_CLICK: {
   379 		case WE_CLICK: {
   353 			switch (e->we.click.widget) {
   380 			switch (e->we.click.widget) {
   354 				/* Livery Class buttons */
   381 				/* Livery Class buttons */
   355 				case 2:
   382 				case PLW_WIDGET_CLASS_GENERAL:
   356 				case 3:
   383 				case PLW_WIDGET_CLASS_RAIL:
   357 				case 4:
   384 				case PLW_WIDGET_CLASS_ROAD:
   358 				case 5:
   385 				case PLW_WIDGET_CLASS_SHIP:
   359 				case 6: {
   386 				case PLW_WIDGET_CLASS_AIRCRAFT: {
   360 					LiveryScheme scheme;
   387 					LiveryScheme scheme;
   361 
   388 
   362 					w->RaiseWidget(WP(w, livery_d).livery_class + 2);
   389 					w->RaiseWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
   363 					WP(w, livery_d).livery_class = (LiveryClass)(e->we.click.widget - 2);
   390 					WP(w, livery_d).livery_class = (LiveryClass)(e->we.click.widget - PLW_WIDGET_CLASS_GENERAL);
   364 					WP(w, livery_d).sel = 0;
   391 					WP(w, livery_d).sel = 0;
   365 					w->LowerWidget(WP(w, livery_d).livery_class + 2);
   392 					w->LowerWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
   366 
   393 
   367 					/* Select the first item in the list */
   394 					/* Select the first item in the list */
   368 					for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
   395 					for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
   369 						if (livery_class[scheme] == WP(w, livery_d).livery_class) {
   396 						if (livery_class[scheme] == WP(w, livery_d).livery_class) {
   370 							WP(w, livery_d).sel = 1 << scheme;
   397 							WP(w, livery_d).sel = 1 << scheme;
   371 							break;
   398 							break;
   372 						}
   399 						}
   373 					}
   400 					}
   374 					w->height = 49 + livery_height[WP(w, livery_d).livery_class] * 14;
   401 					w->height = 49 + livery_height[WP(w, livery_d).livery_class] * 14;
   375 					w->widget[13].bottom = w->height - 1;
   402 					w->widget[PLW_WIDGET_MATRIX].bottom = w->height - 1;
   376 					w->widget[13].data = livery_height[WP(w, livery_d).livery_class] << 8 | 1;
   403 					w->widget[PLW_WIDGET_MATRIX].data = livery_height[WP(w, livery_d).livery_class] << 8 | 1;
   377 					MarkWholeScreenDirty();
   404 					MarkWholeScreenDirty();
   378 					break;
   405 					break;
   379 				}
   406 				}
   380 
   407 
   381 				case 9:
   408 				case PLW_WIDGET_PRI_COL_DROPDOWN: /* First colour dropdown */
   382 				case 10: /* First colour dropdown */
   409 					ShowColourDropDownMenu(w, PLW_WIDGET_PRI_COL_DROPDOWN);
   383 					ShowColourDropDownMenu(w, 10);
   410 					break;
   384 					break;
   411 
   385 
   412 				case PLW_WIDGET_SEC_COL_DROPDOWN: /* Second colour dropdown */
   386 				case 11:
   413 					ShowColourDropDownMenu(w, PLW_WIDGET_SEC_COL_DROPDOWN);
   387 				case 12: /* Second colour dropdown */
   414 					break;
   388 					ShowColourDropDownMenu(w, 12);
   415 
   389 					break;
   416 				case PLW_WIDGET_MATRIX: {
   390 
       
   391 				case 13: {
       
   392 					LiveryScheme scheme;
   417 					LiveryScheme scheme;
   393 					LiveryScheme j = (LiveryScheme)((e->we.click.pt.y - 48) / 14);
   418 					LiveryScheme j = (LiveryScheme)((e->we.click.pt.y - 48) / 14);
   394 
   419 
   395 					for (scheme = LS_BEGIN; scheme <= j; scheme++) {
   420 					for (scheme = LS_BEGIN; scheme <= j; scheme++) {
   396 						if (livery_class[scheme] != WP(w, livery_d).livery_class) j++;
   421 						if (livery_class[scheme] != WP(w, livery_d).livery_class) j++;
   418 		case WE_DROPDOWN_SELECT: {
   443 		case WE_DROPDOWN_SELECT: {
   419 			LiveryScheme scheme;
   444 			LiveryScheme scheme;
   420 
   445 
   421 			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
   446 			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
   422 				if (HasBit(WP(w, livery_d).sel, scheme)) {
   447 				if (HasBit(WP(w, livery_d).sel, scheme)) {
   423 					DoCommandP(0, scheme | (e->we.dropdown.button == 10 ? 0 : 256), e->we.dropdown.index, NULL, CMD_SET_PLAYER_COLOR);
   448 					DoCommandP(0, scheme | (e->we.dropdown.button == PLW_WIDGET_PRI_COL_DROPDOWN ? 0 : 256), e->we.dropdown.index, NULL, CMD_SET_PLAYER_COLOR);
   424 				}
   449 				}
   425 			}
   450 			}
   426 			break;
   451 			break;
   427 		}
   452 		}
   428 	}
   453 	}
   436 {   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
   461 {   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
   437 {   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
   462 {   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
   438 {   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
   463 {   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
   439 {    WWT_PANEL, RESIZE_NONE, 14, 110, 399,  14,  35, 0x0,                       STR_NULL },
   464 {    WWT_PANEL, RESIZE_NONE, 14, 110, 399,  14,  35, 0x0,                       STR_NULL },
   440 {    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
   465 {    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
   441 {  WWT_TEXTBTN, RESIZE_NONE, 14, 150, 262,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
   466 { WWT_DROPDOWN, RESIZE_NONE, 14, 150, 274,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
   442 {  WWT_TEXTBTN, RESIZE_NONE, 14, 263, 274,  36,  47, STR_0225,                  STR_LIVERY_PRIMARY_TIP },
   467 { WWT_DROPDOWN, RESIZE_NONE, 14, 275, 399,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
   443 {  WWT_TEXTBTN, RESIZE_NONE, 14, 275, 387,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
       
   444 {  WWT_TEXTBTN, RESIZE_NONE, 14, 388, 399,  36,  47, STR_0225,                  STR_LIVERY_SECONDARY_TIP },
       
   445 {   WWT_MATRIX, RESIZE_NONE, 14,   0, 399,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
   468 {   WWT_MATRIX, RESIZE_NONE, 14,   0, 399,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
   446 { WIDGETS_END },
   469 { WIDGETS_END },
   447 };
   470 };
   448 
   471 
   449 static const WindowDesc _select_player_livery_2cc_desc = {
   472 static const WindowDesc _select_player_livery_2cc_desc = {
   463 {   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
   486 {   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
   464 {   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
   487 {   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
   465 {   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
   488 {   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
   466 {    WWT_PANEL, RESIZE_NONE, 14, 110, 274,  14,  35, 0x0,                       STR_NULL },
   489 {    WWT_PANEL, RESIZE_NONE, 14, 110, 274,  14,  35, 0x0,                       STR_NULL },
   467 {    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
   490 {    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
   468 {  WWT_TEXTBTN, RESIZE_NONE, 14, 150, 262,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
   491 { WWT_DROPDOWN, RESIZE_NONE, 14, 150, 274,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
   469 {  WWT_TEXTBTN, RESIZE_NONE, 14, 263, 274,  36,  47, STR_0225,                  STR_LIVERY_PRIMARY_TIP },
   492 { WWT_DROPDOWN, RESIZE_NONE, 14, 275, 275,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
   470 {  WWT_TEXTBTN, RESIZE_NONE, 14, 275, 275,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
       
   471 {  WWT_TEXTBTN, RESIZE_NONE, 14, 275, 275,  36,  47, STR_0225,                  STR_LIVERY_SECONDARY_TIP },
       
   472 {   WWT_MATRIX, RESIZE_NONE, 14,   0, 274,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
   493 {   WWT_MATRIX, RESIZE_NONE, 14,   0, 274,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
   473 { WIDGETS_END },
   494 { WIDGETS_END },
   474 };
   495 };
   475 
   496 
   476 static const WindowDesc _select_player_livery_desc = {
   497 static const WindowDesc _select_player_livery_desc = {