diff --git a/src/award.c b/src/award.c index e8449a55b3..041efa7263 100644 --- a/src/award.c +++ b/src/award.c @@ -474,10 +474,12 @@ static int award_is_deserved_best_custom_designed_rides(int awardType, int activ } /** At least 5 colourful rides and more than half of the rides are colourful. */ +const uint8 dazzling_ride_colours[] = { 5, 14, 20, 30 }; static int award_is_deserved_most_dazzling_ride_colours(int awardType, int activeAwardTypes) { - int i, countedRides, colourfulRides; + int i, j, countedRides, colourfulRides; rct_ride *ride; + uint8 mainTrackColour; if (activeAwardTypes & (1 << PARK_AWARD_MOST_DISAPPOINTING)) return 0; @@ -489,8 +491,14 @@ static int award_is_deserved_most_dazzling_ride_colours(int awardType, int activ continue; countedRides++; - if (ride->var_1BC == 5 || ride->var_1BC == 14 || ride->var_1BC == 20 || ride->var_1BC == 30) - colourfulRides++; + + mainTrackColour = ride->track_colour_main[0]; + for (j = 0; j < countof(dazzling_ride_colours); j++) { + if (mainTrackColour == dazzling_ride_colours[j]) { + colourfulRides++; + break; + } + } } return (colourfulRides >= 5 && colourfulRides >= countedRides - colourfulRides); diff --git a/src/ride.c b/src/ride.c index fe280689cb..01cef11afa 100644 --- a/src/ride.c +++ b/src/ride.c @@ -568,4 +568,22 @@ int ride_can_have_multiple_circuits(rct_ride *ride) return 0; return 1; +} + +track_colour ride_get_track_colour(rct_ride *ride, int colourScheme) +{ + track_colour result; + result.main = ride->track_colour_main[colourScheme]; + result.additional = ride->track_colour_additional[colourScheme]; + result.supports = ride->track_colour_supports[colourScheme]; + return result; +} + +vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex) +{ + vehicle_colour result; + result.main = ride->vehicle_colours[vehicleIndex] & 0xFF; + result.additional_1 = ride->vehicle_colours[vehicleIndex] >> 8; + result.additional_2 = ride->vehicle_colours_extended[vehicleIndex]; + return result; } \ No newline at end of file diff --git a/src/ride.h b/src/ride.h index 65945b96e3..d49a254174 100644 --- a/src/ride.h +++ b/src/ride.h @@ -166,16 +166,17 @@ typedef struct { money32 income_per_hour; // 0x1B0 money32 profit; // 0x1B4 uint8 queue_time[4]; // 0x1B8 - uint8 var_1BC; - uint8 pad_1BD[0x0B]; - uint8 music; - uint8 pad_1C9[0x03]; + uint8 track_colour_main[4]; // 0x1BC + uint8 track_colour_additional[4]; // 0x1C0 + uint8 track_colour_supports[4]; // 0x1C4 + uint8 music; // 0x1C8 + uint8 entrance_style; // 0x1C9 + uint8 pad_1CA[0x02]; uint8 num_block_brakes; // 0x1CC uint8 lift_hill_speed; // 0x1CD uint16 guests_favourite; // 0x1CE uint32 lifecycle_flags; // 0x1D0 - uint8 var_1D4; - uint8 pad_1D5[0x1F]; + uint8 vehicle_colours_extended[32]; // 0x1D4 uint16 total_air_time; // 0x1F4 uint8 pad_1F6; uint8 num_circuits; // 0x1F7 @@ -440,6 +441,25 @@ enum { RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH = 1 << 7 }; +enum { + RIDE_COLOUR_SCHEME_MAIN, + RIDE_COLOUR_SCHEME_ADDITIONAL_1, + RIDE_COLOUR_SCHEME_ADDITIONAL_2, + RIDE_COLOUR_SCHEME_ADDITIONAL_3 +}; + +typedef struct { + uint8 main; + uint8 additional; + uint8 supports; +} track_colour; + +typedef struct { + uint8 main; + uint8 additional_1; + uint8 additional_2; +} vehicle_colour; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -479,5 +499,7 @@ void ride_get_status(int rideIndex, int *formatSecondary, int *argument); rct_peep *ride_get_assigned_mechanic(rct_ride *ride); int ride_get_total_length(rct_ride *ride); int ride_can_have_multiple_circuits(rct_ride *ride); +track_colour ride_get_track_colour(rct_ride *ride, int colourScheme); +vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex); #endif diff --git a/src/string_ids.h b/src/string_ids.h index 733c618b93..23f670cf25 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -725,6 +725,11 @@ enum { STR_ON_RIDE_PHOTO_PRICE = 1963, + STR_MAIN_COLOUR_SCHEME = 2971, + STR_ALTERNATIVE_COLOUR_SCHEME_1 = 2972, + STR_ALTERNATIVE_COLOUR_SCHEME_2 = 2973, + STR_ALTERNATIVE_COLOUR_SCHEME_3 = 2974, + STR_ITEM_START = 1988, STR_ITEM_SINGULAR_START = 2044, STR_ITEM2_START = 2090, @@ -1101,6 +1106,11 @@ enum { STR_TRANSLUCENT = 3056, STR_CONSTRUCTION_MARKER = 3057, + STR_BRICK_WALLS = 3058, + STR_HEDGES = 3059, + STR_ICE_BLOCKS = 3060, + STR_WOODEN_FENCES = 3061, + STR_BEGINNER_PARKS = 3064, STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, STR_EXPERT_PARKS = STR_BEGINNER_PARKS + 2, @@ -1110,6 +1120,19 @@ enum { STR_SAME_PRICE_THROUGHOUT_PARK = 3071, STR_SAME_PRICE_THROUGHOUT_PARK_TIP = 3072, + STR_PLAIN_ENTRANCE = 3078, + STR_WOODEN_ENTRANCE = 3079, + STR_CANVAS_TENT_ENTRANCE = 3080, + STR_CASTLE_ENTRANCE_GREY = 3081, + STR_CASTLE_ENTRANCE_BROWN = 3082, + STR_JUNGLE_ENTRANCE = 3083, + STR_LOG_CABIN_ENTRANCE = 3084, + STR_CLASSICAL_ROMAN_ENTRANCE = 3085, + STR_ABSTRACT_ENTRANCE = 3086, + STR_SNOW_ICE_ENTRANCE = 3087, + STR_PAGODA_ENTRANCE = 3088, + STR_SPACE_ENTRANCE = 3089, + STR_SELECT_STYLE_OF_ENTRANCE_EXIT_STATION_TIP = 3090, STR_SELECT_LIFT_HILL_CHAIN_SPEED_TIP = 3097, diff --git a/src/window_ride.c b/src/window_ride.c index fa974fd5b7..2c788c5ae3 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -113,12 +113,12 @@ enum { WIDX_TRACK_MAIN_COLOUR, WIDX_TRACK_ADDITIONAL_COLOUR, WIDX_TRACK_SUPPORT_COLOUR, - WIDX_COLOUR_20, - WIDX_COLOUR_21, + WIDX_MAZE_STYLE, + WIDX_MAZE_STYLE_DROPDOWN, WIDX_PAINT_INDIVIDUAL_AREA, WIDX_ENTRANCE_PREVIEW, - WIDX_STATION_STYLE, - WIDX_STATION_STYLE_DROPDOWN, + WIDX_ENTRANCE_STYLE, + WIDX_ENTRANCE_STYLE_DROPDOWN, WIDX_VEHICLE_PREVIEW, WIDX_VEHICLE_COLOUR_SCHEME, WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN, @@ -841,6 +841,7 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) int widgetIndex, spriteIndex, colour, x, y, width, height; uint8 *ebp; rct_ride_type *rideEntry, **rideEntries = (rct_ride_type**)0x009ACFA4; + vehicle_colour vehicleColour; widgetIndex = WIDX_TAB_1 + WINDOW_PARK_PAGE_VEHICLE; widget = &w->widgets[widgetIndex]; @@ -880,8 +881,10 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w) ebp = (uint8*)rideEntry + (RCT2_ADDRESS(0x00F64E38, uint8)[rideEntry->var_013] * 101); height += RCT2_GLOBAL(ebp + 0x24, sint8); - RCT2_GLOBAL(0x00F43480, uint32) = ride->var_1D4; - colour = ((ride->vehicle_colours[0] & 0xFF00) << 16) | ((ride->vehicle_colours[0] & 0xFF) << 19); + vehicleColour = ride_get_vehicle_colour(ride, 0); + + RCT2_GLOBAL(0x00F43480, uint32) = vehicleColour.additional_2; + colour = (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19); spriteIndex = 32; if (w->page == WINDOW_PARK_PAGE_VEHICLE) spriteIndex += w->frame_no; @@ -2651,6 +2654,24 @@ static void window_ride_maintenance_paint() #pragma region Colour +static uint32 window_ride_get_colour_button_image(int colour) +{ + return 0x60000000 | (colour << 19) | 5059; +} + +static int window_ride_has_track_colour(rct_ride *ride, int trackColour) +{ + uint16 unk_1 = RCT2_GLOBAL(0x00993E20 + (ride->entrance_style * 8), uint16); + uint32 unk_2 = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32); + + switch (trackColour) { + case 0: return ((unk_1 & 1) && (unk_2 & 1)) || !(unk_2 & 0x20000); + case 1: return ((unk_1 & 2) && (unk_2 & 2)) || !(unk_2 & 0x20000); + case 2: return unk_2 & 4; + default: return 0; + } +} + /** * * rct2: 0x006B04FA @@ -2771,6 +2792,8 @@ static void window_ride_colour_invalidate() rct_widget *widgets; rct_ride_type *rideEntry, **rideEntries = (rct_ride_type**)0x009ACFA4; rct_ride *ride; + track_colour trackColour; + vehicle_colour vehicleColour; window_get_register(w); @@ -2788,7 +2811,106 @@ static void window_ride_colour_invalidate() RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; - // TODO widget setup + // Maze style + if (ride->type == RIDE_TYPE_MAZE) { + window_ride_colour_widgets[WIDX_MAZE_STYLE].type = WWT_DROPDOWN; + window_ride_colour_widgets[WIDX_MAZE_STYLE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_ride_colour_widgets[WIDX_MAZE_STYLE].image = STR_BRICK_WALLS + trackColour.supports; + } else { + window_ride_colour_widgets[WIDX_MAZE_STYLE].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_MAZE_STYLE_DROPDOWN].type = WWT_EMPTY; + } + + // Track, multiple colour schemes + if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x80000000) { + window_ride_colour_widgets[WIDX_TRACK_COLOUR_SCHEME].type = WWT_DROPDOWN; + window_ride_colour_widgets[WIDX_TRACK_COLOUR_SCHEME_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_ride_colour_widgets[WIDX_PAINT_INDIVIDUAL_AREA].type = WWT_FLATBTN; + } else { + window_ride_colour_widgets[WIDX_TRACK_COLOUR_SCHEME].type = WWT_EMPTY; + 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)) { + window_ride_colour_widgets[WIDX_TRACK_MAIN_COLOUR].type = WWT_COLORBTN; + window_ride_colour_widgets[WIDX_TRACK_MAIN_COLOUR].image = window_ride_get_colour_button_image(trackColour.main); + } else { + window_ride_colour_widgets[WIDX_TRACK_MAIN_COLOUR].type = WWT_EMPTY; + } + + // Track additional colour + if (window_ride_has_track_colour(ride, 1)) { + window_ride_colour_widgets[WIDX_TRACK_ADDITIONAL_COLOUR].type = WWT_COLORBTN; + window_ride_colour_widgets[WIDX_TRACK_ADDITIONAL_COLOUR].image = window_ride_get_colour_button_image(trackColour.additional); + } else { + window_ride_colour_widgets[WIDX_TRACK_ADDITIONAL_COLOUR].type = WWT_EMPTY; + } + + // Track supports colour + if (window_ride_has_track_colour(ride, 2) && ride->type != RIDE_TYPE_MAZE) { + window_ride_colour_widgets[WIDX_TRACK_SUPPORT_COLOUR].type = WWT_COLORBTN; + window_ride_colour_widgets[WIDX_TRACK_SUPPORT_COLOUR].image = window_ride_get_colour_button_image(trackColour.supports); + } else { + window_ride_colour_widgets[WIDX_TRACK_SUPPORT_COLOUR].type = WWT_EMPTY; + } + + // Track preview + if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 7) + window_ride_colour_widgets[WIDX_TRACK_PREVIEW].type = WWT_SPINNER; + else + window_ride_colour_widgets[WIDX_TRACK_PREVIEW].type = WWT_EMPTY; + + // Entrance style + if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x20) { + window_ride_colour_widgets[WIDX_ENTRANCE_PREVIEW].type = WWT_SPINNER; + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].type = WWT_DROPDOWN; + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].image = STR_PLAIN_ENTRANCE + ride->entrance_style; + } else { + window_ride_colour_widgets[WIDX_ENTRANCE_PREVIEW].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_ENTRANCE_STYLE_DROPDOWN].type = WWT_EMPTY; + } + + // Vehicle colours + if ( + !(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x2000) && + (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x4000000) + ) { + window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW].type = WWT_SCROLL; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME].type = WWT_DROPDOWN; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].type = WWT_COLORBTN; + + vehicleColour = ride_get_vehicle_colour(ride, w->var_48C); + window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].image = window_ride_get_colour_button_image(vehicleColour.main); + window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_1].image = window_ride_get_colour_button_image(vehicleColour.additional_1); + window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_2].image = window_ride_get_colour_button_image(vehicleColour.additional_2); + + RCT2_CALLPROC_X(0x006DE4CD, (ride->var_0C9 << 8) | ride->subtype, 0, 0, 0, 0, 0, 0); + + // mov edx, 0x00F64E38 + // xor eax, eax + // loc_6AFDEE: + } else { + window_ride_colour_widgets[WIDX_VEHICLE_PREVIEW].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_INDEX].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_MAIN_COLOUR].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_1].type = WWT_EMPTY; + window_ride_colour_widgets[WIDX_VEHICLE_ADDITIONAL_COLOUR_2].type = WWT_EMPTY; + } + + RCT2_GLOBAL(0x013CE960, uint16) = STR_MAIN_COLOUR_SCHEME + colourScheme; window_ride_anchor_border_widgets(w); window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10);