mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-16 11:33:03 +01:00
implement dropdowns for window ride colour tab
This commit is contained in:
25
src/ride.h
25
src/ride.h
@@ -50,7 +50,9 @@ typedef struct {
|
||||
uint32 var_008;
|
||||
uint8 var_00C;
|
||||
uint8 var_00D;
|
||||
uint8 pad_00E[0x5];
|
||||
uint8 pad_00E[2];
|
||||
uint8 var_010;
|
||||
uint8 pad_011[2];
|
||||
uint8 var_013;
|
||||
uint8 pad_014[0x19E];
|
||||
sint8 excitement_multipler; // 0x1B2
|
||||
@@ -448,6 +450,27 @@ enum {
|
||||
RIDE_COLOUR_SCHEME_ADDITIONAL_3
|
||||
};
|
||||
|
||||
enum {
|
||||
VEHICLE_COLOUR_SCHEME_SAME,
|
||||
VEHICLE_COLOUR_SCHEME_PER_TRAIN,
|
||||
VEHICLE_COLOUR_SCHEME_PER_VEHICLE
|
||||
};
|
||||
|
||||
enum {
|
||||
RIDE_ENTRANCE_STYLE_PLAIN,
|
||||
RIDE_ENTRANCE_STYLE_WOODEN,
|
||||
RIDE_ENTRANCE_STYLE_CANVAS_TENT,
|
||||
RIDE_ENTRANCE_STYLE_CASTLE_GREY,
|
||||
RIDE_ENTRANCE_STYLE_CASTLE_BROWN,
|
||||
RIDE_ENTRANCE_STYLE_JUNGLE,
|
||||
RIDE_ENTRANCE_STYLE_LOG_CABIN,
|
||||
RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN,
|
||||
RIDE_ENTRANCE_STYLE_ABSTRACT,
|
||||
RIDE_ENTRANCE_STYLE_SNOW_ICE,
|
||||
RIDE_ENTRANCE_STYLE_PAGODA,
|
||||
RIDE_ENTRANCE_STYLE_SPACE
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint8 main;
|
||||
uint8 additional;
|
||||
|
||||
@@ -379,3 +379,16 @@ int dropdown_index_from_point(int x, int y, rct_window* w){
|
||||
|
||||
return dropdown_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x006ED43D
|
||||
* al: dropdown colour
|
||||
* ah: selected colour
|
||||
* esi: window
|
||||
* edi: widget
|
||||
* ebp: unknown
|
||||
*/
|
||||
void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour)
|
||||
{
|
||||
RCT2_CALLPROC_X(0x006ED43D, (selectedColour << 8) | dropdownColour, 0, 0, 0, (int)w, (int)widget, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
@@ -37,5 +37,6 @@ void window_dropdown_show_text_custom_width(int x, int y, int extray, uint8 colo
|
||||
void window_dropdown_show_image(int x, int y, int extray, uint8 colour, uint8 flags, int numItems, int itemWidth, int itemHeight, int numColumns);
|
||||
void window_dropdown_close();
|
||||
int dropdown_index_from_point(int x, int y, rct_window* w);
|
||||
void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour);
|
||||
|
||||
#endif
|
||||
@@ -2650,6 +2650,22 @@ static void window_ride_maintenance_paint()
|
||||
|
||||
#pragma region Colour
|
||||
|
||||
const uint8 window_ride_entrance_style_list[] = {
|
||||
RIDE_ENTRANCE_STYLE_PLAIN,
|
||||
RIDE_ENTRANCE_STYLE_CANVAS_TENT,
|
||||
RIDE_ENTRANCE_STYLE_WOODEN,
|
||||
RIDE_ENTRANCE_STYLE_CASTLE_BROWN,
|
||||
RIDE_ENTRANCE_STYLE_CASTLE_GREY,
|
||||
RIDE_ENTRANCE_STYLE_LOG_CABIN,
|
||||
RIDE_ENTRANCE_STYLE_JUNGLE,
|
||||
RIDE_ENTRANCE_STYLE_LOG_CABIN,
|
||||
RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN,
|
||||
RIDE_ENTRANCE_STYLE_ABSTRACT,
|
||||
RIDE_ENTRANCE_STYLE_SNOW_ICE,
|
||||
RIDE_ENTRANCE_STYLE_PAGODA,
|
||||
RIDE_ENTRANCE_STYLE_SPACE
|
||||
};
|
||||
|
||||
static uint32 window_ride_get_colour_button_image(int colour)
|
||||
{
|
||||
return 0x60000000 | (colour << 19) | 5059;
|
||||
@@ -2740,13 +2756,193 @@ static void window_ride_colour_resize()
|
||||
*
|
||||
* rct2: 0x006B02C6
|
||||
*/
|
||||
static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) { }
|
||||
static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_widget *widget)
|
||||
{
|
||||
rct_ride *ride;
|
||||
uint16 colourSchemeIndex;
|
||||
vehicle_colour vehicleColour;
|
||||
rct_widget *dropdownWidget;
|
||||
rct_ride_type *rideEntry, **rideEntries = (rct_ride_type**)0x009ACFA4;
|
||||
int i, numItems;
|
||||
rct_string_id stringId;
|
||||
|
||||
ride = GET_RIDE(w->number);
|
||||
rideEntry = rideEntries[ride->subtype];
|
||||
colourSchemeIndex = *((uint16*)&w->var_494);
|
||||
dropdownWidget = widget - 1;
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_TRACK_COLOUR_SCHEME_DROPDOWN:
|
||||
for (i = 0; i < 4; i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = STR_MAIN_COLOUR_SCHEME + i;
|
||||
}
|
||||
|
||||
window_dropdown_show_text_custom_width(
|
||||
w->x + dropdownWidget->left,
|
||||
w->y + dropdownWidget->top,
|
||||
dropdownWidget->bottom - dropdownWidget->top + 1,
|
||||
w->colours[1],
|
||||
0,
|
||||
4,
|
||||
widget->right - dropdownWidget->left
|
||||
);
|
||||
|
||||
gDropdownItemsChecked = 1 << colourSchemeIndex;
|
||||
break;
|
||||
case WIDX_TRACK_MAIN_COLOUR:
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], ride->track_colour_main[colourSchemeIndex]);
|
||||
break;
|
||||
case WIDX_TRACK_ADDITIONAL_COLOUR:
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], ride->track_colour_additional[colourSchemeIndex]);
|
||||
break;
|
||||
case WIDX_TRACK_SUPPORT_COLOUR:
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], ride->track_colour_supports[colourSchemeIndex]);
|
||||
break;
|
||||
case WIDX_MAZE_STYLE_DROPDOWN:
|
||||
for (i = 0; i < 4; i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = STR_BRICK_WALLS + i;
|
||||
}
|
||||
|
||||
window_dropdown_show_text_custom_width(
|
||||
w->x + dropdownWidget->left,
|
||||
w->y + dropdownWidget->top,
|
||||
dropdownWidget->bottom - dropdownWidget->top + 1,
|
||||
w->colours[1],
|
||||
0,
|
||||
4,
|
||||
widget->right - dropdownWidget->left
|
||||
);
|
||||
|
||||
gDropdownItemsChecked = 1 << ride->track_colour_supports[colourSchemeIndex];
|
||||
break;
|
||||
case WIDX_ENTRANCE_STYLE_DROPDOWN:
|
||||
window_dropdown_show_text_custom_width(
|
||||
w->x + dropdownWidget->left,
|
||||
w->y + dropdownWidget->top,
|
||||
dropdownWidget->bottom - dropdownWidget->top + 1,
|
||||
w->colours[1],
|
||||
0x80,
|
||||
countof(window_ride_entrance_style_list),
|
||||
widget->right - dropdownWidget->left
|
||||
);
|
||||
|
||||
for (i = 0; i < countof(window_ride_entrance_style_list); i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = STR_PLAIN_ENTRANCE + window_ride_entrance_style_list[i];
|
||||
|
||||
if (ride->entrance_style == window_ride_entrance_style_list[i])
|
||||
gDropdownItemsChecked = 1 << i;
|
||||
}
|
||||
break;
|
||||
case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN:
|
||||
window_dropdown_show_text_custom_width(
|
||||
w->x + dropdownWidget->left,
|
||||
w->y + dropdownWidget->top,
|
||||
dropdownWidget->bottom - dropdownWidget->top + 1,
|
||||
w->colours[1],
|
||||
0,
|
||||
rideEntry->var_010 > 1 ? 3 : 2,
|
||||
widget->right - dropdownWidget->left
|
||||
);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = (RideNameConvention[ride->type].vehicle_name << 16) | (STR_ALL_VEHICLES_IN_SAME_COLOURS + i);
|
||||
}
|
||||
gDropdownItemsChecked = 1 << (ride->colour_scheme_type & 3);
|
||||
break;
|
||||
case WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN:
|
||||
numItems = ride->num_vehicles;
|
||||
if ((ride->colour_scheme_type & 3) != VEHICLE_COLOUR_SCHEME_PER_TRAIN)
|
||||
numItems = ride->var_0C9;
|
||||
|
||||
window_dropdown_show_text_custom_width(
|
||||
w->x + dropdownWidget->left,
|
||||
w->y + dropdownWidget->top,
|
||||
dropdownWidget->bottom - dropdownWidget->top + 1,
|
||||
w->colours[1],
|
||||
0x80,
|
||||
numItems,
|
||||
widget->right - dropdownWidget->left
|
||||
);
|
||||
|
||||
stringId = (ride->colour_scheme_type & 3) == VEHICLE_COLOUR_SCHEME_PER_TRAIN ? 1135 : 1133;
|
||||
for (i = 0; i < 32; i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = ((sint64)(i + 1) << 32) | ((RideNameConvention[ride->type].vehicle_name + 2) << 16) | stringId;
|
||||
}
|
||||
gDropdownItemsChecked = 1 << w->var_48C;
|
||||
break;
|
||||
case WIDX_VEHICLE_MAIN_COLOUR:
|
||||
vehicleColour = ride_get_vehicle_colour(ride, w->var_48C);
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], vehicleColour.main);
|
||||
break;
|
||||
case WIDX_VEHICLE_ADDITIONAL_COLOUR_1:
|
||||
vehicleColour = ride_get_vehicle_colour(ride, w->var_48C);
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], vehicleColour.additional_1);
|
||||
break;
|
||||
case WIDX_VEHICLE_ADDITIONAL_COLOUR_2:
|
||||
vehicleColour = ride_get_vehicle_colour(ride, w->var_48C);
|
||||
window_dropdown_show_colour(w, widget, w->colours[1], vehicleColour.additional_2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006B0331
|
||||
*/
|
||||
static void window_ride_colour_dropdown() { }
|
||||
static void window_ride_colour_dropdown()
|
||||
{
|
||||
rct_window *w;
|
||||
short widgetIndex, dropdownIndex;
|
||||
|
||||
window_dropdown_get_registers(w, widgetIndex, dropdownIndex);
|
||||
|
||||
if (dropdownIndex == -1)
|
||||
return;
|
||||
|
||||
switch (widgetIndex) {
|
||||
case WIDX_TRACK_COLOUR_SCHEME_DROPDOWN:
|
||||
*((uint16*)&w->var_494) = dropdownIndex;
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_TRACK_MAIN_COLOUR:
|
||||
game_do_command(0, (0 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0);
|
||||
break;
|
||||
case WIDX_TRACK_ADDITIONAL_COLOUR:
|
||||
game_do_command(0, (1 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0);
|
||||
break;
|
||||
case WIDX_TRACK_SUPPORT_COLOUR:
|
||||
game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0);
|
||||
break;
|
||||
case WIDX_MAZE_STYLE_DROPDOWN:
|
||||
game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0);
|
||||
break;
|
||||
case WIDX_ENTRANCE_STYLE_DROPDOWN:
|
||||
game_do_command(0, (6 << 8) | 1, 0, (window_ride_entrance_style_list[dropdownIndex] << 8) | w->number, GAME_COMMAND_0, 0, 0);
|
||||
break;
|
||||
case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN:
|
||||
game_do_command(0, (5 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, 0, 0);
|
||||
w->var_48C = 0;
|
||||
break;
|
||||
case WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN:
|
||||
w->var_48C = dropdownIndex;
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_VEHICLE_MAIN_COLOUR:
|
||||
game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0);
|
||||
break;
|
||||
case WIDX_VEHICLE_ADDITIONAL_COLOUR_1:
|
||||
game_do_command(0, (3 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0);
|
||||
break;
|
||||
case WIDX_VEHICLE_ADDITIONAL_COLOUR_2:
|
||||
game_do_command(0, (7 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -2808,6 +3004,10 @@ static void window_ride_colour_invalidate()
|
||||
RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name;
|
||||
RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments;
|
||||
|
||||
// Track colours
|
||||
int colourScheme = *((uint16*)&w->var_494);
|
||||
trackColour = ride_get_track_colour(ride, colourScheme);
|
||||
|
||||
// Maze style
|
||||
if (ride->type == RIDE_TYPE_MAZE) {
|
||||
window_ride_colour_widgets[WIDX_MAZE_STYLE].type = WWT_DROPDOWN;
|
||||
@@ -2828,10 +3028,6 @@ static void window_ride_colour_invalidate()
|
||||
window_ride_colour_widgets[WIDX_TRACK_COLOUR_SCHEME_DROPDOWN].type = WWT_EMPTY;
|
||||
window_ride_colour_widgets[WIDX_PAINT_INDIVIDUAL_AREA].type = WWT_EMPTY;
|
||||
}
|
||||
|
||||
// Track colours
|
||||
int colourScheme = *((uint16*)&w->var_494);
|
||||
trackColour = ride_get_track_colour(ride, colourScheme);
|
||||
|
||||
// Track main colour
|
||||
if (window_ride_has_track_colour(ride, 0)) {
|
||||
@@ -2995,19 +3191,21 @@ static void window_ride_colour_paint()
|
||||
y = w->y + widget->top;
|
||||
|
||||
// Track
|
||||
spriteIndex = 14222 + (ride->type * 2);
|
||||
spriteIndex |= (trackColour.additional << 24) | (trackColour.main << 19);
|
||||
spriteIndex |= 0xA0000000;
|
||||
if (spriteIndex == 14262)
|
||||
if (ride->type == RIDE_TYPE_MAZE) {
|
||||
spriteIndex = 21990 + trackColour.supports;
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, 0);
|
||||
} else {
|
||||
spriteIndex = 14222 + (ride->type * 2);
|
||||
spriteIndex |= (trackColour.additional << 24) | (trackColour.main << 19);
|
||||
spriteIndex |= 0xA0000000;
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, 0);
|
||||
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, 0);
|
||||
|
||||
// Supports
|
||||
spriteIndex = 14222 + (ride->type * 2) + 1;
|
||||
spriteIndex |= trackColour.supports << 19;
|
||||
spriteIndex |= 0x20000000;
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, 0);
|
||||
// Supports
|
||||
spriteIndex = 14222 + (ride->type * 2) + 1;
|
||||
spriteIndex |= trackColour.supports << 19;
|
||||
spriteIndex |= 0x20000000;
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, 0);
|
||||
}
|
||||
} else {
|
||||
x = w->x + (widget->left + widget->right) / 2 - 8;
|
||||
y = w->y + (widget->bottom + widget->top) / 2 - 6;
|
||||
|
||||
Reference in New Issue
Block a user