1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 04:23:20 +01:00

implement more of ride window colour invalidate

This commit is contained in:
IntelOrca
2014-09-10 23:05:20 +01:00
parent b40844c634
commit 9c1689a9ef
5 changed files with 209 additions and 16 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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);