Changeset - r9229:429d19cc369c
[Not reviewed]
master
0 1 0
glx - 16 years ago 2008-05-14 22:52:12
glx@openttd.org
(svn r13095) -Codechange: make a class of the SelectPlayerLiveryWindow.
1 file changed with 90 insertions and 95 deletions:
0 comments (0 inline, 0 general)
src/player_gui.cpp
Show inline comments
 
@@ -242,364 +242,365 @@ static const WindowDesc _player_finances
 
 *
 
 * @pre is player a valid player
 
 */
 
static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied, int top, int left)
 
{
 
	if (!IsValidPlayer(player)) return;
 

	
 
	Window *w = AllocateWindowDescFront<Window>(show_small ? &_player_finances_small_desc : &_player_finances_desc, player);
 
	if (w != NULL) {
 
		w->caption_color = w->window_number;
 
		WP(w, def_d).data_1 = show_small;
 

	
 
		if (show_stickied) w->flags4 |= WF_STICKY;
 

	
 
		/* Check if repositioning from default is required */
 
		if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) {
 
			w->top = top;
 
			w->left = left;
 
		}
 
	}
 
}
 

	
 
void ShowPlayerFinances(PlayerID player)
 
{
 
	DoShowPlayerFinances(player, false, false);
 
}
 

	
 
/* List of colours for the livery window */
 
static const StringID _colour_dropdown[] = {
 
	STR_00D1_DARK_BLUE,
 
	STR_00D2_PALE_GREEN,
 
	STR_00D3_PINK,
 
	STR_00D4_YELLOW,
 
	STR_00D5_RED,
 
	STR_00D6_LIGHT_BLUE,
 
	STR_00D7_GREEN,
 
	STR_00D8_DARK_GREEN,
 
	STR_00D9_BLUE,
 
	STR_00DA_CREAM,
 
	STR_00DB_MAUVE,
 
	STR_00DC_PURPLE,
 
	STR_00DD_ORANGE,
 
	STR_00DE_BROWN,
 
	STR_00DF_GREY,
 
	STR_00E0_WHITE,
 
};
 

	
 
/* Association of liveries to livery classes */
 
static const LiveryClass livery_class[LS_END] = {
 
static const LiveryClass _livery_class[LS_END] = {
 
	LC_OTHER,
 
	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,
 
	LC_ROAD, LC_ROAD,
 
	LC_SHIP, LC_SHIP,
 
	LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
 
	LC_ROAD, LC_ROAD,
 
};
 

	
 
/* Number of liveries in each class, used to determine the height of the livery window */
 
static const byte livery_height[] = {
 
	1,
 
	13,
 
	4,
 
	2,
 
	3,
 
};
 

	
 
struct livery_d {
 
	uint32 sel;
 
	LiveryClass livery_class;
 
};
 
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(livery_d));
 

	
 

	
 
enum PlayerLiveryWindowWidgets {
 
	PLW_WIDGET_CLASS_GENERAL = 2,
 
	PLW_WIDGET_CLASS_RAIL,
 
	PLW_WIDGET_CLASS_ROAD,
 
	PLW_WIDGET_CLASS_SHIP,
 
	PLW_WIDGET_CLASS_AIRCRAFT,
 

	
 
	PLW_WIDGET_PRI_COL_DROPDOWN = 9,
 
	PLW_WIDGET_SEC_COL_DROPDOWN,
 
	PLW_WIDGET_MATRIX,
 
};
 

	
 
class DropDownListColourItem : public DropDownListItem {
 
public:
 
	DropDownListColourItem(int result, bool masked) : DropDownListItem(result, masked) {}
 

	
 
	virtual ~DropDownListColourItem() {}
 

	
 
	virtual StringID String() const
 
	{
 
		return _colour_dropdown[this->result];
 
	}
 

	
 
	virtual uint Height(uint width) const
 
	{
 
		return 14;
 
	}
 

	
 
	virtual void Draw(int x, int y, uint width, uint height, bool sel) const
 
	{
 
		DrawSprite(SPR_VEH_BUS_SIDE_VIEW, PALETTE_RECOLOR_START + this->result, x + 16, y + 7);
 
		DrawStringTruncated(x + 32, y + 3, this->String(), sel ? TC_WHITE : TC_BLACK, x + width - 30);
 
	}
 
};
 

	
 
static void ShowColourDropDownMenu(Window *w, uint32 widget)
 
struct SelectPlayerLiveryWindow : public Window {
 
private:
 
	uint32 sel;
 
	LiveryClass livery_class;
 

	
 
	enum PlayerLiveryWindowWidgets {
 
		PLW_WIDGET_CLOSE,
 
		PLW_WIDGET_CAPTION,
 
		PLW_WIDGET_CLASS_GENERAL,
 
		PLW_WIDGET_CLASS_RAIL,
 
		PLW_WIDGET_CLASS_ROAD,
 
		PLW_WIDGET_CLASS_SHIP,
 
		PLW_WIDGET_CLASS_AIRCRAFT,
 
		PLW_WIDGET_SPACER_CLASS,
 
		PLW_WIDGET_SPACER_DROPDOWN,
 
		PLW_WIDGET_PRI_COL_DROPDOWN,
 
		PLW_WIDGET_SEC_COL_DROPDOWN,
 
		PLW_WIDGET_MATRIX,
 
	};
 

	
 
	void ShowColourDropDownMenu(uint32 widget)
 
{
 
	uint32 used_colours = 0;
 
	const Livery *livery;
 
	LiveryScheme scheme;
 

	
 
	/* Disallow other player colours for the primary colour */
 
	if (HasBit(WP(w, livery_d).sel, LS_DEFAULT) && widget == PLW_WIDGET_PRI_COL_DROPDOWN) {
 
		if (HasBit(this->sel, LS_DEFAULT) && widget == PLW_WIDGET_PRI_COL_DROPDOWN) {
 
		const Player *p;
 
		FOR_ALL_PLAYERS(p) {
 
			if (p->is_active && p->index != _local_player) SetBit(used_colours, p->player_color);
 
		}
 
	}
 

	
 
	/* Get the first selected livery to use as the default dropdown item */
 
	for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
 
		if (HasBit(WP(w, livery_d).sel, scheme)) break;
 
			if (HasBit(this->sel, scheme)) break;
 
	}
 
	if (scheme == LS_END) scheme = LS_DEFAULT;
 
	livery = &GetPlayer((PlayerID)w->window_number)->livery[scheme];
 
		livery = &GetPlayer((PlayerID)this->window_number)->livery[scheme];
 

	
 
	DropDownList *list = new DropDownList();
 
	for (uint i = 0; i < lengthof(_colour_dropdown); i++) {
 
		list->push_back(new DropDownListColourItem(i, HasBit(used_colours, i)));
 
	}
 

	
 
	ShowDropDownList(w, list, widget == PLW_WIDGET_PRI_COL_DROPDOWN ? livery->colour1 : livery->colour2, widget);
 
		ShowDropDownList(this, list, widget == PLW_WIDGET_PRI_COL_DROPDOWN ? livery->colour1 : livery->colour2, widget);
 
}
 

	
 
static void SelectPlayerLiveryWndProc(Window *w, WindowEvent *e)
 
public:
 
	SelectPlayerLiveryWindow(const WindowDesc *desc, PlayerID player) : Window(desc, player)
 
{
 
	switch (e->event) {
 
		case WE_CREATE:
 
			w->LowerWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
 
		this->caption_color = player;
 
		this->livery_class = LC_OTHER;
 
		this->sel = 1;
 
		this->LowerWidget(PLW_WIDGET_CLASS_GENERAL);
 
			if (!_loaded_newgrf_features.has_2CC) {
 
				w->HideWidget(PLW_WIDGET_SEC_COL_DROPDOWN);
 
			this->HideWidget(PLW_WIDGET_SEC_COL_DROPDOWN);
 
		}
 
		this->FindWindowPlacementAndResize(desc);
 
			}
 
			break;
 

	
 
		case WE_PAINT: {
 
			const Player *p = GetPlayer((PlayerID)w->window_number);
 
	virtual void OnPaint()
 
	{
 
		const Player *p = GetPlayer((PlayerID)this->window_number);
 
			LiveryScheme scheme = LS_DEFAULT;
 
			int y = 51;
 

	
 
			/* Disable dropdown controls if no scheme is selected */
 
			w->SetWidgetDisabledState(PLW_WIDGET_PRI_COL_DROPDOWN, (WP(w, livery_d).sel == 0));
 
			w->SetWidgetDisabledState(PLW_WIDGET_SEC_COL_DROPDOWN, (WP(w, livery_d).sel == 0));
 
		this->SetWidgetDisabledState(PLW_WIDGET_PRI_COL_DROPDOWN, this->sel == 0);
 
		this->SetWidgetDisabledState(PLW_WIDGET_SEC_COL_DROPDOWN, this->sel == 0);
 

	
 
			if (!(WP(w, livery_d).sel == 0)) {
 
		if (this->sel != 0) {
 
				for (scheme = LS_BEGIN; scheme < LS_END; scheme++) {
 
					if (HasBit(WP(w, livery_d).sel, scheme)) break;
 
				if (HasBit(this->sel, scheme)) break;
 
				}
 
				if (scheme == LS_END) scheme = LS_DEFAULT;
 
			}
 

	
 
			SetDParam(0, STR_00D1_DARK_BLUE + p->livery[scheme].colour1);
 
			SetDParam(1, STR_00D1_DARK_BLUE + p->livery[scheme].colour2);
 

	
 
			DrawWindowWidgets(w);
 
		DrawWindowWidgets(this);
 

	
 
			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
 
				if (livery_class[scheme] == WP(w, livery_d).livery_class) {
 
					bool sel = HasBit(WP(w, livery_d).sel, scheme) != 0;
 
			if (_livery_class[scheme] == this->livery_class) {
 
				bool sel = HasBit(this->sel, scheme) != 0;
 

	
 
					if (scheme != LS_DEFAULT) {
 
						DrawSprite(p->livery[scheme].in_use ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, 2, y);
 
					}
 

	
 
					DrawString(15, y, STR_LIVERY_DEFAULT + scheme, sel ? TC_WHITE : TC_BLACK);
 

	
 
					DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour1), 152, y);
 
					DrawString(165, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour1, sel ? TC_WHITE : TC_GOLD);
 

	
 
					if (_loaded_newgrf_features.has_2CC) {
 
						DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour2), 277, y);
 
						DrawString(290, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour2, sel ? TC_WHITE : TC_GOLD);
 
					}
 

	
 
					y += 14;
 
				}
 
			}
 
			break;
 
		}
 

	
 
		case WE_CLICK: {
 
			switch (e->we.click.widget) {
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		/* Number of liveries in each class, used to determine the height of the livery window */
 
		static const byte livery_height[] = {
 
			1,
 
			13,
 
			4,
 
			2,
 
			3,
 
		};
 

	
 
		switch (widget) {
 
				/* Livery Class buttons */
 
				case PLW_WIDGET_CLASS_GENERAL:
 
				case PLW_WIDGET_CLASS_RAIL:
 
				case PLW_WIDGET_CLASS_ROAD:
 
				case PLW_WIDGET_CLASS_SHIP:
 
				case PLW_WIDGET_CLASS_AIRCRAFT: {
 
					LiveryScheme scheme;
 

	
 
					w->RaiseWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
 
					WP(w, livery_d).livery_class = (LiveryClass)(e->we.click.widget - PLW_WIDGET_CLASS_GENERAL);
 
					WP(w, livery_d).sel = 0;
 
					w->LowerWidget(WP(w, livery_d).livery_class + PLW_WIDGET_CLASS_GENERAL);
 
				this->RaiseWidget(this->livery_class + PLW_WIDGET_CLASS_GENERAL);
 
				this->livery_class = (LiveryClass)(widget - PLW_WIDGET_CLASS_GENERAL);
 
				this->sel = 0;
 
				this->LowerWidget(this->livery_class + PLW_WIDGET_CLASS_GENERAL);
 

	
 
					/* Select the first item in the list */
 
					for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
 
						if (livery_class[scheme] == WP(w, livery_d).livery_class) {
 
							WP(w, livery_d).sel = 1 << scheme;
 
					if (_livery_class[scheme] == this->livery_class) {
 
						this->sel = 1 << scheme;
 
							break;
 
						}
 
					}
 
					w->height = 49 + livery_height[WP(w, livery_d).livery_class] * 14;
 
					w->widget[PLW_WIDGET_MATRIX].bottom = w->height - 1;
 
					w->widget[PLW_WIDGET_MATRIX].data = livery_height[WP(w, livery_d).livery_class] << 8 | 1;
 
				this->height = 49 + livery_height[this->livery_class] * 14;
 
				this->widget[PLW_WIDGET_MATRIX].bottom = this->height - 1;
 
				this->widget[PLW_WIDGET_MATRIX].data = livery_height[this->livery_class] << 8 | 1;
 
					MarkWholeScreenDirty();
 
					break;
 
				}
 

	
 
				case PLW_WIDGET_PRI_COL_DROPDOWN: /* First colour dropdown */
 
					ShowColourDropDownMenu(w, PLW_WIDGET_PRI_COL_DROPDOWN);
 
				ShowColourDropDownMenu(PLW_WIDGET_PRI_COL_DROPDOWN);
 
					break;
 

	
 
				case PLW_WIDGET_SEC_COL_DROPDOWN: /* Second colour dropdown */
 
					ShowColourDropDownMenu(w, PLW_WIDGET_SEC_COL_DROPDOWN);
 
				ShowColourDropDownMenu(PLW_WIDGET_SEC_COL_DROPDOWN);
 
					break;
 

	
 
				case PLW_WIDGET_MATRIX: {
 
					LiveryScheme scheme;
 
					LiveryScheme j = (LiveryScheme)((e->we.click.pt.y - 48) / 14);
 
				LiveryScheme j = (LiveryScheme)((pt.y - 48) / 14);
 

	
 
					for (scheme = LS_BEGIN; scheme <= j; scheme++) {
 
						if (livery_class[scheme] != WP(w, livery_d).livery_class) j++;
 
					if (_livery_class[scheme] != this->livery_class) j++;
 
						if (scheme >= LS_END) return;
 
					}
 
					if (j >= LS_END) return;
 

	
 
					/* If clicking on the left edge, toggle using the livery */
 
					if (e->we.click.pt.x < 10) {
 
						DoCommandP(0, j | (2 << 8), !GetPlayer((PlayerID)w->window_number)->livery[j].in_use, NULL, CMD_SET_PLAYER_COLOR);
 
				if (pt.x < 10) {
 
					DoCommandP(0, j | (2 << 8), !GetPlayer((PlayerID)this->window_number)->livery[j].in_use, NULL, CMD_SET_PLAYER_COLOR);
 
					}
 

	
 
					if (_ctrl_pressed) {
 
						ToggleBit(WP(w, livery_d).sel, j);
 
					ToggleBit(this->sel, j);
 
					} else {
 
						WP(w, livery_d).sel = 1 << j;
 
					}
 
					w->SetDirty();
 
					break;
 
				}
 
			}
 
			break;
 
					this->sel = 1 << j;
 
		}
 

	
 
		case WE_DROPDOWN_SELECT: {
 
			LiveryScheme scheme;
 

	
 
			for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
 
				if (HasBit(WP(w, livery_d).sel, scheme)) {
 
					DoCommandP(0, scheme | (e->we.dropdown.button == PLW_WIDGET_PRI_COL_DROPDOWN ? 0 : 256), e->we.dropdown.index, NULL, CMD_SET_PLAYER_COLOR);
 
				}
 
			}
 
				this->SetDirty();
 
			break;
 
		}
 
	}
 
}
 

	
 
	virtual void OnDropdownSelect(int widget, int index)
 
	{
 
		for (LiveryScheme scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
 
			if (HasBit(this->sel, scheme)) {
 
				DoCommandP(0, scheme | (widget == PLW_WIDGET_PRI_COL_DROPDOWN ? 0 : 256), index, NULL, CMD_SET_PLAYER_COLOR);
 
			}
 
		}
 
	}
 
};
 

	
 
static const Widget _select_player_livery_2cc_widgets[] = {
 
{ WWT_CLOSEBOX, RESIZE_NONE, 14,   0,  10,   0,  13, STR_00C5,                  STR_018B_CLOSE_WINDOW },
 
{  WWT_CAPTION, RESIZE_NONE, 14,  11, 399,   0,  13, STR_7007_NEW_COLOR_SCHEME, STR_018C_WINDOW_TITLE_DRAG_THIS },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,   0,  21,  14,  35, SPR_IMG_COMPANY_GENERAL,   STR_LIVERY_GENERAL_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  22,  43,  14,  35, SPR_IMG_TRAINLIST,         STR_LIVERY_TRAIN_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
 
{    WWT_PANEL, RESIZE_NONE, 14, 110, 399,  14,  35, 0x0,                       STR_NULL },
 
{    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
 
{ WWT_DROPDOWN, RESIZE_NONE, 14, 150, 274,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
 
{ WWT_DROPDOWN, RESIZE_NONE, 14, 275, 399,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
 
{   WWT_MATRIX, RESIZE_NONE, 14,   0, 399,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
 
{ WIDGETS_END },
 
};
 

	
 
static const WindowDesc _select_player_livery_2cc_desc = {
 
	WDP_AUTO, WDP_AUTO, 400, 49 + 1 * 14, 400, 49 + 1 * 14,
 
	WC_PLAYER_COLOR, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 
	_select_player_livery_2cc_widgets,
 
	SelectPlayerLiveryWndProc
 
	NULL
 
};
 

	
 

	
 
static const Widget _select_player_livery_widgets[] = {
 
{ WWT_CLOSEBOX, RESIZE_NONE, 14,   0,  10,   0,  13, STR_00C5,                  STR_018B_CLOSE_WINDOW },
 
{  WWT_CAPTION, RESIZE_NONE, 14,  11, 274,   0,  13, STR_7007_NEW_COLOR_SCHEME, STR_018C_WINDOW_TITLE_DRAG_THIS },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,   0,  21,  14,  35, SPR_IMG_COMPANY_GENERAL,   STR_LIVERY_GENERAL_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  22,  43,  14,  35, SPR_IMG_TRAINLIST,         STR_LIVERY_TRAIN_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  44,  65,  14,  35, SPR_IMG_TRUCKLIST,         STR_LIVERY_ROADVEH_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  66,  87,  14,  35, SPR_IMG_SHIPLIST,          STR_LIVERY_SHIP_TIP },
 
{   WWT_IMGBTN, RESIZE_NONE, 14,  88, 109,  14,  35, SPR_IMG_AIRPLANESLIST,     STR_LIVERY_AIRCRAFT_TIP },
 
{    WWT_PANEL, RESIZE_NONE, 14, 110, 274,  14,  35, 0x0,                       STR_NULL },
 
{    WWT_PANEL, RESIZE_NONE, 14,   0, 149,  36,  47, 0x0,                       STR_NULL },
 
{ WWT_DROPDOWN, RESIZE_NONE, 14, 150, 274,  36,  47, STR_02BD,                  STR_LIVERY_PRIMARY_TIP },
 
{ WWT_DROPDOWN, RESIZE_NONE, 14, 275, 275,  36,  47, STR_02E1,                  STR_LIVERY_SECONDARY_TIP },
 
{   WWT_MATRIX, RESIZE_NONE, 14,   0, 274,  48,  48 + 1 * 14, (1 << 8) | 1,     STR_LIVERY_PANEL_TIP },
 
{ WIDGETS_END },
 
};
 

	
 
static const WindowDesc _select_player_livery_desc = {
 
	WDP_AUTO, WDP_AUTO, 275, 49 + 1 * 14, 275, 49 + 1 * 14,
 
	WC_PLAYER_COLOR, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
 
	_select_player_livery_widgets,
 
	SelectPlayerLiveryWndProc
 
	NULL
 
};
 

	
 
/**
 
 * Draws the face of a player.
 
 * @param pf    the player's face
 
 * @param color the (background) color of the gradient
 
 * @param x     x-position to draw the face
 
 * @param y     y-position to draw the face
 
 */
 
void DrawPlayerFace(PlayerFace pf, int color, int x, int y)
 
{
 
	GenderEthnicity ge = (GenderEthnicity)GetPlayerFaceBits(pf, PFV_GEN_ETHN, GE_WM);
 

	
 
	bool has_moustache   = !HasBit(ge, GENDER_FEMALE) && GetPlayerFaceBits(pf, PFV_HAS_MOUSTACHE,   ge) != 0;
 
	bool has_tie_earring = !HasBit(ge, GENDER_FEMALE) || GetPlayerFaceBits(pf, PFV_HAS_TIE_EARRING, ge) != 0;
 
	bool has_glasses     = GetPlayerFaceBits(pf, PFV_HAS_GLASSES, ge) != 0;
 
	SpriteID pal;
 

	
 
	/* Modify eye colour palette only if 2 or more valid values exist */
 
	if (_pf_info[PFV_EYE_COLOUR].valid_values[ge] < 2) {
 
		pal = PAL_NONE;
 
	} else {
 
		switch (GetPlayerFaceBits(pf, PFV_EYE_COLOUR, ge)) {
 
			default: NOT_REACHED();
 
			case 0: pal = PALETTE_TO_BROWN; break;
 
			case 1: pal = PALETTE_TO_BLUE;  break;
 
			case 2: pal = PALETTE_TO_GREEN; break;
 
		}
 
	}
 

	
 
	/* Draw the gradient (background) */
 
	DrawSprite(SPR_GRADIENT, GENERAL_SPRITE_COLOR(color), x, y);
 

	
 
	for (PlayerFaceVariable pfv = PFV_CHEEKS; pfv < PFV_END; pfv++) {
 
		switch (pfv) {
 
			case PFV_MOUSTACHE:   if (!has_moustache)   continue; break;
 
			case PFV_LIPS:        /* FALL THROUGH */
 
			case PFV_NOSE:        if (has_moustache)    continue; break;
 
			case PFV_TIE_EARRING: if (!has_tie_earring) continue; break;
 
			case PFV_GLASSES:     if (!has_glasses)     continue; break;
 
			default: break;
 
		}
 
		DrawSprite(GetPlayerFaceSprite(pf, pfv, ge), (pfv == PFV_EYEBROWS) ? pal : PAL_NONE, x, y);
 
	}
 
}
 

	
 
/** Widget description for the normal/simple player face selection dialog */
 
static const Widget _select_player_face_widgets[] = {
 
@@ -1205,106 +1206,100 @@ static void PlayerCompanyWndProc(Window 
 
					/* If the player doesn't own any shares, disable sell button */
 
					w->SetWidgetDisabledState(PCW_WIDGET_SELL_SHARE, (GetAmountOwnedBy(p, _local_player) == 0) ||
 
							/* Spectators cannot do anything of course */
 
							_local_player == PLAYER_SPECTATOR);
 
				} else { // Shares are not allowed, disable buy/sell buttons
 
					w->DisableWidget(PCW_WIDGET_BUY_SHARE);
 
					w->DisableWidget(PCW_WIDGET_SELL_SHARE);
 
				}
 
			}
 

	
 
			SetDParam(0, p->index);
 
			SetDParam(1, p->index);
 

	
 
			DrawWindowWidgets(w);
 

	
 
			/* Player face */
 
			DrawPlayerFace(p->face, p->player_color, 2, 16);
 

	
 
			/* "xxx (Manager)" */
 
			SetDParam(0, p->index);
 
			DrawStringMultiCenter(48, 141, STR_7037_PRESIDENT, 94);
 

	
 
			/* "Inaugurated:" */
 
			SetDParam(0, p->inaugurated_year);
 
			DrawString(110, 23, STR_7038_INAUGURATED, TC_FROMSTRING);
 

	
 
			/* "Colour scheme:" */
 
			DrawString(110, 43, STR_7006_COLOR_SCHEME, TC_FROMSTRING);
 
			/* Draw company-colour bus */
 
			DrawSprite(SPR_VEH_BUS_SW_VIEW, PLAYER_SPRITE_COLOR(p->index), 215, 44);
 

	
 
			/* "Vehicles:" */
 
			DrawPlayerVehiclesAmount((PlayerID)w->window_number);
 

	
 
			/* "Company value:" */
 
			SetDParam(0, CalculateCompanyValue(p));
 
			DrawString(110, 106, STR_7076_COMPANY_VALUE, TC_FROMSTRING);
 

	
 
			/* Shares list */
 
			DrawCompanyOwnerText(p);
 

	
 
			break;
 
		}
 

	
 
		case WE_CLICK:
 
			switch (e->we.click.widget) {
 
				case PCW_WIDGET_NEW_FACE: DoSelectPlayerFace((PlayerID)w->window_number, false); break;
 

	
 
				case PCW_WIDGET_COLOR_SCHEME: {
 
					Window *wf = AllocateWindowDescFront<Window>(_loaded_newgrf_features.has_2CC ? &_select_player_livery_2cc_desc : &_select_player_livery_desc, w->window_number);
 
					if (wf != NULL) {
 
						wf->caption_color = wf->window_number;
 
						WP(wf, livery_d).livery_class = LC_OTHER;
 
						WP(wf, livery_d).sel = 1;
 
						wf->LowerWidget(2);
 
					}
 
				case PCW_WIDGET_COLOR_SCHEME:
 
					if (BringWindowToFrontById(WC_PLAYER_COLOR, w->window_number)) break;
 
					new SelectPlayerLiveryWindow(_loaded_newgrf_features.has_2CC ? &_select_player_livery_2cc_desc : &_select_player_livery_desc, (PlayerID)w->window_number);
 
					break;
 
				}
 

	
 
				case PCW_WIDGET_PRESIDENT_NAME: {
 
					const Player *p = GetPlayer((PlayerID)w->window_number);
 
					WP(w, def_d).byte_1 = 0;
 
					SetDParam(0, p->index);
 
					ShowQueryString(STR_PLAYER_NAME, STR_700B_PRESIDENT_S_NAME, 31, 94, w, CS_ALPHANUMERAL);
 
					break;
 
				}
 

	
 
				case PCW_WIDGET_COMPANY_NAME: {
 
					Player *p = GetPlayer((PlayerID)w->window_number);
 
					WP(w, def_d).byte_1 = 1;
 
					SetDParam(0, p->index);
 
					ShowQueryString(STR_COMPANY_NAME, STR_700A_COMPANY_NAME, 31, 150, w, CS_ALPHANUMERAL);
 
					break;
 
				}
 

	
 
				case PCW_WIDGET_BUILD_VIEW_HQ: {
 
					TileIndex tile = GetPlayer((PlayerID)w->window_number)->location_of_house;
 
					if (tile == 0) {
 
						if ((byte)w->window_number != _local_player)
 
							return;
 
						SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, VHM_RECT, w);
 
						SetTileSelectSize(2, 2);
 
						w->LowerWidget(PCW_WIDGET_BUILD_VIEW_HQ);
 
						w->InvalidateWidget(PCW_WIDGET_BUILD_VIEW_HQ);
 
					} else {
 
						if (_ctrl_pressed) {
 
							ShowExtraViewPortWindow(tile);
 
						} else {
 
							ScrollMainWindowToTile(tile);
 
						}
 
					}
 
					break;
 
				}
 

	
 
				case PCW_WIDGET_RELOCATE_HQ:
 
					SetObjectToPlaceWnd(SPR_CURSOR_HQ, PAL_NONE, VHM_RECT, w);
 
					SetTileSelectSize(2, 2);
 
					w->LowerWidget(PCW_WIDGET_RELOCATE_HQ);
 
					w->InvalidateWidget(PCW_WIDGET_RELOCATE_HQ);
 
					break;
 

	
 
				case PCW_WIDGET_BUY_SHARE:
 
					DoCommandP(0, w->window_number, 0, NULL, CMD_BUY_SHARE_IN_COMPANY | CMD_MSG(STR_707B_CAN_T_BUY_25_SHARE_IN_THIS));
 
					break;
 

	
 
				case PCW_WIDGET_SELL_SHARE:
0 comments (0 inline, 0 general)