Merge pull request #480 from duncanspumpkin/fix_window_ride

Fix window ride
This commit is contained in:
Ted John 2014-09-23 12:57:07 +01:00
commit 9124549b65
5 changed files with 153 additions and 36 deletions

View File

@ -54,8 +54,8 @@ unsigned char up_arrow_cursor_mask[32 * 4] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
#define UP_ARROW_CURSOR_HOTX 7
#define UP_ARROW_CURSOR_HOTY 31
#define UP_ARROW_CURSOR_HOTX 15
#define UP_ARROW_CURSOR_HOTY 0
unsigned char up_down_arrow_cursor_data[32 * 4] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0xA0, 0x00,

View File

@ -933,7 +933,7 @@ static void game_handle_input_mouse(int x, int y, int state)
eax = RCT2_ADDRESS(0x0099BA64, uint8)[16 * map_element->properties.track.type];
if (!(eax & 0x10)){//If not station track
//Open ride window in overview mode.
RCT2_CALLPROC_X(0x6ACC28, map_element->properties.track.ride_index, ebx, ecx, (int)map_element, esi, edi, ebp);
window_ride_main_open(map_element->properties.track.ride_index);
break;
}
}

View File

@ -291,7 +291,7 @@ void news_item_open_subject(int type, int subject) {
switch (type) {
case NEWS_ITEM_RIDE:
RCT2_CALLPROC_X(0x006ACC28, subject, 0, 0, 0, 0, 0, 0);
window_ride_main_open(subject);
break;
case NEWS_ITEM_PEEP_ON_RIDE:
case NEWS_ITEM_PEEP:

View File

@ -104,7 +104,7 @@ typedef struct{
sint16 y; //0x484 & VIEWPORT_FOCUS_Y_MASK
sint16 z; //0x486
uint8 rotation;//0x488
uint8 pad_489;
uint8 zoom;//0x489
} coordinate_focus;
// Type is viewport_target_sprite_id & 0x80000000 != 0
@ -115,7 +115,7 @@ typedef struct{
uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK
uint16 pad_486;
uint8 rotation; //0x488
uint8 pad_489;
uint8 zoom; //0x489
} sprite_focus;
#define VIEWPORT_FOCUS_TYPE_MASK 0xC0
@ -123,7 +123,7 @@ enum{
VIEWPORT_FOCUS_TYPE_COORDINATE = (1<<6),
VIEWPORT_FOCUS_TYPE_SPRITE = (1<<7)
};
#define VIEWPORT_FOCUS_Y_MASK 0x3FFF;
#define VIEWPORT_FOCUS_Y_MASK 0x3FFF
typedef struct{

View File

@ -493,6 +493,7 @@ const uint64 window_ride_page_enabled_widgets[] = {
#pragma region Events
static void window_ride_emptysub() { }
static void window_ride_init_viewport(rct_window *w);
static void window_ride_main_mouseup();
static void window_ride_main_resize();
@ -1170,7 +1171,7 @@ void window_ride_main_open(int rideIndex)
RCT2_CALLPROC_X(0x006AEB9F, 0, 0, 0, 0, (int)w, 0, 0);
window_init_scroll_widgets(w);
w->ride.view = 0;
RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0);
window_ride_init_viewport(w);
}
/**
@ -1243,7 +1244,120 @@ static void window_ride_anchor_border_widgets(rct_window *w)
*/
static void window_ride_init_viewport(rct_window *w)
{
RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0);
if (w->page != WINDOW_PARK_PAGE_MAIN) return;
rct_ride* ride = GET_RIDE(w->number);
int eax = w->viewport_focus_coordinates.var_480 - 1;
union{
sprite_focus sprite;
coordinate_focus coordinate;
} focus;
focus.sprite.sprite_id = -1;
focus.coordinate.zoom = 0;
focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8);
if (eax >= 0 && eax < ride->num_vehicles && ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){
focus.sprite.sprite_id = ride->vehicles[eax];
rct_ride_type* ride_entry = ride_get_entry(ride);
if (ride_entry->var_013 != 0){
rct_vehicle* vehicle = GET_VEHICLE(focus.sprite.sprite_id);
focus.sprite.sprite_id = vehicle->next_vehicle_on_train;
}
focus.sprite.type |= 0xC0;
}
else if (eax >= ride->num_vehicles && eax < (ride->num_vehicles + ride->num_stations)){
int stationIndex = -1;
int count = eax - ride->num_vehicles;
do {
stationIndex++;
if (ride->station_starts[stationIndex] != 0xFFFF)
count--;
} while (count >= 0);
eax = ride->station_starts[stationIndex];
focus.coordinate.x = (eax & 0xFF) << 5;
focus.coordinate.y = (eax & 0xFF00) >> 3;
focus.coordinate.z = ride->station_heights[stationIndex] << 3;
focus.sprite.type |= 0x40;
}
else{
if (eax > 0){
w->viewport_focus_coordinates.var_480 = 0;
}
focus.coordinate.x = (ride->overall_view & 0xFF) << 5;
focus.coordinate.y = (ride->overall_view & 0xFF00) >> 3;
focus.coordinate.x += 16;
focus.coordinate.y += 16;
focus.coordinate.z = map_element_height(focus.coordinate.x, focus.coordinate.y) & 0xFFFF;
focus.sprite.type |= 0x40;
focus.coordinate.zoom = 1;
if (RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x8000){
focus.coordinate.zoom = 0;
}
}
focus.coordinate.var_480 = w->viewport_focus_coordinates.var_480;
uint16 viewport_flags = 0;
if (w->viewport != 0){
if (focus.coordinate.x == w->viewport_focus_coordinates.x &&
focus.coordinate.y == w->viewport_focus_coordinates.y &&
focus.coordinate.z == w->viewport_focus_coordinates.z &&
focus.coordinate.rotation == w->viewport_focus_coordinates.rotation &&
focus.coordinate.zoom == w->viewport_focus_coordinates.zoom )
return;
viewport_flags = w->viewport->flags;
w->viewport->width = 0;
w->viewport = 0;
viewport_update_pointers();
}
else{
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 0x1)
viewport_flags |= VIEWPORT_FLAG_GRIDLINES;
}
RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
w->viewport_focus_coordinates.x = focus.coordinate.x;
w->viewport_focus_coordinates.y = focus.coordinate.y;
w->viewport_focus_coordinates.z = focus.coordinate.z;
w->viewport_focus_coordinates.rotation = focus.coordinate.rotation;
w->viewport_focus_coordinates.zoom = focus.coordinate.zoom;
//rct2: 0x006aec9c only used here so brought it into the function
if (!w->viewport && ride->overall_view != 0xFFFF){
rct_widget* view_widget = &w->widgets[WIDX_VIEWPORT];
int x = view_widget->left + 1 + w->x;
int y = view_widget->top + 1 + w->y;
int width = view_widget->right - view_widget->left - 1;
int height = view_widget->bottom - view_widget->top - 1;
viewport_create(
w,
x,
y,
width,
height,
focus.coordinate.zoom,
focus.coordinate.x,
focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK,
focus.coordinate.z,
focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK,
focus.sprite.sprite_id);
w->flags |= WF_2;
window_invalidate(w);
}
if (w->viewport){
w->viewport->flags = viewport_flags;
window_invalidate(w);
}
}
/**
@ -1305,7 +1419,7 @@ static void window_ride_locate(rct_window *w)
return;
if (xy & 0x80000000) {
rct_sprite *sprite = &g_sprite_list[xy];
rct_sprite *sprite = &g_sprite_list[xy & 0xFFFF];
x = sprite->unknown.x;
y = sprite->unknown.y;
z = sprite->unknown.z;
@ -1601,7 +1715,7 @@ static void window_ride_main_dropdown()
}
w->ride.view = dropdownIndex;
RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0);
window_ride_init_viewport(w);
window_invalidate(w);
break;
case WIDX_OPEN:
@ -3442,7 +3556,16 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
gDropdownItemsChecked = 1 << ride->track_colour_supports[colourSchemeIndex];
break;
case WIDX_ENTRANCE_STYLE_DROPDOWN:
case WIDX_ENTRANCE_STYLE_DROPDOWN:
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;
}
int checked = gDropdownItemsChecked;
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left,
w->y + dropdownWidget->top,
@ -3453,15 +3576,14 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
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;
}
gDropdownItemsChecked = checked;
break;
case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN:
case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN:
for (i = 0; i < 3; i++) {
gDropdownItemsFormat[i] = 1142;
gDropdownItemsArgs[i] = (RideNameConvention[ride->type].vehicle_name << 16) | (STR_ALL_VEHICLES_IN_SAME_COLOURS + i);
}
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left,
w->y + dropdownWidget->top,
@ -3472,10 +3594,6 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
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:
@ -3483,6 +3601,12 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
if ((ride->colour_scheme_type & 3) != VEHICLE_COLOUR_SCHEME_PER_TRAIN)
numItems = ride->num_cars_per_train;
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;
}
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left,
w->y + dropdownWidget->top,
@ -3493,11 +3617,6 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
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:
@ -3753,20 +3872,18 @@ static void window_ride_colour_invalidate()
// Vehicle colour scheme type
if (
!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x10000) &&
(ride->num_stations | ride->num_vehicles) > 1
(ride->num_cars_per_train | ride->num_vehicles) > 1
) {
window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME].type = WWT_DROPDOWN;
window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
RCT2_GLOBAL(0x013CE952 + 6, uint16) = STR_ALL_VEHICLES_IN_SAME_COLOURS + vehicleColourSchemeType;
RCT2_GLOBAL(0x013CE952 + 8, uint16) = RideNameConvention[ride->type].vehicle_name;
RCT2_GLOBAL(0x013CE952 + 10, uint16) = RideNameConvention[ride->type].vehicle_name + 2;
RCT2_GLOBAL(0x013CE952 + 12, uint16) = w->var_48C + 1;
} else {
window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME].type = WWT_EMPTY;
window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN].type = WWT_EMPTY;
}
RCT2_GLOBAL(0x013CE952 + 6, uint16) = STR_ALL_VEHICLES_IN_SAME_COLOURS + vehicleColourSchemeType;
RCT2_GLOBAL(0x013CE952 + 8, uint16) = RideNameConvention[ride->type].vehicle_name;
RCT2_GLOBAL(0x013CE952 + 10, uint16) = RideNameConvention[ride->type].vehicle_name + 2;
RCT2_GLOBAL(0x013CE952 + 12, uint16) = w->var_48C + 1;
// Vehicle index
if (vehicleColourSchemeType != 0) {
window_ride_colour_widgets[WIDX_VEHICLE_COLOUR_INDEX].type = WWT_DROPDOWN;