summaryrefslogtreecommitdiff
path: root/player_gui.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-09-15 12:27:00 +0000
committerpeter1138 <peter1138@openttd.org>2006-09-15 12:27:00 +0000
commit88d5472fe897edf77ea08be7488e06d342fedd3a (patch)
tree6be6ff0e643324d0e4e0cab08f87ce515f7152ca /player_gui.c
parentf9ea48bf3d0fe0c4a00313c45c31c73be614e210 (diff)
downloadopenttd-88d5472fe897edf77ea08be7488e06d342fedd3a.tar.xz
(svn r6455) - Feature: Add 2cc (two company colours) livery schemes. This replaces the original colour selection window and bumps the saveload version. Liveries are supported for all vehicles, not just those with 2cc support. Thanks to lakie for GUI inspiration.
Diffstat (limited to 'player_gui.c')
-rw-r--r--player_gui.c257
1 files changed, 202 insertions, 55 deletions
diff --git a/player_gui.c b/player_gui.c
index a0a4f0927..3041dc016 100644
--- a/player_gui.c
+++ b/player_gui.c
@@ -245,78 +245,223 @@ void ShowPlayerFinances(PlayerID player)
DoShowPlayerFinances(player, false, false);
}
-static void SelectPlayerColorWndProc(Window *w, WindowEvent *e)
+/* 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,
+ INVALID_STRING_ID
+};
+
+/* Association of liveries to livery classes */
+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_ROAD, LC_ROAD,
+ LC_SHIP, LC_SHIP,
+ LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
+};
+
+/* Number of liveries in each class, used to determine the height of the livery window */
+static const byte livery_height[] = {
+ 1,
+ 9,
+ 2,
+ 2,
+ 3,
+};
+
+typedef struct livery_d {
+ uint32 sel;
+ LiveryClass livery_class;
+} livery_d;
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(livery_d));
+
+static void ShowColourDropDownMenu(Window *w, uint32 widget)
{
- switch (e->event) {
- case WE_PAINT: {
- const Player *p;
- uint used_colors = 0;
- int num_free = 16;
- int x,y,pos;
- int i;
+ 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 == 10) {
+ const Player *p;
FOR_ALL_PLAYERS(p) {
- if (p->is_active) {
- SETBIT(used_colors, p->player_color);
- num_free--;
- }
+ if (p->is_active && p->index != _local_player) SETBIT(used_colours, p->player_color);
}
- WP(w,def_d).data_1 = used_colors;
- SetVScrollCount(w, num_free);
- DrawWindowWidgets(w);
+ }
+
+ /* Get the first selected livery to use as the default dropdown item */
+ for (scheme = 0; scheme < LS_END; scheme++) {
+ if (HASBIT(WP(w, livery_d).sel, scheme)) break;
+ }
+ if (scheme == LS_END) scheme = LS_DEFAULT;
+ livery = &GetPlayer(w->window_number)->livery[scheme];
+
+ ShowDropDownMenu(w, _colour_dropdown, widget == 10 ? livery->colour1 : livery->colour2, widget, used_colours, 0);
+}
+
+static void SelectPlayerLiveryWndProc(Window *w, WindowEvent *e)
+{
+ switch (e->event) {
+ case WE_PAINT: {
+ const Player *p = GetPlayer(w->window_number);
+ LiveryScheme scheme = LS_DEFAULT;
+ int y = 51;
+
+ if ((WP(w, livery_d).sel == 0)) {
+ /* Disable dropdown controls if no scheme is selected */
+ w->disabled_state = 1 << 9 | 1 << 10 | 1 << 11 | 1 << 12;
+ } else {
+ w->disabled_state = 0;
+ for (scheme = 0; scheme < LS_END; scheme++) {
+ if (HASBIT(WP(w, livery_d).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);
+
+ 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 (scheme != LS_DEFAULT) {
+ DrawSprite(p->livery[scheme].in_use ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, 2, y);
+ }
+
+ DrawString(15, y, STR_LIVERY_DEFAULT + scheme, sel ? 0xC : 0x10);
- x = 2;
- y = 17;
- pos = w->vscroll.pos;
+ DrawSprite(SPR_SQUARE | GENERAL_SPRITE_COLOR(p->livery[scheme].colour1) | PALETTE_MODIFIER_COLOR, 152, y);
+ DrawSprite(SPR_SQUARE | GENERAL_SPRITE_COLOR(p->livery[scheme].colour2) | PALETTE_MODIFIER_COLOR, 277, y);
- for (i = 0; i != 16; i++) {
- if (!(used_colors & 1) && --pos < 0 && pos >= -8) {
- DrawString(x + 30, y, STR_00D1_DARK_BLUE + i, 2);
- DrawSprite(GENERAL_SPRITE_COLOR(i) | PALETTE_MODIFIER_COLOR | SPR_VEH_BUS_SIDE_VIEW, x + 14, y + 4);
- y += 14;
+ DrawString(165, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour1, sel ? 0xC : 2);
+ DrawString(290, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour2, sel ? 0xC : 2);
+
+ y += 14;
+ }
}
- used_colors >>= 1;
+ break;
}
- } break;
- case WE_CLICK:
- if (e->click.widget == 2) {
- int item = (e->click.pt.y - 13) / 14;
- uint used_colors;
- int i;
-
- if ((uint)item >= 8)
- return;
- item += w->vscroll.pos;
- used_colors = WP(w,def_d).data_1;
-
- for (i = 0; i != 16; i++) {
- if (!(used_colors & 1) && --item < 0) {
- DoCommandP(0, 0, i, NULL, CMD_SET_PLAYER_COLOR);
- DeleteWindow(w);
+ case WE_CLICK: {
+ switch (e->click.widget) {
+ /* Livery Class buttons */
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6: {
+ LiveryScheme scheme;
+
+ WP(w, livery_d).livery_class = e->click.widget - 2;
+ WP(w, livery_d).sel = 0;
+
+ /* 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;
+ break;
+ }
+ }
+ w->click_state = 1 << e->click.widget;
+ w->height = 49 + livery_height[WP(w, livery_d).livery_class] * 14;
+ w->widget[13].bottom = w->height - 1;
+ w->widget[13].data = livery_height[WP(w, livery_d).livery_class] << 8 | 1;
+ MarkWholeScreenDirty();
+ break;
+ }
+
+ case 9:
+ case 10: // First colour dropdown
+ ShowColourDropDownMenu(w, 10);
+ break;
+
+ case 11:
+ case 12: // Second colour dropdown
+ ShowColourDropDownMenu(w, 12);
+ break;
+
+ case 13: {
+ LiveryScheme scheme;
+ LiveryScheme j = (e->click.pt.y - 48) / 14;
+
+ for (scheme = 0; scheme <= j; scheme++) {
+ if (livery_class[scheme] != WP(w, livery_d).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->click.pt.x < 10) {
+ DoCommandP(0, j | (2 << 8), !GetPlayer(w->window_number)->livery[j].in_use, NULL, CMD_SET_PLAYER_COLOR);
+ }
+
+ if (_ctrl_pressed) {
+ TOGGLEBIT(WP(w, livery_d).sel, j);
+ } else {
+ WP(w, livery_d).sel = 1 << j;
+ }
+ SetWindowDirty(w);
break;
}
- used_colors >>= 1;
}
+ break;
+ }
+
+ 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->dropdown.button == 10 ? 0 : 256), e->dropdown.index, NULL, CMD_SET_PLAYER_COLOR);
+ }
+ }
+ break;
}
- break;
}
}
-static const Widget _select_player_color_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 14, 11, 149, 0, 13, STR_7007_NEW_COLOR_SCHEME, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 137, 14, 127, 0x0, STR_7034_CLICK_ON_SELECTED_NEW_COLOR},
-{ WWT_SCROLLBAR, RESIZE_NONE, 14, 138, 149, 14, 127, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
-{ WIDGETS_END},
+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, 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_NULL },
+{ WWT_IMGBTN, RESIZE_NONE, 14, 22, 43, 14, 35, SPR_IMG_TRAINLIST, STR_NULL },
+{ WWT_IMGBTN, RESIZE_NONE, 14, 44, 65, 14, 35, SPR_IMG_TRUCKLIST, STR_NULL },
+{ WWT_IMGBTN, RESIZE_NONE, 14, 66, 87, 14, 35, SPR_IMG_SHIPLIST, STR_NULL },
+{ WWT_IMGBTN, RESIZE_NONE, 14, 88, 109, 14, 35, SPR_IMG_AIRPLANESLIST, STR_NULL },
+{ 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_TEXTBTN, RESIZE_NONE, 14, 150, 262, 36, 47, STR_02BD, STR_7007_NEW_COLOR_SCHEME },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 263, 274, 36, 47, STR_0225, STR_7007_NEW_COLOR_SCHEME },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 275, 387, 36, 47, STR_02E1, STR_7007_NEW_COLOR_SCHEME },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 388, 399, 36, 47, STR_0225, STR_7007_NEW_COLOR_SCHEME },
+{ WWT_MATRIX, RESIZE_NONE, 14, 0, 399, 48, 48 + 1 * 14, (1 << 8) | 1, STR_NULL },
+{ WIDGETS_END },
};
-static const WindowDesc _select_player_color_desc = {
- -1,-1, 150, 128,
- WC_PLAYER_COLOR,0,
+static const WindowDesc _select_player_livery_desc = {
+ -1,-1, 400, 49 + 1 * 14,
+ WC_PLAYER_COLOR, 0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
- _select_player_color_widgets,
- SelectPlayerColorWndProc
+ _select_player_livery_widgets,
+ SelectPlayerLiveryWndProc
};
static void SelectPlayerFaceWndProc(Window *w, WindowEvent *e)
@@ -570,10 +715,12 @@ static void PlayerCompanyWndProc(Window *w, WindowEvent *e)
} break;
case 4: {/* change color */
- Window *wf = AllocateWindowDescFront(&_select_player_color_desc,w->window_number);
+ Window *wf = AllocateWindowDescFront(&_select_player_livery_desc, w->window_number);
if (wf != NULL) {
wf->caption_color = wf->window_number;
- wf->vscroll.cap = 8;
+ WP(wf,livery_d).livery_class = LC_OTHER;
+ WP(wf,livery_d).sel = 1;
+ wf->click_state = 1 << 2;
}
} break;