From 210ba2a04d6923e83a49574d7fb51f7080c9145d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 25 Jun 2015 16:48:32 +0100 Subject: [PATCH 01/16] object-selection-columns: add ride type with sort --- src/object.h | 2 +- src/object_list.c | 15 +- src/windows/editor_object_selection.c | 268 +++++++++++++++++--------- 3 files changed, 189 insertions(+), 96 deletions(-) diff --git a/src/object.h b/src/object.h index cf5b735d61..de586c0b93 100644 --- a/src/object.h +++ b/src/object.h @@ -80,7 +80,7 @@ typedef struct { typedef struct { uint8 category[2]; - + uint8 ride_type; } rct_ride_filters; typedef struct { diff --git a/src/object_list.c b/src/object_list.c index d2a8dc5304..379036d1c3 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -795,10 +795,21 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object_filters* filter) { + rct_ride_type *rideType; + rct_ride_filters *rideFilter; + switch (entry->flags & 0xF) { case OBJECT_TYPE_RIDE: - filter->ride.category[0] = ((rct_ride_type*)chunk)->category[0]; - filter->ride.category[1] = ((rct_ride_type*)chunk)->category[1]; + rideType = ((rct_ride_type*)chunk); + rideFilter = &(filter->ride); + + rideFilter->category[0] = rideType->category[0]; + rideFilter->category[1] = rideType->category[1]; + for (int i = 0; i < 3; i++) { + rideFilter->ride_type = rideType->ride_type[i]; + if (rideFilter->ride_type != 255) + break; + } break; case OBJECT_TYPE_SMALL_SCENERY: case OBJECT_TYPE_LARGE_SCENERY: diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f69aa0ba1c..5841106e57 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -135,7 +135,7 @@ static rct_widget window_editor_object_selection_widgets[] = { { WWT_DROPDOWN_BUTTON, 0, 350, 463, 23, 34, 5261, 5265 }, { WWT_TEXT_BOX, 1, 4, 214, 46, 57, (uint32)_filter_string, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 218, 287, 46, 57, 5277, STR_NONE }, - { WWT_RESIZE, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE }, + { WWT_IMGBTN, 1, 3, 287, 73, 76, 0xFFFFFFFF, STR_NONE }, { WWT_TAB, 1, 3, 33, 47, 73, 0x2000144E, 5349 }, { WWT_TAB, 1, 34, 64, 47, 73, 0x2000144E, 1223 }, { WWT_TAB, 1, 65, 95, 47, 73, 0x2000144E, 1224 }, @@ -154,6 +154,7 @@ static void window_editor_object_selection_emptysub() { } static void window_editor_object_selection_close(); static void window_editor_object_selection_mouseup(); +static void window_editor_object_selection_resize(); static void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_editor_object_selection_dropdown(); static void window_editor_object_selection_update(rct_window *w); @@ -169,7 +170,7 @@ static void window_editor_object_selection_textinput(); static void* window_editor_object_selection_events[] = { window_editor_object_selection_close, (void*)window_editor_object_selection_mouseup, - (void*)window_editor_object_selection_emptysub, + (void*)window_editor_object_selection_resize, (void*)window_editor_object_selection_mousedown, (void*)window_editor_object_selection_dropdown, (void*)window_editor_object_selection_emptysub, @@ -259,6 +260,72 @@ static rct_object_entry DefaultSelectedObjects[] = { { 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing }; + +typedef struct { + rct_object_entry *entry; + rct_object_filters *filter; + uint8 *flags; +} list_item; + +static int _numListItems = 0; +static list_item *_listItems = NULL; + +static void visible_list_dispose() +{ + SafeFree(_listItems); + _numListItems = 0; +} + +static int visible_list_sort_ride_type(const void *rawA, const void *rawB) +{ + list_item *a = (list_item*)rawA; + list_item *b = (list_item*)rawB; + + const char *rideTypeA = language_get_string(2 + a->filter->ride.ride_type); + const char *rideTypeB = language_get_string(2 + b->filter->ride.ride_type); + int result = strcmp(rideTypeA, rideTypeB); + if (result != 0) + return result; + + const char *nameA = object_get_name(a->entry); + const char *nameB = object_get_name(b->entry); + return strcmp(nameA, nameB); +} + +static void visible_list_refresh(rct_window *w) +{ + int numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); + + visible_list_dispose(); + _listItems = malloc(numObjects * sizeof(list_item)); + _numListItems = 0; + + list_item *currentListItem = &_listItems[0]; + rct_object_entry *entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); + uint8 *itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); + for (int i = 0; i < numObjects; i++) { + rct_object_filters *filter = get_object_filter(i); + int type = entry->flags & 0x0F; + int source = (entry->flags & 0xF0) >> 4; + if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { + currentListItem->entry = entry; + currentListItem->filter = filter; + currentListItem->flags = itemFlags; + currentListItem++; + _numListItems++; + } + + entry = object_get_next(entry); + itemFlags++; + } + + _listItems = realloc(_listItems, _numListItems * sizeof(list_item)); + + qsort(_listItems, _numListItems, sizeof(list_item), visible_list_sort_ride_type); +} + + + /** * * rct2: 0x006AA64E @@ -280,7 +347,7 @@ void window_editor_object_selection_open() 400, (uint32*)window_editor_object_selection_events, WC_EDITOR_OBJECT_SELECTION, - WF_10 + WF_10 | WF_RESIZABLE ); window->widgets = window_editor_object_selection_widgets; @@ -303,6 +370,12 @@ void window_editor_object_selection_open() window->selected_tab = 0; window->selected_list_item = -1; window->var_494 = 0xFFFFFFFF; + window->min_width = 600; + window->min_height = 400; + window->max_width = 1200; + window->max_height = 1000; + + visible_list_refresh(window); } /* rct2: 0x006ABCD1 */ @@ -646,6 +719,8 @@ static void window_editor_object_selection_close() gSilentResearch = false; } window_new_ride_init_vars(); + + visible_list_dispose(); } /** @@ -703,6 +778,7 @@ static void window_editor_object_selection_mouseup() _filter_flags |= (1 << (widgetIndex - WIDX_FILTER_RIDE_TAB_TRANSPORT + 5)); filter_update_counts(); + visible_list_refresh(w); w->selected_list_item = -1; w->var_494 = 0xFFFFFFFF; @@ -739,6 +815,15 @@ static void window_editor_object_selection_mouseup() } } +static void window_editor_object_selection_resize() +{ + rct_window *w; + + window_get_register(w); + + window_set_resize(w, 600, 400, 1200, 1000); +} + void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { int num_items; @@ -803,18 +888,13 @@ static void window_editor_object_selection_scrollgetsize() { rct_window *w; short scrollIndex; - int numItems, width, height; + int width, height; window_scroll_get_registers(w, scrollIndex); - numItems = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER) ? - RCT2_GLOBAL(0x00F43412, uint16) : - ((_FILTER_ALL && _filter_string[0] == 0) ? - RCT2_ADDRESS(0x00F433E1, uint16)[w->selected_tab] : - _filter_object_counts[w->selected_tab]); - width = 0; - height = numItems * 12; + height = _numListItems * 12; + window_scrollsize_set_registers(width, height); } @@ -953,8 +1033,28 @@ static void window_editor_object_selection_invalidate() rct_widget *widget; window_get_register(w); + colour_scheme_update(w); + // Resize widgets + w->widgets[WIDX_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_BACKGROUND].bottom = w->height - 1; + w->widgets[WIDX_TITLE].right = w->width - 2; + w->widgets[WIDX_CLOSE].left = w->width - 13; + w->widgets[WIDX_CLOSE].right = w->width - 3; + w->widgets[WIDX_TAB_CONTENT_PANEL].right = w->width - 1; + w->widgets[WIDX_TAB_CONTENT_PANEL].bottom = w->height - 1; + w->widgets[WIDX_DROPDOWN1].left = w->width - 130; + w->widgets[WIDX_DROPDOWN1].right = w->width - 9; + w->widgets[WIDX_LIST].right = w->width - 309; + w->widgets[WIDX_LIST].bottom = w->height - 14; + w->widgets[WIDX_PREVIEW].left = w->width - 209; + w->widgets[WIDX_PREVIEW].right = w->width - 96; + w->widgets[WIDX_DROPDOWN2].left = w->width - 216; + w->widgets[WIDX_DROPDOWN2].right = w->width - 130; + w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250; + w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; + // Set pressed widgets w->pressed_widgets |= 1 << WIDX_PREVIEW; window_editor_object_selection_set_pressed_tab(w); @@ -1006,8 +1106,8 @@ static void window_editor_object_selection_invalidate() x = 300; } - w->widgets[WIDX_LIST].right = 587 - x; - w->widgets[WIDX_PREVIEW].left = 537 - (x >> 1); + w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x; + w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2); w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113; bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); @@ -1031,7 +1131,7 @@ static void window_editor_object_selection_invalidate() w->pressed_widgets |= (uint64)(1 << (WIDX_FILTER_RIDE_TAB_TRANSPORT + i)); } } - w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_RESIZE; + w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_IMGBTN; for (int i = WIDX_FILTER_RIDE_TAB_ALL; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_TAB; } @@ -1249,14 +1349,10 @@ static void window_editor_object_selection_paint() */ static void window_editor_object_selection_scrollpaint() { - int x, y, i, colour, colour2, numObjects, type; + int x, y, i, colour, colour2; short scrollIndex; - rct_object_entry *entry; - rct_object_filters *filter; rct_window *w; rct_drawpixelinfo *dpi; - uint8 *itemFlags; - uint8 source; window_scrollpaint_get_registers(w, dpi, scrollIndex); @@ -1264,65 +1360,64 @@ static void window_editor_object_selection_scrollpaint() colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); - numObjects = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, sint32); - entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - itemFlags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); y = 0; - for (i = 0; i < numObjects; i++) { - filter = get_object_filter(i); - type = entry->flags & 0x0F; - source = (entry->flags & 0xF0) >> 4; - if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry) && filter_chunks(entry, filter)) { - if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) { - // Draw checkbox - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*itemFlags & 0x20)) - gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0); + for (i = 0; i < _numListItems; i++) { + list_item *listItem = &_listItems[i]; - // Highlight background - colour = 142; - if (entry == (rct_object_entry*)w->var_494 && !(*itemFlags & OBJECT_SELECTION_FLAG_6)) { - gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031); - colour = 14; - } + if (y + 12 >= dpi->y && y <= dpi->y + dpi->height) { + // Draw checkbox + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && !(*listItem->flags & 0x20)) + gfx_fill_rect_inset(dpi, 2, y, 11, y + 10, w->colours[1], 0xE0); - // Draw checkmark - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*itemFlags & OBJECT_SELECTION_FLAG_SELECTED)) { - x = 2; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1; - colour2 = w->colours[1] & 0x7F; - if (*itemFlags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) - colour2 |= 0x40; - - gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); - } - - // Draw text - char *buffer = (char*)0x0141ED68; - *buffer = colour; - strcpy(buffer + 1, object_get_name(entry)); - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - while (*buffer != 0 && *buffer != 9) - buffer++; - - *buffer = 0; - } - - if (*itemFlags & OBJECT_SELECTION_FLAG_6) { - colour = w->colours[1] & 0x7F; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; - } - else { - colour = 0; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; - } - x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; - gfx_draw_string(dpi, (char*)0x0141ED68, colour, x, y); + // Highlight background + colour = 142; + if (listItem->entry == (rct_object_entry*)w->var_494 && !(*listItem->flags & OBJECT_SELECTION_FLAG_6)) { + gfx_fill_rect(dpi, 0, y, w->width, y + 11, 0x2000031); + colour = 14; } - y += 12; - } - entry = object_get_next(entry); - itemFlags++; + // Draw checkmark + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && (*listItem->flags & OBJECT_SELECTION_FLAG_SELECTED)) { + x = 2; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = colour == 14 ? -2 : -1; + colour2 = w->colours[1] & 0x7F; + if (*listItem->flags & (OBJECT_SELECTION_FLAG_IN_USE | OBJECT_SELECTION_FLAG_REQUIRED | OBJECT_SELECTION_FLAG_ALWAYS_REQUIRED)) + colour2 |= 0x40; + + gfx_draw_string(dpi, (char*)0x009DED72, colour2, x, y); + } + + x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 15; + + char *bufferWithColour = (char*)0x0141ED68; + char *buffer = bufferWithColour + 1; + bufferWithColour[0] = colour; + if (*listItem->flags & OBJECT_SELECTION_FLAG_6) { + colour = w->colours[1] & 0x7F; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = -1; + } + else { + colour = 0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; + } + + // Draw ride type + strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + + x += 200; + + // Draw text + strcpy(buffer, object_get_name(listItem->entry)); + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + while (*buffer != 0 && *buffer != 9) + buffer++; + + *buffer = 0; + } + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + } + y += 12; } } @@ -1715,27 +1810,14 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct */ static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry) { - rct_object_filters *filter; - *installed_entry = RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, rct_object_entry*); - uint8* selection_flags = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*); - uint8 source; - int object_count = 0; - for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ - filter = get_object_filter(RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32) - i); - source = ((*installed_entry)->flags & 0xF0) >> 4; - if (((*installed_entry)->flags & 0xF) == object_type && filter_source(*installed_entry) && filter_string(*installed_entry) && filter_chunks(*installed_entry, filter)){ - if (!(*selection_flags & OBJECT_SELECTION_FLAG_6)){ - y -= 12; - *object_selection_flags = *selection_flags; - if (y < 0)return object_count; - object_count++; - } - } + int listItemIndex = y / 12; + if (listItemIndex < 0 || listItemIndex >= _numListItems) + return -1; - *installed_entry = object_get_next(*installed_entry); - selection_flags++; - } - return -1; + list_item *listItem = &_listItems[listItemIndex]; + *object_selection_flags = *listItem->flags; + *installed_entry = listItem->entry; + return listItemIndex; } /** From 2e47f2a26a814ce29fbdf5cb57b76aa3781edf70 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 26 Jun 2015 01:11:24 +0100 Subject: [PATCH 02/16] object-selection-columns: finish sorting and add ride tab animations --- data/language/english_uk.txt | 2 + src/localisation/string_ids.h | 3 + src/windows/editor_object_selection.c | 215 ++++++++++++++++++++------ 3 files changed, 175 insertions(+), 45 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0a2e5fd020..24f2a80331 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,3 +3780,5 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get +STR_5447 :Type {STRINGID} +STR_5448 :Ride / Vehicle {STRINGID} diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a1029e0da5..cc465584ef 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1550,6 +1550,9 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_OBJECTS_SORT_TYPE = 5447, + STR_OBJECTS_SORT_RIDE = 5448, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 5841106e57..3fd65d5b13 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -32,7 +32,6 @@ #include "../interface/themes.h" #include "dropdown.h" - enum { FILTER_RCT2 = (1 << 0), FILTER_WW = (1 << 1), @@ -95,10 +94,10 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX { WIDX_TAB_9, // 12, 1000 WIDX_TAB_10, // 13, 2000 WIDX_TAB_11, // 14, 4000 - WIDX_DROPDOWN1, // 15, 8000 + WIDX_ADVANCED, // 15, 8000 WIDX_LIST, // 16, 10000 WIDX_PREVIEW, // 17, 20000 - WIDX_DROPDOWN2, // 18, 40000 + WIDX_INSTALL_TRACK, // 18, 40000 WIDX_FILTER_DROPDOWN, // 19, 80000 WIDX_FILTER_STRING_BUTTON, // 20, 100000 WIDX_FILTER_CLEAR_BUTTON, // 21, 200000 @@ -109,7 +108,9 @@ enum WINDOW_STAFF_LIST_WIDGET_IDX { WIDX_FILTER_RIDE_TAB_COASTER, WIDX_FILTER_RIDE_TAB_THRILL, WIDX_FILTER_RIDE_TAB_WATER, - WIDX_FILTER_RIDE_TAB_STALL + WIDX_FILTER_RIDE_TAB_STALL, + WIDX_LIST_SORT_TYPE, + WIDX_LIST_SORT_RIDE, }; static rct_widget window_editor_object_selection_widgets[] = { @@ -143,6 +144,8 @@ static rct_widget window_editor_object_selection_widgets[] = { { WWT_TAB, 1, 127, 157, 47, 73, 0x2000144E, 1226 }, { WWT_TAB, 1, 158, 188, 47, 73, 0x2000144E, 1227 }, { WWT_TAB, 1, 189, 219, 47, 73, 0x2000144E, 1228 }, + { WWT_13, 1, 4, 204, 80, 93, STR_NONE, STR_NONE }, + { WWT_13, 1, 205, 291, 80, 93, STR_NONE, STR_NONE }, { WIDGETS_END } }; @@ -200,6 +203,9 @@ static void* window_editor_object_selection_events[] = { #pragma endregion +const int window_editor_object_selection_animation_loops[] = { 20, 32, 10, 72, 24, 28, 16 }; +const int window_editor_object_selection_animation_divisor[] = { 4, 8, 2, 4, 4, 4, 2 }; + static void window_editor_object_set_page(rct_window *w, int page); static void window_editor_object_selection_set_pressed_tab(rct_window *w); static void window_editor_object_selection_select_default_objects(); @@ -219,13 +225,13 @@ static int sub_6AB211(); static rct_object_entry RequiredSelectedObjects[] = { // Objects that are always required - { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees - { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments - { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens - { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls - { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs - { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths - { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac + { 0x00000087, { "SCGTREES" }, 0 }, // Scenery: Trees + { 0x00000087, { "SCGSHRUB" }, 0 }, // Scenery: Shrubs and Ornaments + { 0x00000087, { "SCGGARDN" }, 0 }, // Scenery: Gardens + { 0x00000087, { "SCGFENCE" }, 0 }, // Scenery: Fences and Walls + { 0x00000087, { "SCGWALLS" }, 0 }, // Scenery: Walls and Roofs + { 0x00000087, { "SCGPATHX" }, 0 }, // Scenery: Signs and Items for Footpaths + { 0x00000085, { "TARMAC " }, 0 }, // Footpath: Tarmac }; static rct_object_entry DefaultSelectedObjects[] = { @@ -260,6 +266,10 @@ static rct_object_entry DefaultSelectedObjects[] = { { 0x00000087, { "SCGWATER" }, 0 } // Water Feature Themeing }; +enum { + RIDE_SORT_TYPE, + RIDE_SORT_RIDE +}; typedef struct { rct_object_entry *entry; @@ -267,8 +277,12 @@ typedef struct { uint8 *flags; } list_item; +typedef int (*sortFunc)(const void *, const void *); + static int _numListItems = 0; static list_item *_listItems = NULL; +static int _listSortType = RIDE_SORT_TYPE; +static bool _listSortDescending = false; static void visible_list_dispose() { @@ -276,7 +290,17 @@ static void visible_list_dispose() _numListItems = 0; } -static int visible_list_sort_ride_type(const void *rawA, const void *rawB) +static int visible_list_sort_ride_name(const void *rawA, const void *rawB) +{ + list_item *a = (list_item*)rawA; + list_item *b = (list_item*)rawB; + + const char *nameA = object_get_name(a->entry); + const char *nameB = object_get_name(b->entry); + return strcmp(nameA, nameB); +} + +static int visible_list_sort_ride_type(const void *rawA, const void *rawB) { list_item *a = (list_item*)rawA; list_item *b = (list_item*)rawB; @@ -287,9 +311,7 @@ static int visible_list_sort_ride_type(const void *rawA, const void *rawB) if (result != 0) return result; - const char *nameA = object_get_name(a->entry); - const char *nameB = object_get_name(b->entry); - return strcmp(nameA, nameB); + return visible_list_sort_ride_name(rawA, rawB); } static void visible_list_refresh(rct_window *w) @@ -321,11 +343,29 @@ static void visible_list_refresh(rct_window *w) _listItems = realloc(_listItems, _numListItems * sizeof(list_item)); - qsort(_listItems, _numListItems, sizeof(list_item), visible_list_sort_ride_type); + sortFunc sortFunc; + switch (_listSortType) { + case RIDE_SORT_TYPE: + sortFunc = visible_list_sort_ride_type; + break; + case RIDE_SORT_RIDE: + sortFunc = visible_list_sort_ride_name; + break; + } + qsort(_listItems, _numListItems, sizeof(list_item), sortFunc); + + if (_listSortDescending) { + for (int i = 0; i < _numListItems / 2; i++) { + int ri = _numListItems - i - 1; + list_item temp = _listItems[i]; + _listItems[i] = _listItems[ri]; + _listItems[ri] = temp; + } + } + + window_invalidate(w); } - - /** * * rct2: 0x006AA64E @@ -352,12 +392,14 @@ void window_editor_object_selection_open() window->widgets = window_editor_object_selection_widgets; window->enabled_widgets = - (1 << WIDX_DROPDOWN1) | - (1 << WIDX_DROPDOWN2) | + (1 << WIDX_ADVANCED) | + (1 << WIDX_INSTALL_TRACK) | (1 << WIDX_FILTER_DROPDOWN) | (1 << WIDX_FILTER_STRING_BUTTON) | (1 << WIDX_FILTER_CLEAR_BUTTON) | - (1 << WIDX_CLOSE); + (1 << WIDX_CLOSE) | + (1 << WIDX_LIST_SORT_TYPE) | + (1 << WIDX_LIST_SORT_RIDE); _filter_flags = FILTER_ALL; memset(_filter_string, 0, sizeof(_filter_string)); @@ -761,6 +803,7 @@ static void window_editor_object_selection_mouseup() case WIDX_FILTER_RIDE_TAB_ALL: _filter_flags |= 0x7E0; filter_update_counts(); + visible_list_refresh(w); w->selected_list_item = -1; w->var_494 = 0xFFFFFFFF; @@ -787,12 +830,12 @@ static void window_editor_object_selection_mouseup() window_invalidate(w); break; - case WIDX_DROPDOWN1: + case WIDX_ADVANCED: w->list_information_type ^= 1; window_invalidate(w); break; - case WIDX_DROPDOWN2: + case WIDX_INSTALL_TRACK: if (w->selected_list_item != -1) { w->selected_list_item = -1; object_free_scenario_text(); @@ -812,6 +855,24 @@ static void window_editor_object_selection_mouseup() window_invalidate(w); break; + case WIDX_LIST_SORT_TYPE: + if (_listSortType == RIDE_SORT_TYPE) { + _listSortDescending = !_listSortDescending; + } else { + _listSortType = RIDE_SORT_TYPE; + _listSortDescending = false; + } + visible_list_refresh(w); + break; + case WIDX_LIST_SORT_RIDE: + if (_listSortType == RIDE_SORT_RIDE) { + _listSortDescending = !_listSortDescending; + } else { + _listSortType = RIDE_SORT_RIDE; + _listSortDescending = false; + } + visible_list_refresh(w); + break; } } @@ -875,6 +936,7 @@ static void window_editor_object_selection_dropdown() filter_update_counts(); w->scrolls->v_top = 0; + visible_list_refresh(w); window_invalidate(w); break; } @@ -1044,14 +1106,14 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_CLOSE].right = w->width - 3; w->widgets[WIDX_TAB_CONTENT_PANEL].right = w->width - 1; w->widgets[WIDX_TAB_CONTENT_PANEL].bottom = w->height - 1; - w->widgets[WIDX_DROPDOWN1].left = w->width - 130; - w->widgets[WIDX_DROPDOWN1].right = w->width - 9; + w->widgets[WIDX_ADVANCED].left = w->width - 130; + w->widgets[WIDX_ADVANCED].right = w->width - 9; w->widgets[WIDX_LIST].right = w->width - 309; w->widgets[WIDX_LIST].bottom = w->height - 14; w->widgets[WIDX_PREVIEW].left = w->width - 209; w->widgets[WIDX_PREVIEW].right = w->width - 96; - w->widgets[WIDX_DROPDOWN2].left = w->width - 216; - w->widgets[WIDX_DROPDOWN2].right = w->width - 130; + w->widgets[WIDX_INSTALL_TRACK].left = w->width - 216; + w->widgets[WIDX_INSTALL_TRACK].right = w->width - 130; w->widgets[WIDX_FILTER_DROPDOWN].left = w->width - 250; w->widgets[WIDX_FILTER_DROPDOWN].right = w->width - 137; @@ -1059,24 +1121,24 @@ static void window_editor_object_selection_invalidate() w->pressed_widgets |= 1 << WIDX_PREVIEW; window_editor_object_selection_set_pressed_tab(w); if (w->list_information_type & 1) - w->pressed_widgets |= (1 << WIDX_DROPDOWN1); + w->pressed_widgets |= (1 << WIDX_ADVANCED); else - w->pressed_widgets &= ~(1 << WIDX_DROPDOWN1); + w->pressed_widgets &= ~(1 << WIDX_ADVANCED); // Set window title and buttons RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, rct_string_id) = STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS + w->selected_tab; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { w->widgets[WIDX_TITLE].image = STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE; w->widgets[WIDX_CLOSE].type = WWT_EMPTY; - w->widgets[WIDX_DROPDOWN2].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_DROPDOWN_BUTTON; } else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) { w->widgets[WIDX_TITLE].image = STR_ROLLER_COASTER_DESIGNER_SELECT_RIDE_TYPES_VEHICLES; w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX; - w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY; } else { w->widgets[WIDX_TITLE].image = STR_OBJECT_SELECTION; w->widgets[WIDX_CLOSE].type = WWT_CLOSEBOX; - w->widgets[WIDX_DROPDOWN2].type = WWT_EMPTY; + w->widgets[WIDX_INSTALL_TRACK].type = WWT_EMPTY; } // Align tabs, hide advanced ones @@ -1095,13 +1157,13 @@ static void window_editor_object_selection_invalidate() } if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TRACK_DESIGNER)) { - w->widgets[WIDX_DROPDOWN1].type = WWT_EMPTY; + w->widgets[WIDX_ADVANCED].type = WWT_EMPTY; w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_EMPTY; for (i = 1; i < WINDOW_OBJECT_SELECTION_PAGE_COUNT; i++) w->widgets[WIDX_TAB_1 + i].type = WWT_EMPTY; x = 150; } else { - w->widgets[WIDX_DROPDOWN1].type = WWT_DROPDOWN_BUTTON; + w->widgets[WIDX_ADVANCED].type = WWT_DROPDOWN_BUTTON; w->widgets[WIDX_FILTER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; x = 300; } @@ -1109,11 +1171,15 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_LIST].right = w->width - (600 - 587) - x; w->widgets[WIDX_PREVIEW].left = w->width - (600 - 537) - (x / 2); w->widgets[WIDX_PREVIEW].right = w->widgets[WIDX_PREVIEW].left + 113; + w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].right = w->widgets[WIDX_LIST].right; bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); - w->widgets[WIDX_LIST].top = (ridePage ? 94 : 60); + w->widgets[WIDX_LIST].top = (ridePage ? 118 : 60); + w->widgets[WIDX_FILTER_STRING_BUTTON].right = w->widgets[WIDX_LIST].right - 77; w->widgets[WIDX_FILTER_STRING_BUTTON].top = (ridePage ? 80 : 46); w->widgets[WIDX_FILTER_STRING_BUTTON].bottom = (ridePage ? 91 : 57); + w->widgets[WIDX_FILTER_CLEAR_BUTTON].left = w->widgets[WIDX_LIST].right - 73; + w->widgets[WIDX_FILTER_CLEAR_BUTTON].right = w->widgets[WIDX_LIST].right; w->widgets[WIDX_FILTER_CLEAR_BUTTON].top = (ridePage ? 80 : 46); w->widgets[WIDX_FILTER_CLEAR_BUTTON].bottom = (ridePage ? 91 : 57); @@ -1134,13 +1200,24 @@ static void window_editor_object_selection_invalidate() w->widgets[WIDX_FILTER_RIDE_TAB_FRAME].type = WWT_IMGBTN; for (int i = WIDX_FILTER_RIDE_TAB_ALL; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_TAB; - } - else { + + w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_13; + w->widgets[WIDX_LIST_SORT_TYPE].top = w->widgets[WIDX_FILTER_STRING_BUTTON].bottom + 3; + w->widgets[WIDX_LIST_SORT_TYPE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].top + 13; + w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_13; + w->widgets[WIDX_LIST_SORT_RIDE].top = w->widgets[WIDX_LIST_SORT_TYPE].top; + w->widgets[WIDX_LIST_SORT_RIDE].bottom = w->widgets[WIDX_LIST_SORT_TYPE].bottom; + w->widgets[WIDX_LIST_SORT_RIDE].right = w->widgets[WIDX_LIST].right; + w->widgets[WIDX_LIST].top = w->widgets[WIDX_LIST_SORT_TYPE].bottom + 2; + } else { w->enabled_widgets &= ~((1 << WIDX_FILTER_RIDE_TAB_ALL) | (1 << WIDX_FILTER_RIDE_TAB_TRANSPORT) | (1 << WIDX_FILTER_RIDE_TAB_GENTLE) | (1 << WIDX_FILTER_RIDE_TAB_COASTER) | (1 << WIDX_FILTER_RIDE_TAB_THRILL) | (1 << WIDX_FILTER_RIDE_TAB_WATER) | (1 << WIDX_FILTER_RIDE_TAB_STALL)); for (int i = WIDX_FILTER_RIDE_TAB_FRAME; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) w->widgets[i].type = WWT_EMPTY; + + w->widgets[WIDX_LIST_SORT_TYPE].type = WWT_EMPTY; + w->widgets[WIDX_LIST_SORT_RIDE].type = WWT_EMPTY; } } @@ -1185,18 +1262,28 @@ static void window_editor_object_selection_paint() gfx_draw_sprite(dpi, 5458 + i, x, y, 0); } - const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557 + 5, 5551, 5530, 5327 }; + const int ride_tabs[] = { 5458, 0x200015A1, 5542, 0x200015AA, 5557, 5551, 5530, 5327 }; + const int ThrillRidesTabAnimationSequence[] = { + 5, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0 + }; // Draw ride tabs if (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { for (i = 0; i < 7; i++) { - widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i]; + widget = &w->widgets[WIDX_FILTER_RIDE_TAB_ALL + i]; if (widget->type == WWT_EMPTY) continue; + int spriteIndex = ride_tabs[i]; + int frame = 0; + if (w->pressed_widgets & (1ULL << (WIDX_FILTER_RIDE_TAB_ALL + i))) { + frame = w->frame_no / window_editor_object_selection_animation_divisor[i - 1]; + } + spriteIndex += (i == 4 ? ThrillRidesTabAnimationSequence[frame] : frame); + x = w->x + widget->left; y = w->y + widget->top; - gfx_draw_sprite(dpi, ride_tabs[i] | (w->colours[1] << 19), x, y, 0); + gfx_draw_sprite(dpi, spriteIndex | (w->colours[1] << 19), x, y, 0); } } @@ -1249,6 +1336,18 @@ static void window_editor_object_selection_paint() w->x + window_editor_object_selection_widgets[WIDX_FILTER_STRING_BUTTON].right );*/ + // Draw sort button text + widget = &w->widgets[WIDX_LIST_SORT_TYPE]; + if (widget->type != WWT_EMPTY) { + stringId = _listSortType == RIDE_SORT_TYPE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE; + gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_TYPE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left); + } + widget = &w->widgets[WIDX_LIST_SORT_RIDE]; + if (widget->type != WWT_EMPTY) { + stringId = _listSortType == RIDE_SORT_RIDE ? (_listSortDescending ? STR_DOWN : STR_UP) : STR_NONE; + gfx_draw_string_left_clipped(dpi, STR_OBJECTS_SORT_RIDE, &stringId, w->colours[1], w->x + widget->left + 1, w->y + widget->top + 1, widget->right - widget->left); + } + if (w->selected_list_item == -1 || stex_entry == NULL) return; @@ -1356,6 +1455,8 @@ static void window_editor_object_selection_scrollpaint() window_scrollpaint_get_registers(w, dpi, scrollIndex); + bool ridePage = (w->selected_tab == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS); + colour = RCT2_ADDRESS(0x0141FC48, uint8)[w->colours[1] * 8]; colour = (colour << 24) | (colour << 16) | (colour << 8) | colour; gfx_clear(dpi, colour); @@ -1401,11 +1502,12 @@ static void window_editor_object_selection_scrollpaint() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, sint16) = 224; } - // Draw ride type - strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); - gfx_draw_string(dpi, bufferWithColour, colour, x, y); - - x += 200; + if (ridePage) { + // Draw ride type + strcpy(buffer, language_get_string(2 + listItem->filter->ride.ride_type)); + gfx_draw_string(dpi, bufferWithColour, colour, x, y); + x = w->widgets[WIDX_LIST_SORT_RIDE].left - w->widgets[WIDX_LIST].left; + } // Draw text strcpy(buffer, object_get_name(listItem->entry)); @@ -1431,6 +1533,16 @@ static void window_editor_object_set_page(rct_window *w, int page) w->var_494 = 0xFFFFFFFF; w->scrolls[0].v_top = 0; object_free_scenario_text(); + + if (page == WINDOW_OBJECT_SELECTION_PAGE_RIDE_VEHICLES_ATTRACTIONS) { + _listSortType = RIDE_SORT_TYPE; + _listSortDescending = false; + } else { + _listSortType = RIDE_SORT_RIDE; + _listSortDescending = false; + } + + visible_list_refresh(w); window_invalidate(w); } @@ -1893,6 +2005,18 @@ static void window_editor_object_selection_update(rct_window *w) window_update_textbox_caret(); widget_invalidate(w, WIDX_FILTER_STRING_BUTTON); } + + for (int i = WIDX_FILTER_RIDE_TAB_TRANSPORT; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) { + if (!(w->pressed_widgets & (1ULL << i))) + continue; + + w->frame_no++; + if (w->frame_no >= window_editor_object_selection_animation_loops[i - WIDX_FILTER_RIDE_TAB_TRANSPORT]) + w->frame_no = 0; + + widget_invalidate(w, i); + break; + } } static void window_editor_object_selection_textinput() @@ -1922,6 +2046,7 @@ static void window_editor_object_selection_textinput() w->scrolls->v_top = 0; + visible_list_refresh(w); window_invalidate(w); } From 9ad21599a3dd54e5af4d40d84e9c822330d6ff70 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:40:37 -0400 Subject: [PATCH 03/16] Decompiled top_toolbar tool events Also fixed bug with land rights tool gridlines --- src/interface/viewport.c | 2 ++ src/windows/park.c | 3 ++- src/windows/top_toolbar.c | 55 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index da47e8b24d..a8ea40fbbf 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2170,6 +2170,7 @@ void show_gridlines() } } RCT2_GLOBAL(0x009E32B0, uint8)++; + printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); } /** @@ -2181,6 +2182,7 @@ void hide_gridlines() rct_window *mainWindow; RCT2_GLOBAL(0x009E32B0, uint8)--; + printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); if (RCT2_GLOBAL(0x009E32B0, uint8) == 0) { if ((mainWindow = window_get_main()) != NULL) { if (!gConfigGeneral.always_show_gridlines) { diff --git a/src/windows/park.c b/src/windows/park.c index 27318ce991..c22e6c127c 100644 --- a/src/windows/park.c +++ b/src/windows/park.c @@ -1176,7 +1176,8 @@ static void window_park_init_viewport(rct_window *w) void toggle_land_rights_window(rct_window *parkWindow, int widgetIndex) { - if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == 1 && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == 14) { + if ((RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, uint8) == WC_PARK_INFORMATION && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) == WIDX_BUY_LAND_RIGHTS) { tool_cancel(); } else { diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index bf256a54a2..3ef453ca1c 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -178,6 +178,8 @@ static void window_top_toolbar_dropdown(); static void window_top_toolbar_tool_update(); static void window_top_toolbar_tool_down(); static void window_top_toolbar_tool_drag(); +static void window_top_toolbar_tool_up(); +static void window_top_toolbar_tool_abort(); static void window_top_toolbar_invalidate(); static void window_top_toolbar_paint(); @@ -194,8 +196,8 @@ static void* window_top_toolbar_events[] = { window_top_toolbar_tool_update, // editor: 0x0066fB0E window_top_toolbar_tool_down, // editor: 0x0066fB5C window_top_toolbar_tool_drag, // editor: 0x0066fB37 - (void*)0x0066CC5B, // editor: 0x0066fC44 - (void*)0x0066CA58, // editor: 0x0066fA74 + window_top_toolbar_tool_up, // editor: 0x0066fC44 (Exactly the same) + window_top_toolbar_tool_abort, // editor: 0x0066fA74 (Exactly the same) window_top_toolbar_emptysub, window_top_toolbar_emptysub, window_top_toolbar_emptysub, @@ -2723,6 +2725,55 @@ static void window_top_toolbar_tool_drag() } } +/** + * + * rct2: 0x0066CC5B + */ +static void window_top_toolbar_tool_up() +{ + short widgetIndex, x, y; + rct_window *w; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_LAND: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x12; + break; + case WIDX_WATER: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x13; + break; + case WIDX_CLEAR_SCENERY: + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= 0xFFFE; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8) = 0x0C; + break; + } +} + +/** + * + * rct2: 0x0066CA58 + */ +static void window_top_toolbar_tool_abort() +{ + short widgetIndex, x, y; + rct_window* w; + + window_tool_get_registers(w, widgetIndex, x, y); + + switch (widgetIndex) { + case WIDX_LAND: + case WIDX_WATER: + case WIDX_CLEAR_SCENERY: + hide_gridlines(); + break; + } +} void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { int num_items = 4; From c20b60652c3cc5fbbf43c46d9bbb50d9166e3ec0 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:47:03 -0400 Subject: [PATCH 04/16] Removed printfs --- src/interface/viewport.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a8ea40fbbf..da47e8b24d 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -2170,7 +2170,6 @@ void show_gridlines() } } RCT2_GLOBAL(0x009E32B0, uint8)++; - printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); } /** @@ -2182,7 +2181,6 @@ void hide_gridlines() rct_window *mainWindow; RCT2_GLOBAL(0x009E32B0, uint8)--; - printf("gridline_state: %i\n", RCT2_GLOBAL(0x009E32B0, uint8)); if (RCT2_GLOBAL(0x009E32B0, uint8) == 0) { if ((mainWindow = window_get_main()) != NULL) { if (!gConfigGeneral.always_show_gridlines) { From ab7e1da84e77c63584ca94b8a41e1882db3d469f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Fri, 26 Jun 2015 17:45:38 +0100 Subject: [PATCH 05/16] Implemented object unload. Refactored calls to the function. No need to pass the object type. --- src/editor.c | 4 ++-- src/object.c | 14 ++++++++++++-- src/object.h | 2 +- src/object_list.c | 6 +++--- src/windows/editor_object_selection.c | 2 +- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/editor.c b/src/editor.c index 4e0f050764..25761f88cb 100644 --- a/src/editor.c +++ b/src/editor.c @@ -151,7 +151,7 @@ void editor_convert_save_to_scenario() rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); @@ -501,7 +501,7 @@ static int editor_read_s6(const char *path) rct_stex_entry* stex = g_stexEntries[0]; if ((int)stex != 0xFFFFFFFF) { - object_unload(0, &object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); + object_unload((rct_object_entry*)&object_entry_groups[OBJECT_TYPE_SCENARIO_TEXT].entries[0]); reset_loaded_objects(); format_string(s6Info->details, STR_NO_DETAILS_YET, NULL); diff --git a/src/object.c b/src/object.c index 84004d2ac2..98e8fed918 100644 --- a/src/object.c +++ b/src/object.c @@ -333,9 +333,19 @@ int object_load_packed(FILE *file) * * rct2: 0x006A9CAF */ -void object_unload(int groupIndex, rct_object_entry_extended *entry) +void object_unload(rct_object_entry *entry) { - RCT2_CALLPROC_X(0x006A9CAF, 0, groupIndex, 0, 0, 0, 0, (int)entry); + uint8 object_type, object_index; + if (!find_object_in_entry_group(entry, &object_type, &object_index)){ + return; + } + + uint8* chunk = object_entry_groups[object_type].chunks[object_index]; + + object_paint(object_type, 1, 0, 0, 0, (int)chunk, 0, 0); + + rct2_free(chunk); + object_entry_groups[object_type].chunks[object_index] = (char*)-1; } int object_entry_compare(const rct_object_entry *a, const rct_object_entry *b) diff --git a/src/object.h b/src/object.h index cf5b735d61..83c07855b7 100644 --- a/src/object.h +++ b/src/object.h @@ -101,7 +101,7 @@ void object_unload_all(); int check_object_entry(rct_object_entry *entry); int object_load(int groupIndex, rct_object_entry *entry, int* chunk_size); int object_load_file(int groupIndex, const rct_object_entry *entry, int* chunkSize, const rct_object_entry *installedObject); -void object_unload(int groupIndex, rct_object_entry_extended *entry); +void object_unload(rct_object_entry *entry); int object_get_scenario_text(rct_object_entry *entry); void object_free_scenario_text(); int object_get_length(rct_object_entry *entry); diff --git a/src/object_list.c b/src/object_list.c index d2a8dc5304..cb2e2834c6 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -576,7 +576,7 @@ void object_unload_all() for (i = 0; i < OBJECT_ENTRY_GROUP_COUNT; i++) for (j = 0; j < object_entry_group_counts[i]; j++) if (object_entry_groups[i].chunks[j] != (uint8*)0xFFFFFFFF) - object_unload(j, &object_entry_groups[i].entries[j]); + object_unload((rct_object_entry*)&object_entry_groups[i].entries[j]); reset_loaded_objects(); } @@ -727,7 +727,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in log_error("Incorrect number of vanilla RCT2 objects."); RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32)--; RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32)--; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return 0; } } @@ -788,7 +788,7 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in uint32 size_of_object = installed_entry_pointer - (uint8*)installed_entry; - object_unload(objectType, (rct_object_entry_extended*)entry); + object_unload(entry); return size_of_object; } diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index f69aa0ba1c..a3b1e05aa4 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -608,7 +608,7 @@ void unload_unselected_objects(){ for (int i = RCT2_GLOBAL(RCT2_ADDRESS_OBJECT_LIST_NO_ITEMS, uint32); i > 0; --i){ if (!(*selection_flags & OBJECT_SELECTION_FLAG_SELECTED)){ remove_selected_objects_from_research(installedObject); - object_unload(0, (rct_object_entry_extended*)installedObject); + object_unload(installedObject); } selection_flags++; installedObject = object_get_next(installedObject); From c00df00801dfbe0843fd69507362160cdf0fc9b9 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 27 Jun 2015 04:00:15 +0100 Subject: [PATCH 06/16] Merge Localisation/master into OpenRCT2/develop. --- data/language/german.txt | 85 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/data/language/german.txt b/data/language/german.txt index 1da26e6c23..0ad49e4e4f 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -1160,7 +1160,7 @@ STR_1155 :Höhenmarkierungen an Fußwegen STR_1156 :{MOVE_X}{SMALLFONT}{STRINGID} STR_1157 :{TICK}{MOVE_X}{SMALLFONT}{STRINGID} STR_1158 :Kann nicht entfernt werden... -STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und andere Objekte +STR_1159 :{SMALLFONT}{BLACK}Platzieren Sie Szenerien, Beete und{NEWLINE}andere Objekte STR_1160 :{SMALLFONT}{BLACK}Seen & Wasseranlagen erstellen/anpassen STR_1161 :Kann hier nicht positioniert werden... STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} @@ -1709,7 +1709,7 @@ STR_1704 :Es kann kein neuer Mitarbeiter eingestellt werden... STR_1705 :{SMALLFONT}{BLACK}Diesen Mitarbeiter entlassen STR_1706 :{SMALLFONT}{BLACK}Diese Person an einen anderen Ort befördern STR_1707 :Zu viele Mitarbeiter im Spiel -STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen Mitarbeiter festlegen +STR_1708 :{SMALLFONT}{BLACK}Patrouillenbereich für diesen{NEWLINE}Mitarbeiter festlegen STR_1709 :Mitarbeiter entlassen STR_1710 :Ja STR_1711 :{WINDOW_COLOUR_1}Möchten Sie {STRINGID} wirklich entlassen? @@ -1791,7 +1791,7 @@ STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenkostüm STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditenkostüm STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostüm STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostüm -STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen Mitarbeiter auswählen +STR_1790 :{SMALLFONT}{BLACK}Uniformfarbe für diesen{NEWLINE}Mitarbeiter auswählen STR_1791 :{WINDOW_COLOUR_2}Uniformfarbe: STR_1792 :Antwortet auf {STRINGID} -Störungsruf STR_1793 :Unterwegs zu {STRINGID} für eine Inspektion @@ -1817,16 +1817,16 @@ STR_1812 :{SMALLFONT}{BLACK}{STRINGID} STR_1813 :Verschiedene Objekte STR_1814 :Aktionen STR_1815 :Gedanken -STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Besucherliste angezeigt{NEWLINE}werden soll +STR_1816 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Besucherliste angezeigt{NEWLINE}werden soll STR_1817 :({COMMA16}) STR_1818 :{WINDOW_COLOUR_2}Alle Besucher STR_1819 :{WINDOW_COLOUR_2}Alle Besucher (zusammengefasst) STR_1820 :{WINDOW_COLOUR_2}Besucher {STRINGID} STR_1821 :{WINDOW_COLOUR_2}Besucher denken {STRINGID} STR_1822 :{WINDOW_COLOUR_2}Besucher denken an {POP16}{STRINGID} -STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser Attraktion anzeigen +STR_1823 :{SMALLFONT}{BLACK}Gedanken der Besucher zu dieser{NEWLINE}Attraktion anzeigen STR_1824 :{SMALLFONT}{BLACK}Besucher dieser Attraktion anzeigen -STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese Attraktion anzeigen +STR_1825 :{SMALLFONT}{BLACK}Anstehende Besucher für diese{NEWLINE}Attraktion anzeigen STR_1826 :Status STR_1827 :Popularität STR_1828 :Zufriedenheit @@ -1845,13 +1845,13 @@ STR_1840 :Ausfallzeit: {COMMA16}% STR_1841 :Gewinn: {CURRENCY2DP} pro Stunde STR_1842 :Favorit von: {COMMA16} Besucher STR_1843 :Favorit von: {COMMA16} Besuchern -STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen,{NEWLINE}die in Attraktionsliste angezeigt{NEWLINE}werden soll +STR_1844 :{SMALLFONT}{BLACK}Informationsart auswählen, die{NEWLINE}in Attraktionsliste angezeigt{NEWLINE}werden soll STR_1845 :{MONTHYEAR} STR_1846 :{COMMA16} Besucher STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} Besucher STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} Besucher STR_1849 :{WINDOW_COLOUR_2}Musikwiedergabe -STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese Bahn abgespielt werden soll +STR_1850 :{SMALLFONT}{BLACK}Auswählen, ob Musik für diese{NEWLINE}Bahn abgespielt werden soll STR_1851 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}{CURRENCY2DP} pro Stunde STR_1852 :{WINDOW_COLOUR_2}Betriebskosten: {BLACK}Unbekannt STR_1853 :{WINDOW_COLOUR_2}Erbaut: {BLACK}Dieses Jahr @@ -1891,7 +1891,7 @@ STR_1886 :Inspektion bei {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}{COMMA16} Minuten STR_1888 :{WINDOW_COLOUR_2}Letzte Inspektion vor: {BLACK}mehr als 4 Stunden STR_1889 :{WINDOW_COLOUR_2}Ausfallzeit: {MOVE_X}{255}{BLACK}{COMMA16}% -STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker diese Bahn überprüfen soll +STR_1890 :{SMALLFONT}{BLACK}Auswählen, wie oft ein Mechaniker{NEWLINE}diese Bahn überprüfen soll STR_1891 :Noch kein {STRINGID} im Park STR_1892 :RollerCoaster Tycoon 2 STR_1893 :Legen Sie die RollerCoaster Tycoon 2-CD in folgendes Laufwerk ein: @@ -1941,15 +1941,15 @@ STR_1936 :{STRINGID} hat {STRINGID} gekauft STR_1937 :{SMALLFONT}{BLACK}Informationen zum Thema dieser Nachricht anzeigen STR_1938 :{SMALLFONT}{BLACK}Ansicht des Besuchers anzeigen STR_1939 :{SMALLFONT}{BLACK}Ansicht des Mitarbeiters anzeigen -STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw. dieses Besuchers anzeigen +STR_1940 :{SMALLFONT}{BLACK}Vergnügen, Energie, Hunger, usw.{NEWLINE}dieses Besuchers anzeigen STR_1941 :{SMALLFONT}{BLACK}Gefahrene Bahnen dieses Besuchers anzeigen -STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem Besucher anzeigen +STR_1942 :{SMALLFONT}{BLACK}Finanzinformationen zu diesem{NEWLINE}Besucher anzeigen STR_1943 :{SMALLFONT}{BLACK}Aktuelle Gedanken dieses Besuchers anzeigen -STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der Besucher bei sich trägt +STR_1944 :{SMALLFONT}{BLACK}Objekte anzeigen, die der{NEWLINE}Besucher bei sich trägt STR_1945 :{SMALLFONT}{BLACK}Anweisungen und Optionen für diesen Mitarbeiter anzeigen STR_1946 :{SMALLFONT}{BLACK}Kostüm für diesen Animateur auswählen STR_1947 :{SMALLFONT}{BLACK}Vom Mitarbeitertyp abgelaufene{NEWLINE}Bereiche anzeigen und den nächsten{NEWLINE}Mitarbeiter suchen -STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten Typ einstellen +STR_1948 :{SMALLFONT}{BLACK}Neuen Mitarbeiter für den ausgewählten{NEWLINE}Typ einstellen STR_1949 :Finanzübersicht STR_1950 :Finanzdiagramm STR_1951 :Verkehrswertdiagramm @@ -2459,17 +2459,17 @@ STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2455 :{SMALLFONT}{BLACK}+{CURRENCY2DP} - STR_2456 :{SMALLFONT}{BLACK}{CURRENCY2DP} - STR_2457 :{SMALLFONT}{BLACK}Finanzkonten anzeigen -STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen) im Zeitverlauf anzeigen -STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im Zeitverlauf anzeigen +STR_2458 :{SMALLFONT}{BLACK}Gelddiagramm (abzüglich Darlehen){NEWLINE}im Zeitverlauf anzeigen +STR_2459 :{SMALLFONT}{BLACK}Verkehrswertdiagramm im{NEWLINE}Zeitverlauf anzeigen STR_2460 :{SMALLFONT}{BLACK}Diagramm zu Wochengewinn anzeigen STR_2461 :{SMALLFONT}{BLACK}Marketingkampagnen anzeigen STR_2462 :{SMALLFONT}{BLACK}Ansicht von Parkeingang anzeigen -STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm im Zeitverlauf anzeigen -STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm im Zeitverlauf anzeigen +STR_2463 :{SMALLFONT}{BLACK}Parkbewertungsdiagramm{NEWLINE}im Zeitverlauf anzeigen +STR_2464 :{SMALLFONT}{BLACK}Besucherzahlendiagramm{NEWLINE}im Zeitverlauf anzeigen STR_2465 :{SMALLFONT}{BLACK}Parkeintrittspreis und -informationen anzeigen STR_2466 :{SMALLFONT}{BLACK}Parkstatistiken anzeigen STR_2467 :{SMALLFONT}{BLACK}Ziele für dieses Spiel anzeigen -STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen, die dieser Park erhalten hat +STR_2468 :{SMALLFONT}{BLACK}Aktuelle Auszeichnungen anzeigen,{NEWLINE}die dieser Park erhalten hat STR_2469 :{SMALLFONT}{BLACK}Forschungs- & Entwicklungsgrad auswählen STR_2470 :{SMALLFONT}{BLACK}Nach neuen Transportbahnen forschen STR_2471 :{SMALLFONT}{BLACK}Nach neuen gemäßigten Bahnen forschen @@ -2478,7 +2478,7 @@ STR_2473 :{SMALLFONT}{BLACK}Nach neuen aufregenden Fahrten forschen STR_2474 :{SMALLFONT}{BLACK}Nach neuen Wasserbahnen forschen STR_2475 :{SMALLFONT}{BLACK}Nach neuen Läden und Ständen forschen STR_2476 :{SMALLFONT}{BLACK}Nach neuen Szenerien und Themen forschen -STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese Attraktion auswählen +STR_2477 :{SMALLFONT}{BLACK}Betriebsmodus für diese{NEWLINE}Attraktion auswählen STR_2478 :{SMALLFONT}{BLACK}Geschwindigkeitsdiagramm im Zeitverlauf anzeigen STR_2479 :{SMALLFONT}{BLACK}Höhendiagramm im Zeitverlauf anzeigen STR_2480 :{SMALLFONT}{BLACK}Diagramm der vertikalen Beschleunigung im Zeitverlauf anzeigen @@ -2795,9 +2795,9 @@ STR_2786 :{SMALLFONT}{BLACK}Klicken Sie auf die Kürzelbeschreibung, um eine STR_2787 :{WINDOW_COLOUR_2}Verkehrswert: {BLACK}{CURRENCY} STR_2788 :{WINDOW_COLOUR_2}Glückwunsch!{NEWLINE}{BLACK}Sie haben Ihr Ziel mit einem Firmenwert von {CURRENCY} erreicht! STR_2789 :{WINDOW_COLOUR_2}Sie haben Ihr Ziel nicht erreicht! -STR_2790 :Geben Sie einen Namen in das Szenariodiagramm ein +STR_2790 :Namen für die Szenarioübers. eingeben STR_2791 :Namen eingeben -STR_2792 :Geben Sie Ihren Namen für das Szenariodiagramm ein: +STR_2792 :Namen für die Szenarioübersicht eingeben: STR_2793 :{SMALLFONT}(Durchgeführt von {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Durchgeführt von: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} mit einem Firmenwert von: {BLACK}{CURRENCY} STR_2795 :Sortieren @@ -3095,7 +3095,7 @@ STR_3086 :Abstrakter Eingang STR_3087 :Schnee-/Eis-Eingang STR_3088 :Pagodeneingang STR_3089 :Weltraumeingang -STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang, Ausgang und die Station aus +STR_3090 :{SMALLFONT}{BLACK}Wählen Sie Stil für den Eingang,{NEWLINE}Ausgang und die Station aus STR_3091 :Sie dürfen diesen Abschnitt nicht entfernen! STR_3092 :Sie dürfen die Station für diese Bahn nicht verschieben oder verändern! STR_3093 :{WINDOW_COLOUR_2}Favorit: {BLACK}{STRINGID} @@ -3111,7 +3111,7 @@ STR_3102 :{SMALLFONT}{BLACK}Farbige Szenerie auf Gelände neu streichen STR_3103 :Dies kann nicht neu gestrichen werden... STR_3104 :{SMALLFONT}{BLACK}Bahnen auflisten STR_3105 :{SMALLFONT}{BLACK}Läden und Stände auflisten -STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen auflisten +STR_3106 :{SMALLFONT}{BLACK}Informationsstände und andere Besuchereinrichtungen{NEWLINE}auflisten STR_3107 :Schließen STR_3108 :Testen STR_3109 :Öffnen @@ -3226,14 +3226,14 @@ STR_3217 :Gelände im Besitz STR_3218 :Baurechte STR_3219 :Gelände zum Verkauf STR_3220 :Baurechte zum Verkauf -STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das dem Park gehören soll +STR_3221 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest,{NEWLINE}das dem Park gehören soll STR_3222 :{SMALLFONT}{BLACK}Wählen Sie die Baurechte aus, die exklusiv dem Park gehören sollen -STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom Park gekauft werden kann -STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom Park erworben werden können +STR_3223 :{SMALLFONT}{BLACK}Legen Sie das Gelände fest, das vom{NEWLINE}Park gekauft werden kann +STR_3224 :{SMALLFONT}{BLACK}Legen Sie die Baurechte fest, die vom{NEWLINE}Park erworben werden können STR_3225 :{SMALLFONT}{BLACK}Bau einer zufälligen Objektgruppe{NEWLINE}um ausgewählte Position herum ein-/ausschalten STR_3226 :{SMALLFONT}{BLACK}Parkeingang bauen STR_3227 :Zu viele Parkeingänge! -STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen für Personen fest +STR_3228 :{SMALLFONT}{BLACK}Legen Sie die Startpositionen{NEWLINE}für Personen fest STR_3229 :Blockbremsen können nicht unmittelbar nach der Station eingesetzt werden STR_3230 :Blockbremsen können nicht unmittelbar hintereinander eingesetzt werden STR_3231 :Blockbremsen können nicht unmittelbar nach der Anstiegsspitze eingesetzt werden @@ -3262,26 +3262,26 @@ STR_3253 :Max. Darlehensgröße kann nicht weiter reduziert werden! STR_3254 :Zinsrate kann nicht weiter erhöht werden! STR_3255 :Zinsrate kann nicht weiter reduziert werden! STR_3256 :Weniger aufregendere Bahnen bevorzugt -STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende Bahnen vorziehen +STR_3257 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen weniger aufregende{NEWLINE}Bahnen vorziehen STR_3258 :Aufregendere Bahnen bevorzugt -STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere Bahnen vorziehen +STR_3259 :{SMALLFONT}{BLACK}Wählen Sie aus, ob die Besucher im Allgemeinen aufregendere{NEWLINE}Bahnen vorziehen STR_3260 :{WINDOW_COLOUR_2}Durchschnittliches Geld pro Besucher: STR_3261 :{WINDOW_COLOUR_2}Anfangsvergnügen der Besucher: STR_3262 :{WINDOW_COLOUR_2}Anfangshunger der Besucher: STR_3263 :{WINDOW_COLOUR_2}Anfangsdurst der Besucher: STR_3264 :Dies kann nicht weiter erhöht werden! STR_3265 :Dies kann nicht weiter reduziert werden! -STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für Eintritt und Fahrten verlangt +STR_3266 :{SMALLFONT}{BLACK}Wählen Sie aus, was der Park für{NEWLINE}Eintritt und Fahrten verlangt STR_3267 :Entfernen von Bäumen verbieten STR_3268 :{SMALLFONT}{BLACK}Entfernen von hohen Bäumen verbieten STR_3269 :Landschaftsänderungen verbieten -STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der Landschaft verbieten +STR_3270 :{SMALLFONT}{BLACK}Jegliche Änderungen an der{NEWLINE}Landschaft verbieten STR_3271 :Hohe Bauten verbieten STR_3272 :{SMALLFONT}{BLACK}Jegliche hohe Bauten verbieten STR_3273 :Höhere Schwierigkeitsstufe für Parkbewertung STR_3274 :{SMALLFONT}{BLACK}Machen Sie die Parkbewertung schwieriger STR_3275 :Höhere Schwierigkeitsstufe für Besuchergewinnung -STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von Besuchern schwieriger +STR_3276 :{SMALLFONT}{BLACK}Machen Sie das Anlocken von{NEWLINE}Besuchern schwieriger STR_3277 :{WINDOW_COLOUR_2}Kosten für Landkauf: STR_3278 :{WINDOW_COLOUR_2}Kosten für Erwerb v. Baurechten: STR_3279 :Freier Eintritt/Bezahlen pro Fahrt @@ -3323,7 +3323,7 @@ STR_3314 :Namen für Szenario eingeben: STR_3315 :Park-/Szenariodetails STR_3316 :Beschreibung für dieses Szenario eingeben: STR_3317 :Noch keine Details -STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe dieses Szenario vorkommt +STR_3318 :{SMALLFONT}{BLACK}Wählen Sie aus, in welcher Gruppe{NEWLINE}dieses Szenario vorkommt STR_3319 :{WINDOW_COLOUR_2}Szenariogruppe: STR_3320 :Szenariodatei kann nicht gespeichert werden... STR_3321 :Neue Objekte erfolgreich installiert @@ -3587,10 +3587,10 @@ STR_5250 :Hauptmenü Beenden-Schaltfläche STR_5251 :Hauptmenü Optionen-Schaltfläche STR_5252 :Hauptmenü Szenarioauswahl STR_5253 :Parkinformationen -STR_5254 :Übelkeit hinzufügen -STR_5255 :{MEDIUMFONT}{BLACK}Allen Besuchern wird übel +STR_5254 :Erstellen +STR_5255 :{SMALLFONT}{BLACK}Eine neue Titelsequenz von{NEWLINE}Grund auf neu erstellen STR_5256 :Neues Thema zum bearbeiten erstellen -STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des aktuellen Themas erstellen +STR_5257 :{SMALLFONT}{BLACK}Neues Thema durch duplizieren des{NEWLINE}aktuellen Themas erstellen STR_5258 :{SMALLFONT}{BLACK}Aktuelles Thema löschen STR_5259 :{SMALLFONT}{BLACK}Aktuelles Thema umbenennen STR_5260 :Riesiger Screenshot @@ -3758,7 +3758,7 @@ STR_5421 :Zoom STR_5422 :Zoom{MOVE_X}{87}{COMMA16} STR_5423 :Warten STR_5424 :Warten{MOVE_X}{87}{COMMA16} -STR_5425 :Neu starten +STR_5425 :Neustart STR_5426 :Ende STR_5427 :Koordinaten: STR_5428 :Drehungen gegen Uhrzeigersinn: @@ -3772,6 +3772,13 @@ STR_5435 :Spielstand umbenennen STR_5436 :Titelsequenzen bearbeiten... STR_5437 :Kein Spielstand ausgewählt STR_5438 :Es können keine Änderungen vorgenommen werden, solange der Befehlseditor geöffnet ist -STR_5439 :Ein Neustart wird ohne `Warten'-Befehl verwendet +STR_5439 :Zusammen mit einem `Neustart'-Befehl muss ein mindestens 4 Sekunden langer `Warten'-Befehl verwendet werden STR_5440 :Vollbild minimieren, wenn Spiel nicht im Vordergrund -STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können. Nur im Titelbildschirm auswählbar +STR_5441 :{SMALLFONT}{BLACK}Identifiziert Bahnen durch Streckentyp, sodass wie in RCT1 Fahrzeuge anschließend geändert werden können +STR_5442 :reserviert +STR_5443 :Geschwind.{MOVE_X}{87}{STRINGID} +STR_5444 :Geschwindigkeit: +STR_5445 :Geschwindigkeit +STR_5446 :Erhalten +STR_5447 :Typ {STRINGID} +STR_5448 :Bahn / Fahrzeug {STRINGID} From a8a838589947a803f67b96a1258f3774ecb80ac0 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 27 Jun 2015 10:30:33 +0100 Subject: [PATCH 07/16] Fix memory not being freed. This was breaking the installed object list creation as it would quickly run out of rct2 memory. Scenario text was incorrectly using rct2_free this has also been fixed. --- src/object.c | 2 +- src/rct2.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/object.c b/src/object.c index 98e8fed918..2056562cff 100644 --- a/src/object.c +++ b/src/object.c @@ -1593,7 +1593,7 @@ int object_get_scenario_text(rct_object_entry *entry) void object_free_scenario_text() { if (RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) != NULL) { - rct2_free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*)); + free(RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*)); RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TEXT_TEMP_CHUNK, void*) = NULL; } } diff --git a/src/rct2.c b/src/rct2.c index 0b3068ebe5..c2efdc4e92 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -512,9 +512,9 @@ void *rct2_realloc(void *block, size_t numBytes) /** * RCT2 and this DLL can not free each other's allocated memory blocks. Use this to free memory that was allocated by RCT2. - * rct2: 0x004068DE + * rct2: 0x004068CD */ void rct2_free(void *block) { - RCT2_CALLPROC_1(0x004068DE, void*, block); + RCT2_CALLPROC_1(0x004068CD, void*, block); } From 2ac872dd56063c12834d0b832c4b2533be253400 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 27 Jun 2015 13:08:29 +0200 Subject: [PATCH 08/16] Drop duplicate track names in list; use track categories when in select-by-track-type-mode --- src/object_list.c | 28 +++++---------------------- src/windows/editor_object_selection.c | 16 ++++++++++----- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index 615d991419..de0ac3f4c7 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "addresses.h" +#include "config.h" #include "localisation/localisation.h" #include "object.h" #include "platform/platform.h" @@ -738,29 +739,9 @@ static uint32 install_object_entry(rct_object_entry* entry, rct_object_entry* in load_object_filter(entry, chunk, filter); - - // When made of two parts i.e Wooden Roller Coaster (Dream Woodie Cars) - if ((objectType == OBJECT_TYPE_RIDE) && (!((((rct_ride_type*)chunk)->flags) & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || - rideTypeShouldLoseSeparateFlag((rct_ride_type*)chunk))) { - rct_ride_type* ride_type = (rct_ride_type*)chunk; - rct_string_id obj_string = ride_type->ride_type[0]; - if (obj_string == 0xFF){ - obj_string = ride_type->ride_type[1]; - if (obj_string == 0xFF) { - obj_string = ride_type->ride_type[2]; - } - } - - format_string(installed_entry_pointer, obj_string + 2, 0); - strcat(installed_entry_pointer, "\t ("); - strcat(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); - strcat(installed_entry_pointer, ")"); - while (*installed_entry_pointer++); - } - else{ - strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); - while (*installed_entry_pointer++); - } + // Always extract only the vehicle type, since the track type is always displayed in the left column, to prevent duplicate track names. + strcpy(installed_entry_pointer, language_get_string((rct_string_id)RCT2_GLOBAL(RCT2_ADDRESS_CURR_OBJECT_BASE_STRING_ID, uint32))); + while (*installed_entry_pointer++); // This is deceptive. Due to setting the total no images earlier to 0xF26E // this is actually the no_images in this entry. @@ -805,6 +786,7 @@ static void load_object_filter(rct_object_entry* entry, uint8* chunk, rct_object rideFilter->category[0] = rideType->category[0]; rideFilter->category[1] = rideType->category[1]; + for (int i = 0; i < 3; i++) { rideFilter->ride_type = rideType->ride_type[i]; if (rideFilter->ride_type != 255) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 11b3ec7e34..bfbbc7d543 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -31,6 +31,7 @@ #include "error.h" #include "../interface/themes.h" #include "dropdown.h" +#include "../rct1.h" enum { FILTER_RCT2 = (1 << 0), @@ -2085,11 +2086,16 @@ static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter) { switch (entry->flags & 0x0F) { case OBJECT_TYPE_RIDE: - if (_filter_flags & (1 << (filter->ride.category[0] + 5))) - return true; - if (_filter_flags & (1 << (filter->ride.category[1] + 5))) - return true; - + if(!gConfigInterface.select_by_track_type) { + if (_filter_flags & (1 << (filter->ride.category[0] + 5))) + return true; + if (_filter_flags & (1 << (filter->ride.category[1] + 5))) + return true; + } + else { + if (_filter_flags & (1 << (gRideCategories[filter->ride.ride_type] + 5))) + return true; + } return false; } return true; From 57fd914a52085aed89553724d5bc0ed69ba1ad23 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 15:17:54 +0100 Subject: [PATCH 09/16] implement ride construction --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/game.h | 10 +- src/interface/viewport.h | 4 + src/interface/window.h | 3 +- src/localisation/string_ids.h | 166 +- src/ride/ride.c | 656 +++-- src/ride/ride.h | 86 +- src/ride/ride_ratings.c | 19 +- src/ride/ride_ratings.h | 1 - src/ride/track.c | 413 ++-- src/ride/track.h | 107 +- src/windows/maze_construction.c | 211 ++ src/windows/ride_construction.c | 3691 ++++++++++++++++++++++++++--- src/windows/track_place.c | 2 +- src/world/map.c | 40 +- src/world/map.h | 7 + 17 files changed, 4685 insertions(+), 735 deletions(-) create mode 100644 src/windows/maze_construction.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index c9f50a1a2a..84309b2bcf 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -96,6 +96,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 24bc550445..d2f78bd6b4 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -489,6 +489,9 @@ Source\Windows + + Source\Windows + diff --git a/src/game.h b/src/game.h index 0695d91595..91c3212236 100644 --- a/src/game.h +++ b/src/game.h @@ -27,8 +27,8 @@ enum GAME_COMMAND { GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_1, GAME_COMMAND_TOGGLE_PAUSE, // 2 - GAME_COMMAND_3, //Has something to do with ride construction - GAME_COMMAND_4, + GAME_COMMAND_PLACE_TRACK, + GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_LOAD_OR_QUIT, // 5 GAME_COMMAND_6, GAME_COMMAND_7, @@ -36,8 +36,8 @@ enum GAME_COMMAND { GAME_COMMAND_9, GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_SETTING, - GAME_COMMAND_12, - GAME_COMMAND_13, + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, GAME_COMMAND_REMOVE_SCENERY, GAME_COMMAND_PLACE_SCENERY, GAME_COMMAND_16, @@ -71,7 +71,7 @@ enum GAME_COMMAND { GAME_COMMAND_REMOVE_LARGE_SCENERY, GAME_COMMAND_SET_CURRENT_LOAN, // 45 GAME_COMMAND_SET_RESEARCH_FUNDING, // 46 - GAME_COMMAND_PLACE_TRACK, + GAME_COMMAND_PLACE_TRACK_DESIGN, GAME_COMMAND_START_MARKETING_CAMPAIGN, // 48 GAME_COMMAND_49, GAME_COMMAND_PLACE_BANNER, // New banner? (possibly scenery) diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 429b91602e..62cfa47c7f 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -126,4 +126,8 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc void viewport_interaction_remove_park_entrance(rct_map_element *mapElement, int x, int y); +void sub_0x68615B(int ebp); +void sub_688485(); +void sub_688217(); + #endif diff --git a/src/interface/window.h b/src/interface/window.h index 9aee92e59a..e571e2f312 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -564,7 +564,8 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle); void window_ride_demolish_prompt_open(int rideIndex); void window_ride_construct(rct_window *w); void window_ride_list_open(); -rct_window * window_construction_open(); +rct_window *window_ride_construction_open(); +rct_window *window_maze_construction_open(); void window_track_place_open(); rct_window *window_new_ride_open(); rct_window *window_new_ride_open_research(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index cc465584ef..b93bab5ec7 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -73,7 +73,7 @@ enum { STR_CLOSE_X = 824, STR_CHOSEN_NAME_IN_USE_ALREADY = 825, STR_TOO_MANY_NAMES_DEFINED = 826, - + STR_NOT_ENOUGH_CASH_REQUIRES = 827, STR_CLOSE_WINDOW_TIP = 828, STR_WINDOW_TITLE_TIP = 829, @@ -124,6 +124,45 @@ enum { STR_SCREENSHOT_FAILED = 893, STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND = 895, + STR_RIDE_CONSTRUCTION_DIRECTION = 897, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP = 898, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP = 899, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP = 900, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP = 901, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP = 902, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP = 903, + STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP = 904, + STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP = 905, + STR_RIDE_CONSTRUCTION_STRAIGHT_TIP = 906, + STR_RIDE_CONSTRUCTION_SLOPE = 907, + STR_RIDE_CONSTRUCTION_ROLL_BANKING = 908, + STR_RIDE_CONSTRUCTION_SEAT_ROT = 909, + + STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP = 910, + STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP = 911, + STR_RIDE_CONSTRUCTION_NO_ROLL_TIP = 912, + STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP = 913, + STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP = 914, + STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP = 915, + STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP = 916, + STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP = 917, + STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP = 918, + STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP = 919, + STR_RIDE_CONSTRUCTION_LEVEL_TIP = 920, + STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP = 921, + STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP = 922, + STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP = 923, + STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP = 924, + STR_RIDE_CONSTRUCTION_HELIX_UP_TIP = 925, + STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS = 926, + STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE = 927, + STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP = 928, + + STR_S_BEND_LEFT = 929, + STR_S_BEND_RIGHT = 930, + STR_VERTICAL_LOOP_LEFT = 931, + STR_VERTICAL_LOOP_RIGHT = 932, + STR_VIEW_OPTIONS_TIP = 937, STR_ADJUST_LAND_TIP = 938, STR_UNDERGROUND_VIEW = 939, @@ -145,6 +184,24 @@ enum { STR_QUIT_GAME_2_PROMPT_TITLE = 952, STR_LOAD_LANDSCAPE_PROMPT_TITLE = 953, + STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP = 955, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 = 956, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_135 = 957, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_90 = 958, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_45 = 959, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_0 = 960, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_45 = 961, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_90 = 962, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_135 = 963, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_180 = 964, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_225 = 965, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_270 = 966, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_315 = 967, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_360 = 968, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_405 = 969, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_450 = 970, + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_495 = 971, + STR_CANCEL = 972, STR_OK = 973, @@ -166,6 +223,8 @@ enum { STR_CONSTRUCTION = 990, + STR_STATION_PLATFORM = 991, + STR_DEMOLISH_RIDE_TIP = 992, STR_DEMOLISH_RIDE = 993, STR_DEMOLISH = 994, @@ -197,6 +256,11 @@ enum { STR_LOCATE_SUBJECT_TIP = 1027, STR_OFF_EDGE_OF_MAP = 1028, + STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER = 1029, + STR_CAN_ONLY_BUILD_THIS_UNDERWATER = 1030, + STR_RIDE_CANT_BUILD_THIS_UNDERWATER = 1031, + STR_CAN_ONLY_BUILD_THIS_ON_WATER = 1032, + STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND = 1033, STR_CAN_ONLY_BUILD_THIS_ON_LAND = 1034, STR_LOAD_GAME_DIALOG_TITLE = 1036, @@ -304,6 +368,11 @@ enum { STR_SELECT_VEHICLE_COLOUR_SCHEME_TIP = 1140, STR_SELECT_VEHICLE_TO_MODIFY_TIP = 1141, + STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION = 1144, + STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION = 1145, + STR_ENTRANCE_NOT_YET_BUILT = 1146, + STR_EXIT_NOT_YET_BUILT = 1147, + STR_QUARTER_LOAD = 1148, STR_HALF_LOAD = 1149, STR_THREE_QUARTER_LOAD = 1150, @@ -411,6 +480,31 @@ enum { STR_QUEUE_TIME_MINUTE = 1359, STR_QUEUE_TIME_MINUTES = 1360, + STR_TOO_HIGH_FOR_SUPPORTS = 1363, + + STR_IN_LINE_TWIST_LEFT = 1365, + STR_IN_LINE_TWIST_RIGHT = 1366, + STR_HALF_LOOP = 1367, + STR_HALF_CORKSCREW_LEFT = 1368, + STR_HALF_CORKSCREW_RIGHT = 1369, + STR_BARREL_ROLL_LEFT = 1370, + STR_BARREL_ROLL_RIGHT = 1371, + STR_LAUNCHED_LIFT_HILL = 1372, + STR_LARGE_HALF_LOOP_LEFT = 1373, + STR_LARGE_HALF_LOOP_RIGHT = 1374, + STR_UPPER_TRANSFER = 1375, + STR_LOWER_TRANSFER = 1376, + STR_HEARTLINE_ROLL_LEFT = 1377, + STR_HEARTLINE_ROLL_RIGHT = 1378, + STR_REVERSER_LEFT = 1379, + STR_REVERSER_RIGHT = 1380, + STR_CURVED_LIFT_HILL_LEFT = 1381, + STR_CURVED_LIFT_HILL_RIGHT = 1382, + STR_QUARTER_LOOP = 1383, + + STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP = 1385, + STR_RIDE_CONSTRUCTION_SPECIAL = 1386, + STR_VIEW_OF_RIDE_ATTRACTION_TIP = 1392, STR_VEHICLE_DETAILS_AND_OPTIONS_TIP = 1393, STR_OPERATING_OPTIONS_TIP = 1394, @@ -420,6 +514,10 @@ enum { STR_MEASUREMENTS_AND_TEST_DATA_TIP = 1398, STR_GRAPHS_TIP = 1399, + STR_RIDE_CONSTRUCTION_ENTRANCE = 1400, + STR_RIDE_CONSTRUCTION_EXIT = 1401, + STR_RIDE_CONSTRUCTION_ENTRANCE_TIP = 1402, + STR_RIDE_CONSTRUCTION_EXIT_TIP = 1403, STR_ROTATE_90_TIP = 1404, STR_MIRROR_IMAGE_TIP = 1405, STR_TOGGLE_SCENERY_TIP = 1406, @@ -427,6 +525,9 @@ enum { STR_BUILD_THIS = 1407, STR_COST_LABEL = 1408, + STR_ENTRY_EXIT_PLATFORM = 1409, + STR_VERTICAL_TOWER = 1410, + STR_DATA_LOGGING_NOT_AVAILABLE_FOR_THIS_TYPE_OF_RIDE = 1412, STR_DATA_LOGGING_WILL_START_WHEN_NEXT_LEAVES = 1413, STR_LOGGING_DATA_FROM_TIP = 1422, @@ -455,9 +556,18 @@ enum { STR_LOOKING_AT_SCENERY = 1446, STR_LEAVING_PARK = 1447, STR_WATCHING_NEW_RIDE_BEING_CONSTRUCTED = 1448, - + + STR_RIDE_CONSTRUCTION_TRACK_STYLE = 1459, + STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460, + STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461, + STR_GUESTS = 1463, + STR_HELIX_UP_SMALL = 1464, + STR_HELIX_UP_LARGE = 1465, + STR_HELIX_DOWN_SMALL = 1466, + STR_HELIX_DOWN_LARGE = 1467, + STR_STAFF = 1468, STR_RIDE_MUST_START_AND_END_WITH_STATIONS = 1469, @@ -484,9 +594,27 @@ enum { STR_TOTAL_CUSTOMERS = 1670, STR_TOTAL_PROFIT = 1671, + STR_BRAKES = 1672, + STR_SPINNING_CONTROL_TOGGLE_TRACK = 1673, + + STR_RIDE_CONSTRUCTION_BRAKE_SPEED = 1674, + STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP = 1676, + STR_POPULARITY_UNKNOWN = 1677, STR_POPULARITY_PERCENT = 1678, + STR_HELIX_UP_LEFT = 1679, + STR_HELIX_UP_RIGHT = 1680, + STR_HELIX_DOWN_LEFT = 1681, + STR_HELIX_DOWN_RIGHT = 1682, + STR_BASE_SIZE_2_X_2 = 1683, + STR_BASE_SIZE_4_X_4 = 1684, + STR_BASE_SIZE_2_X_4 = 1685, + STR_BASE_SIZE_5_X_1 = 1686, + STR_WATER_SPLASH = 1687, + STR_BASE_SIZE_4_X_1 = 1688, + STR_BLOCK_BRAKES = 1689, + STR_GUESTS_TIP = 1693, STR_STAFF_TIP = 1694, @@ -523,6 +651,9 @@ enum { STR_BANNER_TEXT = 1731, + STR_RIDE_CONSTRUCTION_BUILD = 1732, + STR_RIDE_CONSTRUCTION_MODE = 1733, + STR_NUMBER_OF_LAPS = 1734, STR_NUMBER_OF_LAPS_TIP = 1735, @@ -542,6 +673,18 @@ enum { STR_ADMISSION_PRICE = 1756, STR_RELIABILITY_LABEL_1757 = 1757, + STR_RIDE_CONSTRUCTION_BUILD_MODE = 1758, + STR_RIDE_CONSTRUCTION_MOVE_MODE = 1759, + STR_RIDE_CONSTRUCTION_FILL_IN_MODE = 1760, + STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP = 1761, + + STR_WATERFALLS = 1762, + STR_RAPIDS = 1763, + STR_LOG_BUMPS = 1764, + STR_ON_RIDE_PHOTO_SECTION = 1765, + STR_REVERSER_TURNTABLE = 1766, + STR_SPINNING_TUNNEL = 1767, + STR_NUMBER_OF_SWINGS = 1769, STR_NUMBER_OF_SWINGS_TIP = 1770, @@ -557,6 +700,8 @@ enum { STR_ANSWERING_RADIO_CALL = 1795, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING = 1796, + STR_WHIRLPOOL = 1798, + STR_SAFETY_CUT_OUT = 1800, STR_RESTRAINTS_STUCK_CLOSED = 1801, STR_RESTRAINTS_STUCK_OPEN = 1802, @@ -735,6 +880,11 @@ enum { STR_COMPANY_VALUE_LABEL = 2227, STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL = 2228, + STR_SLOPE_UP_TO_VERTICAL = 2229, + STR_VERTICAL_TRACK = 2230, + STR_HOLDING_BRAKE_FOR_DROP = 2231, + STR_CABLE_LIFT_HILL = 2232, + STR_PARK_INFORMATION_TIP = 2233, STR_RECENT_MESSAGES = 2234, @@ -995,6 +1145,15 @@ enum { STR_SHORTCUT_DESCRIPTION_31 = 2524, STR_INDIVIDUAL_KEYS_BASE = 2525, + STR_GOLF_HOLE_A = 3049, + STR_GOLF_HOLE_B = 3050, + STR_GOLF_HOLE_C = 3051, + STR_GOLF_HOLE_D = 3052, + STR_GOLF_HOLE_E = 3053, + + STR_TOP_SECTION = 3069, + STR_SLOPE_TO_LEVEL = 3070, + // Cheats STR_CHEAT_TITLE = 5217, STR_CHEAT_TITLE_FINANCIAL = 5345, @@ -1220,6 +1379,9 @@ enum { STR_HEDGES = 3059, STR_ICE_BLOCKS = 3060, STR_WOODEN_FENCES = 3061, + + STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP = 3062, + STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP = 3063, STR_BEGINNER_PARKS = 3064, STR_CHALLENGING_PARKS = STR_BEGINNER_PARKS + 1, diff --git a/src/ride/ride.c b/src/ride/ride.c index 47f5fb312f..c71dfd4e9f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -328,7 +328,7 @@ int sub_6CAF80(int rideIndex, rct_xy_element *output) * * rct2: 0x006C60C2 */ -int track_get_next(rct_xy_element *input, rct_xy_element *output) +bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction) { int eax, ebx, ecx, edx, esi, edi, ebp, result; @@ -339,10 +339,37 @@ int track_get_next(rct_xy_element *input, rct_xy_element *output) output->x = *((uint16*)&eax); output->y = *((uint16*)&ecx); output->element = (rct_map_element*)esi; + if (z != NULL) *z = (edx & 0xFFFF); + if (direction != NULL) *direction = (ebx & 0xFF); return (result & 0x100) == 0; } +/** + * + * rct2: 0x006C6402 + */ +bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + + eax = x; + ecx = y; + esi = (int)mapElement; + int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + if (outTrackBeginEnd != NULL) { + outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); + outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); + outTrackBeginEnd->begin_z = (edx & 0xFFFF); + outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); + outTrackBeginEnd->begin_element = (rct_map_element*)esi; + outTrackBeginEnd->end_x = (eax & 0xFFFF); + outTrackBeginEnd->end_y = (ecx & 0xFFFF); + outTrackBeginEnd->end_direction = (ebx & 0xFF); + } + return (result & 0x100) == 0; +} + /** * * Make sure to pass in the x and y of the start track element too. @@ -367,12 +394,12 @@ int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output) return 0; w = window_find_by_class(WC_RIDE_CONSTRUCTION); - if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex) + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { *output = trackElement; return 1; } @@ -544,11 +571,11 @@ static rct_window *ride_create_or_find_construction_window(int rideIndex) w = window_find_by_class(WC_RIDE_CONSTRUCTION); if (w == NULL || w->number != rideIndex) { window_close_construction_windows(); - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; - w = window_construction_open(rideIndex); + _currentRideIndex = rideIndex; + w = window_ride_construction_open(rideIndex); } else { sub_6C9627(); - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; + _currentRideIndex = rideIndex; } return w; @@ -604,15 +631,6 @@ void ride_construct(int rideIndex) } } -/** - * - * rct2: 0x006C84CE - */ -static void sub_6C84CE() -{ - RCT2_CALLPROC_X(0x006C84CE, 0, 0, 0, 0, 0, 0, 0); -} - /** * * rct2: 0x006DD4D5 @@ -779,7 +797,9 @@ void ride_remove_peeps(int rideIndex) ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN; } -/* rct2: 0x006C683D +/** + * Gets the origin track element (sequence 0). Seems to do more than that though and even invalidates track. + * rct2: 0x006C683D * ax : x * bx : direction << 8, type * cx : y @@ -790,49 +810,38 @@ void ride_remove_peeps(int rideIndex) */ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_params, rct_map_element** output_element, uint16 flags) { - rct_map_element* map_element = map_get_first_element_at(*x / 32, *y / 32); - rct_map_element* success_map = NULL; + rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32); + rct_map_element *successMapElement = NULL; - do{ - if (map_element->base_height != *z / 8) + do { + if (mapElement->base_height != *z / 8) continue; - if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK) + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; - if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if (type != map_element->properties.track.type) + if (type != mapElement->properties.track.type) continue; - success_map = map_element; - if (!(map_element->properties.track.sequence & 0xF)) + successMapElement = mapElement; + if ((mapElement->properties.track.sequence & 0x0F) == 0) break; - }while(!map_element_is_last_for_tile(map_element++)); + } while (!map_element_is_last_for_tile(mapElement++)); - map_element = success_map; - - if (map_element == NULL){ + mapElement = successMapElement; + if (mapElement == NULL) return 1; - } - // Possibly z should be &0xF8 - rct_ride* ride = GET_RIDE(map_element->properties.track.ride_index); - rct_preview_track *trackBlock; + // Possibly z should be & 0xF8 + rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); - if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_FLAT_RIDE){ - trackBlock = RCT2_ADDRESS(0x00994A38, rct_preview_track*)[type]; - } - else{ - trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[type]; - } + int sequence = mapElement->properties.track.sequence & 0x0F; + uint8 mapDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; - int sequence = map_element->properties.track.sequence & 0xF; - - uint8 map_direction = map_element->type & MAP_ELEMENT_DIRECTION_MASK; - - switch (map_direction){ + switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: *x -= trackBlock[sequence].x; *y -= trackBlock[sequence].y; @@ -850,17 +859,13 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par *y -= trackBlock[sequence].x; break; } - *z -= trackBlock[sequence].z; int start_x = *x, start_y = *y, start_z = *z; - *z += trackBlock[0].z; - for (int i = 0; trackBlock[i].var_00 != 0xFF; ++i){ int cur_x = start_x, cur_y = start_y, cur_z = start_z; - - switch (map_direction){ + switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: cur_x += trackBlock[i].x; cur_y += trackBlock[i].y; @@ -878,134 +883,334 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par cur_y += trackBlock[i].x; break; } - cur_z += trackBlock[i].z; map_invalidate_tile_full(cur_x, cur_y); - map_element = map_get_first_element_at(cur_x / 32, cur_y / 32); - success_map = NULL; - - do{ - if (map_element->base_height != cur_z / 8) + mapElement = map_get_first_element_at(cur_x / 32, cur_y / 32); + successMapElement = NULL; + do { + if (mapElement->base_height != cur_z / 8) continue; - if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_TRACK) + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; - if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction) + if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if ((map_element->properties.track.sequence & 0xF) != trackBlock[i].var_00) + if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].var_00) continue; - if (type == map_element->properties.track.type) - { - success_map = map_element; + if (type == mapElement->properties.track.type) { + successMapElement = mapElement; break; } - } while (!map_element_is_last_for_tile(map_element++)); + } while (!map_element_is_last_for_tile(mapElement++)); - if (success_map == NULL){ + if (successMapElement == NULL) { return 1; } - - if (i == 0 && output_element != NULL) - *output_element = map_element; - - if (flags & (1 << 0)){ - // Quadrant related ?? - map_element->type &= ~(1 << 6); + if (i == 0 && output_element != NULL) { + *output_element = mapElement; } - - if (flags & (1 << 1)){ - // Quadrant related ?? - map_element->type |= (1 << 6); + if (flags & (1 << 0)) { + // Switch highlight off + mapElement->type &= ~MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - - if (flags & (1 << 2)){ - map_element->properties.track.colour &= 0xFC; - map_element->properties.track.colour |= extra_params & 0xFF; + if (flags & (1 << 1)) { + // Switch highlight on + mapElement->type |= MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - - if (flags & (1 << 5)){ - map_element->properties.track.colour &= 0x0F; - map_element->properties.track.colour |= (extra_params & 0xFF) << 4; + if (flags & (1 << 2)) { + mapElement->properties.track.colour &= 0xFC; + mapElement->properties.track.colour |= extra_params & 0xFF; } - - if (flags & (1 << 3)){ - map_element->properties.track.colour |= (1 << 3); + if (flags & (1 << 5)) { + // Seat rotation + mapElement->properties.track.colour &= 0x0F; + mapElement->properties.track.colour |= (extra_params & 0xFF) << 4; } - - if (flags & (1 << 4)){ - map_element->properties.track.colour &= 0xF7; + if (flags & (1 << 3)) { + mapElement->properties.track.colour |= (1 << 3); + } + if (flags & (1 << 4)) { + mapElement->properties.track.colour &= 0xF7; } } return 0; } +/** + * + * rct2: 0x006C6096 + */ +rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = *x; + ecx = *y; + edx = *z; + ebx = *direction; + if (RCT2_CALLFUNC_X(0x006C6096, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return NULL; + + *x = (eax & 0xFFFF); + *y = (ecx & 0xFFFF); + *z = (edx & 0xFFFF); + *direction = (ebx & 0xFF); + if (direction2 != NULL) *direction2 = ((ebx >> 8) & 0xFF); + + return (rct_map_element*)esi; +} + +/** + * Returns the begin position / direction and end position / direction of the track piece that procedes the given location. + * rct2: 0x006C63D6 + */ +bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = inX; + ecx = inY; + edx = inZ; + ebx = inDirection; + if (RCT2_CALLFUNC_X(0x006C63D6, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return false; + + if (outTrackBeginEnd != NULL) { + outTrackBeginEnd->begin_x = ((eax >> 16) & 0xFFFF); + outTrackBeginEnd->begin_y = ((ecx >> 16) & 0xFFFF); + outTrackBeginEnd->begin_z = (edx & 0xFFFF); + outTrackBeginEnd->begin_direction = ((ebx >> 8) & 0xFF); + outTrackBeginEnd->begin_element = (rct_map_element*)esi; + outTrackBeginEnd->end_x = (eax & 0xFFFF); + outTrackBeginEnd->end_y = (ecx & 0xFFFF); + outTrackBeginEnd->end_direction = (ebx & 0xFF); + } + return true; +} + +/** + * + * rct2: 0x006C96C0 + */ void sub_6C96C0() { - RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); + // RCT2_CALLPROC_X(0x006C96C0, 0, 0, 0, 0, 0, 0, 0); return; + + rct_ride *ride; + rct_map_element *trackElement; + int rideIndex, x, y, z, direction; + + if (_currentTrackSelectionFlags & 4) { + _currentTrackSelectionFlags &= ~4; + game_do_command( + RCT2_GLOBAL(0x00F440BF, uint16), + 41, + RCT2_GLOBAL(0x00F440C1, uint16), + _currentRideIndex, + GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F440C4, uint8), + 0 + ); + } + if (_currentTrackSelectionFlags & 2) { + _currentTrackSelectionFlags &= ~2; + + rideIndex = _currentRideIndex; + RCT2_GLOBAL(0x00F441D2, uint8) = rideIndex; + + x = RCT2_GLOBAL(0x00F440C5, uint16); + y = RCT2_GLOBAL(0x00F440C7, uint16); + z = RCT2_GLOBAL(0x00F440C9, uint16); + + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) { + game_do_command(x , 41 | (0 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x , 41 | (1 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x + 16, 41 | (2 << 8), y + 16, rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + game_do_command(x + 16, 41 | (3 << 8), y , rideIndex | (2 << 8), GAME_COMMAND_38, z, 0); + } else { + direction = RCT2_GLOBAL(0x00F440CB, uint8); + if (!(direction & 4)) { + x -= TileDirectionDelta[direction].x; + y -= TileDirectionDelta[direction].y; + } + trackElement = sub_6C6096(&x, &y, &z, &direction, NULL); + if (trackElement != NULL) { + game_do_command( + x, + 105 | ((direction & 3) << 8), + y, + trackElement->properties.track.type | ((trackElement->properties.track.sequence & 0x0F) << 8), + GAME_COMMAND_REMOVE_TRACK, + z, + 0 + ); + } + } + } } void sub_6C9627() { - switch (RCT2_GLOBAL(0x00F440A6, uint8)) { - case 3: - { - int x = RCT2_GLOBAL(0x00F440A8, uint16), y = RCT2_GLOBAL(0x00F440AA, uint16), z = RCT2_GLOBAL(0x00F440AC, uint16); + int x, y, z; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_SELECTED: + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; sub_6C683D( &x, &y, &z, - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) & 3, - RCT2_GLOBAL(0x00F440AF, uint8), - 0, + _currentTrackPieceDirection & 3, + _currentTrackPieceType, 0, + NULL, 1 - ); - } + ); break; - case 6: - case 7: - case 8: - if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) { + case RIDE_CONSTRUCTION_STATE_6: + case RIDE_CONSTRUCTION_STATE_7: + case RIDE_CONSTRUCTION_STATE_8: + if (_currentTrackSelectionFlags & 1) { map_invalidate_tile_full( - RCT2_GLOBAL(0x00F440A8, uint16) & 0xFFE0, - RCT2_GLOBAL(0x00F440AA, uint16) & 0xFFE0 + _currentTrackBeginX & 0xFFE0, + _currentTrackBeginY & 0xFFE0 ); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; } break; default: - if (RCT2_GLOBAL(0x00F440B0, uint8) & 1) { - RCT2_GLOBAL(0x00F440B0, uint8) &= ~1; + if (_currentTrackSelectionFlags & 1) { + _currentTrackSelectionFlags &= ~1; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint8) &= ~4; - map_invalidate_tile_full(RCT2_GLOBAL(0x00F440A8, uint16), RCT2_GLOBAL(0x00F440AA, uint16)); + map_invalidate_tile_full(_currentTrackBeginX, _currentTrackBeginY); } sub_6C96C0(); break; } } +/** + * + * rct2: 0x006C9800 + */ +void sub_6C9800() +{ + RCT2_CALLPROC_EBPSAFE(0x006C9800); +} + /** * * rct2: 0x006C9296 */ -static void sub_6C9296() +void ride_select_next_section() { - RCT2_CALLPROC_X(0x006C9296, 0, 0, 0, 0, 0, 0, 0); + int x, y, z, direction, type; + rct_map_element *mapElement; + rct_xy_element inputElement, outputElement; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + sub_6C9627(); + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + sub_6C84CE(); + return; + } + inputElement.x = x; + inputElement.y = y; + inputElement.element = mapElement; + if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + x = outputElement.x; + y = outputElement.y; + mapElement = outputElement.element; + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackBeginX = outputElement.x; + _currentTrackBeginY = outputElement.y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C9800(); + sub_6C84CE(); + return; + } + + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (ride_select_forwards_from_back()) { + sub_6C84CE(); + } + } } /** * * rct2: 0x006C93B8 */ -static void sub_6C93B8() +void ride_select_previous_section() { - RCT2_CALLPROC_X(0x006C93B8, 0, 0, 0, 0, 0, 0, 0); + int x, y, z, direction, type; + rct_map_element *mapElement; + track_begin_end trackBeginEnd; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + sub_6C9627(); + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + sub_6C84CE(); + return; + } + if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_BACK; + _currentTrackBeginX = trackBeginEnd.end_x; + _currentTrackBeginY = trackBeginEnd.end_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.end_direction; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C9800(); + sub_6C84CE(); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (ride_select_backwards_from_front()) { + sub_6C84CE(); + } + } } /** @@ -1038,7 +1243,7 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int sub_6C9627(); if ( - RCT2_GLOBAL(0x00F440A6, uint8) != 5 || + _rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || !(RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) & INPUT_FLAG_TOOL_ACTIVE) || RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) != WC_RIDE_CONSTRUCTION ) { @@ -1048,17 +1253,16 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int RCT2_GLOBAL(0x00F44192, uint8) = rideIndex; RCT2_GLOBAL(0x00F44193, uint8) = bl; RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; - int al = RCT2_GLOBAL(0x00F440A6, uint8); - if (al != 5) { - RCT2_GLOBAL(0x00F440A6, uint8) = 5; - RCT2_GLOBAL(0x00F440CC, uint8) = al; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; } sub_6C84CE(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2; } else { // Remove entrance / exit - game_do_command(x, 9, y, rideIndex, GAME_COMMAND_13, bl, 0); + game_do_command(x, 9, y, rideIndex, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, bl, 0); RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = entranceType == ENTRANCE_TYPE_RIDE_ENTRANCE ? 29 : 30; RCT2_GLOBAL(0x00F44191, uint8) = entranceType; } @@ -1073,13 +1277,13 @@ static int ride_modify_entrance_or_exit(rct_map_element *mapElement, int x, int */ int ride_modify_maze(rct_map_element *mapElement, int x, int y) { - RCT2_GLOBAL(0x00F440A7, uint8) = mapElement->properties.track.ride_index; - RCT2_GLOBAL(0x00F440A6, uint8) = 6; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = mapElement->base_height * 8; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentRideIndex = mapElement->properties.track.ride_index; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_6; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = mapElement->base_height * 8; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_CALLPROC_X(0x006CD887, 0, 0, 0, 0, 0, 0, 0); return 1; } @@ -1139,50 +1343,50 @@ int ride_modify(rct_xy_element *input) direction = mapElement.element->type & 3; type = mapElement.element->properties.track.type; - if (sub_6C683D(&x, &y, &z, direction, type, 0, 0, 0)) + if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, 0)) return 0; - RCT2_GLOBAL(0x00F440A7, uint8) = rideIndex; - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentRideIndex = rideIndex; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) { sub_6C84CE(); return 1; } - sub_6C9296(); - if (RCT2_GLOBAL(0x00F440A6, uint8) == 1) { + ride_select_next_section(); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { sub_6C84CE(); return 1; } - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; - sub_6C93B8(); + ride_select_previous_section(); - if (RCT2_GLOBAL(0x00F440A6, uint8) != 2) { - RCT2_GLOBAL(0x00F440A6, uint8) = 3; - RCT2_GLOBAL(0x00F440A8, uint16) = x; - RCT2_GLOBAL(0x00F440AA, uint16) = y; - RCT2_GLOBAL(0x00F440AC, uint16) = z; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = direction; - RCT2_GLOBAL(0x00F440AF, uint8) = type; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; } sub_6C84CE(); @@ -1212,24 +1416,24 @@ int sub_6CC3FB(int rideIndex) tool_set(w, 23, 12); RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) |= INPUT_FLAG_6; - ride = GET_RIDE(RCT2_GLOBAL(0x00F440A7, uint8)); + ride = GET_RIDE(_currentRideIndex); - RCT2_GLOBAL(0x00F440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; - RCT2_GLOBAL(0x00F440B2, uint8) = 0; + _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; + _currentTrackSlopeEnd = 0; RCT2_GLOBAL(0x00F440B3, uint8) = 0; - RCT2_GLOBAL(0x00F440B4, uint8) = 0; - RCT2_GLOBAL(0x00F440B5, uint8) = 0; + _currentTrackLiftHill = 0; + _currentTrackCovered = 0; if (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x8000) - RCT2_GLOBAL(0x00F440B5, uint8) |= 2; + _currentTrackCovered |= 2; - RCT2_GLOBAL(0x00F440B6, uint8) = 0; - RCT2_GLOBAL(0x00F440B7, uint8) = 0; + _previousTrackBankEnd = 0; + _previousTrackSlopeEnd = 0; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0; - RCT2_GLOBAL(0x00F440A6, uint8) = 4; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _currentTrackPieceDirection = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_GLOBAL(0x00F44159, uint8) = 0; RCT2_GLOBAL(0x00F4415C, uint8) = 0; @@ -3339,12 +3543,12 @@ int ride_check_block_brakes(rct_xy_element *input, rct_xy_element *output) trackElement = *input; rideIndex = trackElement.element->properties.track.ride_index; w = window_find_by_class(WC_RIDE_CONSTRUCTION); - if (w != NULL && RCT2_GLOBAL(0x00F440A6, uint8) != 0 && RCT2_GLOBAL(0x00F440A7, uint8) == rideIndex) + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) sub_6C9627(); loopTrackElement = NULL; while (1) { - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { // Not sure why this is the case... RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION; *output = trackElement; @@ -3502,7 +3706,7 @@ void sub_6B4D26(int rideIndex, rct_xy_element *startElement) currentElement.element->flags &= ~(1 << 5); break; } - } while (track_get_next(¤tElement, ¤tElement) && currentElement.element != startElement->element); + } while (track_get_next(¤tElement, ¤tElement, NULL, NULL) && currentElement.element != startElement->element); } } @@ -4091,7 +4295,7 @@ int ride_get_refund_price(int ride_id) }else{ edx |= 0xFF << 8; edx &= ((map_element->properties.track.sequence & 0xF) << 8) | 0xFF; - RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_4, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + RCT2_GLOBAL(0x00F4413A, int) += game_do_command_p(GAME_COMMAND_REMOVE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); } y -= 32; break; @@ -4509,7 +4713,6 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) } } - /* rct2: 0x006847BA */ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){ char bitmap[200][200] = { 0 }; @@ -4590,4 +4793,115 @@ void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int n vehicle_type->var_0E = al; vehicle_type->var_0F = bl; vehicle_type->var_10 = bh; +} + +/** + * + * rct2: 0x006CA28C + */ +money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ebx = direction << 8; + ecx = y; + edx = rideIndex | (dh << 8); + edi = di; + RCT2_CALLFUNC_X(0x006CA28C, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + return ebx; + +} + +/** + * + * rct2: 0x006CCF70 + */ +void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = x; + ebx = y; + RCT2_CALLFUNC_X(0x006CCF70, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + + if (outX != NULL) *outX = eax & 0xFFFF; + if (outY != NULL) *outY = ecx & 0xFFFF; + if (outDirection != NULL) *outDirection = ebx & 0xFF; +} + +bool ride_select_backwards_from_front() +{ + track_begin_end trackBeginEnd; + + sub_6C9627(); + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + if (sub_6C63D6(_currentTrackBeginX, _currentTrackBeginY, _currentTrackBeginZ, _currentTrackPieceDirection, &trackBeginEnd)) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + return true; + } else { + return false; + } +} + +bool ride_select_forwards_from_back() +{ + rct_map_element *mapElement; + int x, y, z, direction; + + sub_6C9627(); + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection ^ 2; + mapElement = sub_6C6096(&x, &y, &z, &direction, NULL); + if (mapElement != NULL) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = (mapElement->type & MAP_ELEMENT_DIRECTION_MASK); + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + return true; + } else { + return false; + } +} + +money32 ride_remove_track_piece(int x, int y, int z, int direction, int type) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS; + return game_do_command(x, (GAME_COMMAND_FLAG_APPLY) | ((direction & 3) << 8), y, type, GAME_COMMAND_REMOVE_TRACK, z, 0); +} + +/** + * + * rct2: 0x006B58EF + */ +bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) +{ + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) + return true; + + for (int i = 0; i < 4; i++) { + if (ride->station_starts[i] == 0xFFFF) continue; + if (ride->entrances[i] == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_ENTRANCE_NOT_YET_BUILT; + return false; + } + if (ride->exits[i] == 0xFFFF) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_EXIT_NOT_YET_BUILT; + return false; + } + } + return true; } \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 89e4217418..c367858517 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -21,6 +21,7 @@ #ifndef _RIDE_H_ #define _RIDE_H_ +#include "../addresses.h" #include "../common.h" #include "../peep/peep.h" #include "../world/map.h" @@ -343,6 +344,18 @@ typedef struct { uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C } rct_ride_measurement; +typedef struct { + int begin_x; + int begin_y; + int begin_z; + int begin_direction; + rct_map_element *begin_element; + int end_x; + int end_y; + int end_direction; + rct_map_element *end_element; +} track_begin_end; + enum { RIDE_CLASS_RIDE, RIDE_CLASS_SHOP_OR_STALL, @@ -747,6 +760,18 @@ enum { RIDE_CRASH_TYPE_FATALITIES = 8 }; +enum { + RIDE_CONSTRUCTION_STATE_0, + RIDE_CONSTRUCTION_STATE_FRONT, + RIDE_CONSTRUCTION_STATE_BACK, + RIDE_CONSTRUCTION_STATE_SELECTED, + RIDE_CONSTRUCTION_STATE_PLACE, + RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT, + RIDE_CONSTRUCTION_STATE_6, + RIDE_CONSTRUCTION_STATE_7, + RIDE_CONSTRUCTION_STATE_8 +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -776,6 +801,43 @@ extern rct_ride* g_ride_list; extern const uint8 gRideClassifications[255]; + +// Macros for very commonly used varaibles, eventually will be changed to locals or globals +#define _enabledRidePieces RCT2_GLOBAL(0x00F44048, uint64) +#define _enabledRidePiecesA RCT2_GLOBAL(0x00F44048, uint32) +#define _enabledRidePiecesB RCT2_GLOBAL(0x00F4404C, uint32) + +#define _currentTrackPrice RCT2_GLOBAL(0x00F44070, money32) + +#define _numCurrentPossibleRideConfigurations RCT2_GLOBAL(0x00F44078, uint16) +#define _numCurrentPossibleSpecialTrackPieces RCT2_GLOBAL(0x00F4407A, uint16) + +#define _currentTrackCurve RCT2_GLOBAL(0x00F440A0, uint16) +#define _currentTrackEndX RCT2_GLOBAL(0x00F440A2, uint16) +#define _currentTrackEndY RCT2_GLOBAL(0x00F440A4, uint16) +#define _rideConstructionState RCT2_GLOBAL(0x00F440A6, uint8) +#define _currentRideIndex RCT2_GLOBAL(0x00F440A7, uint8) +#define _currentTrackBeginX RCT2_GLOBAL(0x00F440A8, uint16) +#define _currentTrackBeginY RCT2_GLOBAL(0x00F440AA, uint16) +#define _currentTrackBeginZ RCT2_GLOBAL(0x00F440AC, uint16) +#define _currentTrackPieceDirection RCT2_GLOBAL(0x00F440AE, uint8) +#define _currentTrackPieceType RCT2_GLOBAL(0x00F440AF, uint8) +#define _currentTrackSelectionFlags RCT2_GLOBAL(0x00F440B0, uint8) +#define _rideConstructionArrowPulseTime RCT2_GLOBAL(0x00F440B1, sint8) +#define _currentTrackSlopeEnd RCT2_GLOBAL(0x00F440B2, uint8) +#define _currentTrackBankEnd RCT2_GLOBAL(0x00F440B3, uint8) +#define _currentTrackLiftHill RCT2_GLOBAL(0x00F440B4, uint8) +#define _currentTrackCovered RCT2_GLOBAL(0x00F440B5, uint8) + +#define _previousTrackBankEnd RCT2_GLOBAL(0x00F440B6, uint8) +#define _previousTrackSlopeEnd RCT2_GLOBAL(0x00F440B7, uint8) + +#define _previousTrackPieceX RCT2_GLOBAL(0x00F440B9, uint16) +#define _previousTrackPieceY RCT2_GLOBAL(0x00F440BB, uint16) +#define _previousTrackPieceZ RCT2_GLOBAL(0x00F440BD, uint16) + +#define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8) + int ride_get_count(); int ride_get_total_queue_length(rct_ride *ride); int ride_get_max_queue_time(rct_ride *ride); @@ -787,7 +849,6 @@ void ride_check_all_reachable(); void ride_update_satisfaction(rct_ride* ride, uint8 happiness); void ride_update_popularity(rct_ride* ride, uint8 pop_amount); int sub_6CAF80(int rideIndex, rct_xy_element *output); -int track_get_next(rct_xy_element *input, rct_xy_element *output); int ride_find_track_gap(rct_xy_element *input, rct_xy_element *output); void ride_construct_new(ride_list_item listItem); void ride_construct(int rideIndex); @@ -828,6 +889,9 @@ void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *es void ride_clear_for_construction(int rideIndex); void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); +void ride_select_next_section(); +void ride_select_previous_section(); + int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); int get_var_10E_unk_3(rct_ride* ride); @@ -852,4 +916,24 @@ bool ride_is_powered_launched(rct_ride *ride); bool ride_has_any_track_elements(int rideIndex); void ride_all_has_any_track_elements(bool *rideIndexArray); +void sub_6C9800(); + +bool track_get_next(rct_xy_element *input, rct_xy_element *output, int *z, int *direction); +bool track_get_previous(int x, int y, rct_map_element *mapElement, track_begin_end *outTrackBeginEnd); + +rct_map_element *sub_6C6096(int *x, int *y, int *z, int *direction, int *direction2); +bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *outTrackBeginEnd); + +void sub_6C84CE(); +void sub_6C96C0(); +money32 ride_get_entrance_or_exit_price(int rideIndex, int x, int y, int direction, int dh, int di); +void ride_get_entrance_or_exit_position_from_screen_position(int x, int y, int *outX, int *outY, int *outDirection); + +bool ride_select_backwards_from_front(); +bool ride_select_forwards_from_back(); + +money32 ride_remove_track_piece(int x, int y, int z, int direction, int type); + +bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride); + #endif diff --git a/src/ride/ride_ratings.c b/src/ride/ride_ratings.c index ed26aac9d2..a74aa81263 100644 --- a/src/ride/ride_ratings.c +++ b/src/ride/ride_ratings.c @@ -51,21 +51,6 @@ static void loc_6B5BB2(); static void ride_ratings_calculate(rct_ride *ride); static void ride_ratings_calculate_value(rct_ride *ride); -int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - - eax = *x; - ecx = *y; - esi = (int)*mapElement; - int result = RCT2_CALLFUNC_X(0x006C6402, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - *x = *((uint16*)&eax); - *y = *((uint16*)&ecx); - *z = *((uint8*)&edx); - *mapElement = (rct_map_element*)esi; - return result & (0x100); -} - /** * * rct2: 0x006B5A2A @@ -245,7 +230,7 @@ static void ride_ratings_update_state_2() trackElement.x = RCT2_GLOBAL(0x0138B584, uint16); trackElement.y = RCT2_GLOBAL(0x0138B586, uint16); trackElement.element = mapElement; - if (!track_get_next(&trackElement, &nextTrackElement)) { + if (!track_get_next(&trackElement, &nextTrackElement, NULL, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_4; return; } @@ -339,7 +324,7 @@ static void ride_ratings_update_state_5() x = RCT2_GLOBAL(0x0138B584, uint16); y = RCT2_GLOBAL(0x0138B586, uint16); - if (!sub_6C6402(&mapElement, &x, &y, &z)) { + if (!track_get_previous(x, y, mapElement, NULL)) { _rideRatingsState = RIDE_RATINGS_STATE_CALCULATE; return; } diff --git a/src/ride/ride_ratings.h b/src/ride/ride_ratings.h index 467b2c23a8..5baa99e2e9 100644 --- a/src/ride/ride_ratings.h +++ b/src/ride/ride_ratings.h @@ -25,6 +25,5 @@ #include "ride.h" void ride_ratings_update_all(); -int sub_6C6402(rct_map_element **mapElement, int *x, int *y, int *z); #endif \ No newline at end of file diff --git a/src/ride/track.c b/src/ride/track.c index 38cc18f3b9..0f73007b47 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -47,193 +47,193 @@ const rct_trackdefinition *gTrackDefinitions = (rct_trackdefinition*)0x00997C9D; // TODO This table is incorrect or at least missing 69 elements. There should be 256 in total! const rct_trackdefinition gTrackDefinitions_INCORRECT[] = { // TYPE VANGLE END VANGLE START BANK END BANK START SPECIAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN - { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT - { TRACK_S_BEND, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT - { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP - { TRACK_VERTICAL_LOOP, TRACK_DOWN_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN - { TRACK_TWIST, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN - { TRACK_HALF_LOOP, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP - { TRACK_HALF_LOOP, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN - { TRACK_CORKSCREW, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_END_STATION + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BEGIN_STATION + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_MIDDLE_STATION + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN + { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT + { TRACK_S_BEND, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT + { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_LEFT_VERTICAL_LOOP + { TRACK_VERTICAL_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_UNKNOWN_VERTICAL_LOOP }, // ELEM_RIGHT_VERTICAL_LOOP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_TWIST_DOWN_TO_UP + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_TWIST_DOWN_TO_UP + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_TWIST_UP_TO_DOWN + { TRACK_TWIST, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_TWIST_UP_TO_DOWN + { TRACK_HALF_LOOP, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_HALF_LOOP_UP + { TRACK_HALF_LOOP, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_HALF_LOOP_DOWN + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_CORKSCREW_UP + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_CORKSCREW_UP + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_LEFT_CORKSCREW_DOWN + { TRACK_CORKSCREW, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_CORKSCREW_DOWN }, // ELEM_RIGHT_CORKSCREW_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_FLAT { TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_BASE { TRACK_TOWER_BASE, TRACK_VANGLE_TOWER, TRACK_VANGLE_TOWER, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_TOWER_SECTION - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE - { TRACK_HELIX_SMALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN - { TRACK_BRAKES, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES - { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN - { TRACK_HELIX_LARGE_UNBANKED, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED - { TRACK_WATERFALL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL - { TRACK_RAPIDS, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS - { TRACK_ON_RIDE_PHOTO, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED - { TRACK_WATER_SPLASH, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE - { TRACK_WHIRLPOOL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE - { TRACK_LIFT_HILL, TRACK_DOWN_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL - { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_UP_TO_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_25_DEG_DOWN_TO_FLAT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_LEFT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_S_BEND_RIGHT_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE + { TRACK_HELIX_SMALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + { TRACK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKES + { TRACK_ROTATION_CONTROL_TOGGLE,TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ROTATION_CONTROL_TOGGLE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_UP + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_UP + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN + { TRACK_HELIX_LARGE_UNBANKED, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_UP_LEFT_BANKED + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_UP_RIGHT_BANKED + { TRACK_WATERFALL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATERFALL + { TRACK_RAPIDS, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RAPIDS + { TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_ON_RIDE_PHOTO + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_25_DEG_DOWN_LEFT_BANKED + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_25_DEG_DOWN_RIGHT_BANKED + { TRACK_WATER_SPLASH, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WATER_SPLASH + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_UP_LONG_BASE + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + { TRACK_WHIRLPOOL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_WHIRLPOOL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + { TRACK_LIFT_HILL, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_CABLE_LIFT_HILL + { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_SLOPE { TRACK_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_VANGLE_WHOA_BELLY, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_REVERSE_WHOA_BELLY_VERTICAL - { TRACK_FLAT, TRACK_UP_90, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP - { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN - { TRACK_FLAT, TRACK_UP_90, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_DOWN_90, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN - { TRACK_BRAKE_FOR_DROP, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_60, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_60, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_UP_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT - { TRACK_FLAT, TRACK_DOWN_60, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK - { TRACK_LOG_FLUME_REVERSER, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER - { TRACK_SPINNING_TUNNEL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP - { TRACK_BARREL_ROLL, TRACK_NONE, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_UP_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK - { TRACK_FLAT, TRACK_NONE, TRACK_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK - { TRACK_POWERED_LIFT, TRACK_UP_25, TRACK_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT - { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP - { TRACK_HALF_LOOP_2, TRACK_NONE, TRACK_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP - { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN - { TRACK_HALF_LOOP_2, TRACK_DOWN_25, TRACK_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_90, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_UP_TO_90_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_90_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_DOWN_90, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + { TRACK_BRAKE_FOR_DROP, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_BRAKE_FOR_DROP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_EIGHTH_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_DIAG + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_UP_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_DOWN_60, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_60_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_60_DEG_DOWN_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_FLAT_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_FLAT + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_DIAG_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_DIAG_RIGHT_BANK + { TRACK_LOG_FLUME_REVERSER, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LOG_FLUME_REVERSER + { TRACK_SPINNING_TUNNEL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_SPINNING_TUNNEL + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP + { TRACK_BARREL_ROLL, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_NONE }, // ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_LEFT, TRACK_NONE }, // ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_UP_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_RIGHT, TRACK_NONE }, // ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK + { TRACK_FLAT, TRACK_SLOPE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK + { TRACK_POWERED_LIFT, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_NONE }, // ELEM_POWERED_LIFT + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_LEFT_LARGE_HALF_LOOP_UP + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_UPSIDE_DOWN, TRACK_BANK_NONE, TRACK_HALF_LOOP_UP }, // ELEM_RIGHT_LARGE_HALF_LOOP_UP + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_RIGHT_LARGE_HALF_LOOP_DOWN + { TRACK_HALF_LOOP_LARGE, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_UPSIDE_DOWN, TRACK_HALF_LOOP_DOWN }, // ELEM_LEFT_LARGE_HALF_LOOP_DOWN }; static bool track_save_should_select_scenery_around(int rideIndex, rct_map_element *mapElement); @@ -1404,10 +1404,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){ - cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_12, -1, 0); + cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, (z / 16) & 0xFF, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); } else{ - cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_12, 0, 0); + cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0); } if (cost != MONEY32_UNDEFINED){ RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0); @@ -1423,10 +1423,10 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac bl = 1; if (RCT2_GLOBAL(0x00F440D4, uint8) == 4)bl = 0x69; if (RCT2_GLOBAL(0x00F440D4, uint8) == 1){ - cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_12, -1, 0); + cost = game_do_command(mapCoord.x, 0 | rotation << 8, mapCoord.y, ((z / 16) & 0xFF) | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); } else{ - cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_12, 0, 0); + cost = game_do_command(mapCoord.x, bl | rotation << 8, mapCoord.y, rideIndex | (1 << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, 0, 0); } if (cost != MONEY32_UNDEFINED){ RCT2_GLOBAL(0x00F4414E, uint8) |= (1 << 0); @@ -1588,7 +1588,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac temp_z += trackBlock->z; // rotation in bh // track_type in dl - game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_4, temp_z, 0); + game_do_command(x, 0x69 | ((rotation & 3) << 8), y, track_type, GAME_COMMAND_REMOVE_TRACK, temp_z, 0); } if (RCT2_GLOBAL(0x00F440D4, uint8) == 1 || @@ -1616,7 +1616,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_3, edi, 0); + money32 cost = game_do_command(x, bl | (rotation << 8), y, edx, GAME_COMMAND_PLACE_TRACK, edi, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -1822,7 +1822,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac if (RCT2_GLOBAL(0x00F440D4, uint8) == 1)bl = 0; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_12, di, 0); + money32 cost = game_do_command(x, bl | (rotation << 8), y, rideIndex | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, di, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -1841,7 +1841,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac z /= 16; RCT2_GLOBAL(0x00141E9AE, rct_string_id) = 927; - money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_12, -1, 0); + money32 cost = game_do_command(x, 0 | (rotation << 8), y, z | (is_exit << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, -1, 0); RCT2_GLOBAL(0x00F440D5, money32) += cost; if (cost == MONEY32_UNDEFINED){ @@ -2617,10 +2617,11 @@ int maze_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_ } /* rct2: 0x006CE68D */ -int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements){ +int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* track_elements) +{ rct_ride* ride = GET_RIDE(rideIndex); - rct_xy_element trackElement; + track_begin_end trackBeginEnd; if (sub_6CAF80(rideIndex, &trackElement) == 0){ RCT2_GLOBAL(0x00141E9AC, uint16) = 3347; @@ -2629,18 +2630,12 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra int z = 0; //6ce69e - if (!(sub_6C6402(&trackElement.element, &trackElement.x, &trackElement.y, &z))){ + if (track_get_previous(trackElement.x, trackElement.y, trackElement.element, &trackBeginEnd)) { rct_map_element* initial_map = trackElement.element; do { - int x = trackElement.x; - int y = trackElement.y; - rct_map_element* map_element = trackElement.element; - if (sub_6C6402(&map_element, &x, &y, &z)){ + if (!track_get_previous(trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_element, &trackBeginEnd)) { break; } - trackElement.x = x; - trackElement.y = y; - trackElement.element = map_element; } while (initial_map != trackElement.element); } @@ -2733,7 +2728,7 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra track->flags = flags; track++; - if (!track_get_next(&trackElement, &trackElement)) + if (!track_get_next(&trackElement, &trackElement, NULL, NULL)) break; z = trackElement.element->base_height * 8; @@ -3432,3 +3427,15 @@ static void track_save_add_map_element(int mapElementSelectType, int x, int y, r { RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0); } + +rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) +{ + return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_ADDRESS(0x00994A38, rct_preview_track*)[trackType] : + RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; +} + +rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) +{ + return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); +} diff --git a/src/ride/track.h b/src/ride/track.h index dc5e8acb64..5497bdbc45 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -43,7 +43,7 @@ typedef struct { sint16 x; // 0x01 sint16 y; // 0x03 sint16 z; - uint8 pad_07; + uint8 var_07; uint8 var_08; uint8 var_09; } rct_preview_track; @@ -181,40 +181,86 @@ enum { TRACK_NONE = 0, TRACK_FLAT = 0, - TRACK_STATION_END = 2, - TRACK_VERTICAL_LOOP = 7, - TRACK_S_BEND = 13, - TRACK_TWIST = 17, - TRACK_HALF_LOOP = 18, - TRACK_CORKSCREW = 19, - TRACK_TOWER_BASE = 20, - TRACK_HELIX_SMALL= 21, - TRACK_HELIX_LARGE= 22, - TRACK_HELIX_LARGE_UNBANKED = 23, - TRACK_BRAKES = 24, - TRACK_ON_RIDE_PHOTO = 26, - TRACK_WATER_SPLASH = 27, - TRACK_BARREL_ROLL = 29, - TRACK_POWERED_LIFT = 30, - TRACK_HALF_LOOP_2 = 31, // ? - TRACK_LOG_FLUME_REVERSER = 33, - TRACK_WHOA_BELLY = 36, - TRACK_LIFT_HILL = 43, - TRACK_SPINNING_TUNNEL = 46, - TRACK_ROTATION_CONTROL_TOGGLE = 47, - TRACK_RAPIDS = 52, + TRACK_STRAIGHT, + TRACK_STATION_END, + TRACK_LIFT_HILL, + TRACK_LIFT_HILL_STEEP, + TRACK_LIFT_HILL_CURVE, + TRACK_FLAT_ROLL_BANKING, + TRACK_VERTICAL_LOOP, + TRACK_SLOPE, + TRACK_SLOPE_STEEP, + TRACK_SLOPE_LONG, + TRACK_SLOPE_CURVE, + TRACK_SLOPE_CURVE_STEEP, + TRACK_S_BEND, + TRACK_CURVE_VERY_SMALL, + TRACK_CURVE_SMALL, + TRACK_CURVE, + TRACK_TWIST, + TRACK_HALF_LOOP, + TRACK_CORKSCREW, + TRACK_TOWER_BASE, + TRACK_HELIX_SMALL, + TRACK_HELIX_LARGE, + TRACK_HELIX_LARGE_UNBANKED, + TRACK_BRAKES, + TRACK_25, + TRACK_ON_RIDE_PHOTO, + TRACK_WATER_SPLASH, + TRACK_SLOPE_VERTICAL, + TRACK_BARREL_ROLL, + TRACK_POWERED_LIFT, + TRACK_HALF_LOOP_LARGE, + TRACK_SLOPE_CURVE_BANKED, + TRACK_LOG_FLUME_REVERSER, + TRACK_HEARTLINE_ROLL, + TRACK_REVERSER, + TRACK_WHOA_BELLY, + TRACK_SLOPE_TO_FLAT, + TRACK_BLOCK_BRAKES, + TRACK_SLOPE_ROLL_BANKING, + TRACK_SLOPE_STEEP_LONG, + TRACK_CURVE_VERTICAL, + TRACK_42, + TRACK_LIFT_HILL_CABLE, + TRACK_LIFT_HILL_CURVED, + TRACK_QUARTER_LOOP, + TRACK_SPINNING_TUNNEL, + TRACK_ROTATION_CONTROL_TOGGLE, + TRACK_INLINE_TWIST_UNINVERTED, + TRACK_INLINE_TWIST_INVERTED, + TRACK_QUARTER_LOOP_UNINVERTED, + TRACK_QUARTER_LOOP_INVERTED, + TRACK_RAPIDS, + TRACK_HALF_LOOP_UNINVERTED, + TRACK_HALF_LOOP_INVERTED, + TRACK_WATERFALL = 152, TRACK_WHIRLPOOL = 152, TRACK_BRAKE_FOR_DROP = 172 }; enum { - TRACK_UP_25 = 2, - TRACK_UP_60 = 4, - TRACK_DOWN_25 = 6, - TRACK_DOWN_60 = 8, - TRACK_UP_90 = 10, - TRACK_DOWN_90 = 18, + TRACK_CURVE_LEFT_VERY_SMALL = 5, + TRACK_CURVE_LEFT_SMALL = 3, + TRACK_CURVE_LEFT = 1, + TRACK_CURVE_LEFT_LARGE = 7, + TRACK_CURVE_NONE = 0, + TRACK_CURVE_RIGHT_LARGE = 8, + TRACK_CURVE_RIGHT = 2, + TRACK_CURVE_RIGHT_SMALL = 4, + TRACK_CURVE_RIGHT_VERY_SMALL = 6 +}; + +enum { + TRACK_SLOPE_NONE = 0, + TRACK_SLOPE_UP_25 = 2, + TRACK_SLOPE_UP_60 = 4, + TRACK_SLOPE_DOWN_25 = 6, + TRACK_SLOPE_DOWN_60 = 8, + TRACK_SLOPE_UP_90 = 10, + TRACK_SLOPE_DOWN_90 = 18, TRACK_VANGLE_TOWER = 10, TRACK_VANGLE_WHOA_BELLY = 10 @@ -445,4 +491,7 @@ void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); +rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); +rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); + #endif diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c new file mode 100644 index 0000000000..ee801a53bc --- /dev/null +++ b/src/windows/maze_construction.c @@ -0,0 +1,211 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../audio/audio.h" +#include "../drawing/drawing.h" +#include "../game.h" +#include "../input.h" +#include "../interface/themes.h" +#include "../interface/viewport.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../ride/track.h" +#include "dropdown.h" + +#pragma region Widgets + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_MAZE_MODE_GROUPBOX, + WIDX_MAZE_BUILD_MODE = 6, + WIDX_MAZE_MOVE_MODE, + WIDX_MAZE_FILL_MODE, + WIDX_MAZE_DIRECTION_GROUPBOX = 23, + WIDX_MAZE_DIRECTION_NW, + WIDX_MAZE_DIRECTION_NE, + WIDX_MAZE_DIRECTION_SW, + WIDX_MAZE_DIRECTION_SE, +}; + +static rct_widget window_maze_construction_widgets[] = { + { WWT_FRAME, 0, 0, 165, 0, 199, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 17, 71, STR_RIDE_CONSTRUCTION_MODE, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_FLATBTN, 1, 35, 66, 29, 60, 0x15C8, STR_RIDE_CONSTRUCTION_BUILD_MODE }, + { WWT_FLATBTN, 1, 67, 98, 29, 60, 0x15C9, STR_RIDE_CONSTRUCTION_MOVE_MODE }, + { WWT_FLATBTN, 1, 99, 130, 29, 60, 0x15CA, STR_RIDE_CONSTRUCTION_FILL_IN_MODE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 80, 166, STR_RIDE_CONSTRUCTION_BUILD, STR_NONE }, + { WWT_FLATBTN, 1, 83, 127, 96, 124, 0x1603, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 83, 127, 125, 153, 0x1604, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 38, 82, 125, 153, 0x1605, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_FLATBTN, 1, 38, 82, 96, 124, 0x1606, STR_RIDE_CONSTRUCTION_BUILD_MAZE_IN_THIS_DIRECTION_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 168, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 9, 78, 178, 189, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 87, 156, 178, 189, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, STR_NONE }, + { WIDGETS_END } +}; + +#pragma endregion + +#pragma region Events + +static void window_maze_construction_emptysub() {} + +static void window_maze_construction_close(); +static void window_maze_construction_invalidate(); +static void window_maze_construction_paint(); + +// 0x993F6C +static void* window_maze_construction_events[] = { + window_maze_construction_close, + (void*)0x006CD461, + (void*)0x006CD623, + (void*)0x006CD48C, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + (void*)0x006CD767, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + (void*)0x006CD63E, + (void*)0x006CD65D, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_emptysub, + window_maze_construction_invalidate, + window_maze_construction_paint, + window_maze_construction_emptysub +}; + +#pragma endregion + +/** + * + * rct2: 0x006CB481 + */ +rct_window *window_maze_construction_open() +{ + rct_window *w = window_create(0, 29, 166, 200, (uint32*)window_maze_construction_events, WC_RIDE_CONSTRUCTION, WF_9); + w->widgets = window_maze_construction_widgets; + w->enabled_widgets = 0x6F0001C4; + + window_init_scroll_widgets(w); + colour_scheme_update(w); + + w->number = _currentRideIndex; + + window_push_others_right(w); + show_gridlines(); + return w; +} + +/** + * + * rct2: 0x006CD811 + */ +static void window_maze_construction_close() +{ + rct_window *w; + + window_get_register(w); + + sub_6C9627(); + viewport_set_visibility(0); + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); + + // In order to cancel the yellow arrow correctly the + // selection tool should be cancelled. + tool_cancel(); + + hide_gridlines(); + + uint8 rideIndex = _currentRideIndex; + rct_ride* ride = GET_RIDE(rideIndex); + if (ride->overall_view == 0xFFFF) { + int savedPausedState = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); + RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); + RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = savedPausedState; + } else { + window_ride_main_open(rideIndex); + } +} + +/** + * + * rct2: 0x006CD435 + */ +static void window_maze_construction_invalidate() +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + + // Set window title arguments + RCT2_GLOBAL(0x013CE956, rct_string_id) = ride->name; + RCT2_GLOBAL(0x013CE958, uint32) = ride->name_arguments; +} + +/** + * + * rct2: 0x006CD45B + */ +static void window_maze_construction_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); +} diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 7cb6c54658..ae22b6fff6 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -19,138 +19,497 @@ *****************************************************************************/ #include "../addresses.h" -#include "../interface/window.h" -#include "../interface/viewport.h" -#include "../game.h" -#include "../ride/track.h" +#include "../audio/audio.h" #include "../drawing/drawing.h" +#include "../game.h" +#include "../input.h" #include "../interface/themes.h" +#include "../interface/viewport.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../ride/track.h" +#include "dropdown.h" /* move to ride.c */ -void sub_6b2fa9(rct_windownumber number){ +void sub_6B2FA9(rct_windownumber number) +{ rct_window* w; w = window_find_by_number(WC_RIDE, number); - if (w){ - if (w->page == 1){ - window_close(w); - } - } + if (w != NULL && w->page == 1) + window_close(w); } +#pragma region Widgets + enum { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, - WIDX_PAGE_BACKGROUND, - - WIDX_DEMOLISH = 24 + WIDX_DIRECTION_GROUPBOX, + WIDX_SLOPE_GROUPBOX, + WIDX_BANKING_GROUPBOX, + WIDX_LEFT_CURVE_VERY_SMALL, + WIDX_LEFT_CURVE_SMALL, + WIDX_LEFT_CURVE, + WIDX_STRAIGHT, + WIDX_RIGHT_CURVE, + WIDX_RIGHT_CURVE_SMALL, + WIDX_RIGHT_CURVE_VERY_SMALL, + WIDX_SPECIAL_TRACK_DROPDOWN, + WIDX_SLOPE_DOWN_STEEP, + WIDX_SLOPE_DOWN, + WIDX_LEVEL, + WIDX_SLOPE_UP, + WIDX_SLOPE_UP_STEEP, + WIDX_CHAIN_LIFT, + WIDX_BANK_LEFT, + WIDX_BANK_STRAIGHT, + WIDX_BANK_RIGHT, + WIDX_CONSTRUCT, + WIDX_DEMOLISH, + WIDX_LEFT_CURVE_LARGE, + WIDX_PREVIOUS_SECTION, + WIDX_NEXT_SECTION, + WIDX_ENTRANCE_EXIT_GROUPBOX, + WIDX_ENTRANCE, + WIDX_EXIT, + WIDX_RIGHT_CURVE_LARGE, + WIDX_ROTATE, + WIDX_U_TRACK, + WIDX_O_TRACK, + WIDX_SEAT_ROTATION_GROUPBOX, + WIDX_SEAT_ROTATION_ANGLE_SPINNER, + WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP, + WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN, }; -void window_construction_emptysub(){} -void window_construction_close(); -void window_construction_mouseup(); -void window_construction_paint(); - -void window_construction_maze_close(); -void window_construction_maze_invalidate(); -void window_construction_maze_paint(); - -// 0x993F6C -static void* window_construction_maze_events[] = { - window_construction_maze_close, - (void*)0x6CD461, - (void*)0x6CD623, - (void*)0x6CD48C, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6CD767, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6CD63E, - (void*)0x6CD65D, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_maze_invalidate, - window_construction_maze_paint, - window_construction_emptysub +static rct_widget window_ride_construction_widgets[] = { + { WWT_FRAME, 0, 0, 165, 0, 393, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 164, 1, 14, 896, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 153, 163, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 17, 73, STR_RIDE_CONSTRUCTION_DIRECTION, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 76, 116, STR_RIDE_CONSTRUCTION_SLOPE, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 162, 120, 160, STR_RIDE_CONSTRUCTION_ROLL_BANKING, STR_NONE }, + { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_VERY_SMALL_TIP }, + { WWT_FLATBTN, 1, 6, 27, 29, 52, 0x1414, STR_RIDE_CONSTRUCTION_LEFT_CURVE_SMALL_TIP }, + { WWT_FLATBTN, 1, 28, 49, 29, 52, 0x1412, STR_RIDE_CONSTRUCTION_LEFT_CURVE_TIP }, + { WWT_FLATBTN, 1, 72, 93, 29, 52, 0x1411, STR_RIDE_CONSTRUCTION_STRAIGHT_TIP }, + { WWT_FLATBTN, 1, 116, 137, 29, 52, 0x1413, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_TIP }, + { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_SMALL_TIP }, + { WWT_FLATBTN, 1, 138, 159, 29, 52, 0x1415, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_VERY_SMALL_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 17, 148, 55, 68, 1384, STR_RIDE_CONSTRUCTION_OTHER_TRACK_CONFIGURATIONS_TIP }, + { WWT_FLATBTN, 1, 23, 46, 88, 111, 0x1418, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP }, + { WWT_FLATBTN, 1, 47, 70, 88, 111, 0x1419, STR_RIDE_CONSTRUCTION_SLOPE_DOWN_TIP }, + { WWT_FLATBTN, 1, 71, 94, 88, 111, 0x141A, STR_RIDE_CONSTRUCTION_LEVEL_TIP }, + { WWT_FLATBTN, 1, 95, 118, 88, 111, 0x141B, STR_RIDE_CONSTRUCTION_SLOPE_UP_TIP }, + { WWT_FLATBTN, 1, 119, 142, 88, 111, 0x141C, STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP }, + { WWT_FLATBTN, 1, 134, 157, 88, 111, 0x142B, STR_RIDE_CONSTRUCTION_CHAIN_LIFT_TIP }, + { WWT_FLATBTN, 1, 47, 70, 132, 155, 0x1421, STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP }, + { WWT_FLATBTN, 1, 71, 94, 132, 155, 0x1422, STR_RIDE_CONSTRUCTION_NO_ROLL_TIP }, + { WWT_FLATBTN, 1, 95, 118, 132, 155, 0x1423, STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP }, + { WWT_IMGBTN, 1, 3, 162, 164, 333, 0xFFFFFFFF, STR_RIDE_CONSTRUCTION_CONSTRUCT_SELECTED_SECTION_TIP }, + { WWT_FLATBTN, 1, 60, 105, 338, 361, 0x142A, STR_RIDE_CONSTRUCTION_REMOVE_HIGHLIGHTED_SECTION_TIP }, + { WWT_FLATBTN, 1, 50, 71, 29, 52, 0x1416, STR_RIDE_CONSTRUCTION_LEFT_CURVE_LARGE_TIP }, + { WWT_FLATBTN, 1, 20, 43, 338, 361, 0x1428, STR_RIDE_CONSTRUCTION_MOVE_TO_PREVIOUS_SECTION_TIP }, + { WWT_FLATBTN, 1, 122, 145, 338, 361, 0x1429, STR_RIDE_CONSTRUCTION_MOVE_TO_NEXT_SECTION_TIP }, + { WWT_GROUPBOX, 0, 3, 162, 362, 389, 0xFFFFFFFF, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 9, 78, 372, 383, STR_RIDE_CONSTRUCTION_ENTRANCE, STR_RIDE_CONSTRUCTION_ENTRANCE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 87, 156, 372, 383, STR_RIDE_CONSTRUCTION_EXIT, STR_RIDE_CONSTRUCTION_EXIT_TIP }, + { WWT_FLATBTN, 1, 94, 115, 29, 52, 0x1417, STR_RIDE_CONSTRUCTION_RIGHT_CURVE_LARGE_TIP }, + { WWT_FLATBTN, 1, 72, 95, 338, 361, 0x1431, STR_ROTATE_90_TIP }, + { WWT_FLATBTN, 1, 19, 42, 132, 155, 0x1424, STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP }, + { WWT_FLATBTN, 1, 123, 146, 132, 155, 0x1425, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP }, + { WWT_GROUPBOX, 0, 96, 162, 120, 160, STR_RIDE_CONSTRUCTION_SEAT_ROT, STR_NONE }, + { WWT_SPINNER, 1, 101, 158, 138, 149, 0, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 147, 157, 139, 143, STR_NUMERIC_UP, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WWT_DROPDOWN_BUTTON, 1, 147, 157, 144, 148, STR_NUMERIC_DOWN, STR_RIDE_CONSTRUCTION_SELECT_SEAT_ROTATION_ANGLE_TIP }, + { WIDGETS_END } }; +#pragma endregion + +#pragma region Events + +static void window_ride_construction_emptysub() {} + +static void window_ride_construction_close(); +static void window_ride_construction_mouseup(); +static void window_ride_construction_resize(); +static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); +static void window_ride_construction_dropdown(); +static void window_ride_construction_update(rct_window *w); +static void window_ride_construction_toolupdate(); +static void window_ride_construction_tooldown(); +static void window_ride_construction_invalidate(); +static void window_ride_construction_paint(); + //0x993EEC -static void* window_construction_events[] = { - window_construction_close, - window_construction_mouseup, - (void*)0x6C7934, - (void*)0x6C6E6A, - (void*)0x6C78CD, - window_construction_emptysub, - (void*)0x6C8374, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6C8229, - (void*)0x6C8248, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - window_construction_emptysub, - (void*)0x6C6AD5, - window_construction_paint,//(void*)0x6C6B86, - window_construction_emptysub +static void* window_ride_construction_events[] = { + window_ride_construction_close, + window_ride_construction_mouseup, + window_ride_construction_resize, + window_ride_construction_mousedown, + window_ride_construction_dropdown, + window_ride_construction_emptysub, + window_ride_construction_update, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_toolupdate, + window_ride_construction_tooldown, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_emptysub, + window_ride_construction_invalidate, + window_ride_construction_paint, + window_ride_construction_emptysub }; +#pragma endregion + +#pragma region RideConfigurationStringIds + +// rct2: 0x00999492 +rct_string_id RideConfigurationStringIds[] = { + 0, // 0 + STR_STATION_PLATFORM, // 1 + 0, // 2 + 0, // 3 + 0, // 4 + 0, // 5 + 0, // 6 + 0, // 7 + 0, // 8 + 0, // 9 + 0, // 10 + 0, // 11 + 0, // 12 + 0, // 13 + 0, // 14 + 0, // 15 + 0, // 16 + 0, // 17 + 0, // 18 + 0, // 19 + 0, // 20 + 0, // 21 + 0, // 22 + 0, // 23 + 0, // 24 + 0, // 25 + 0, // 26 + 0, // 27 + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + 0, // 32 + 0, // 33 + 0, // 34 + 0, // 35 + 0, // 36 + 0, // 37 + STR_S_BEND_LEFT, // 38 + STR_S_BEND_RIGHT, // 39 + STR_VERTICAL_LOOP_LEFT, // 40 + STR_VERTICAL_LOOP_RIGHT, // 41 + 0, // 42 + 0, // 43 + 0, // 44 + 0, // 45 + 0, // 46 + 0, // 47 + 0, // 48 + 0, // 49 + 0, // 50 + 0, // 51 + STR_IN_LINE_TWIST_LEFT, // 52 + STR_IN_LINE_TWIST_RIGHT, // 53 + STR_IN_LINE_TWIST_LEFT, // 54 + STR_IN_LINE_TWIST_RIGHT, // 55 + STR_HALF_LOOP, // 56 + STR_HALF_LOOP, // 57 + STR_HALF_CORKSCREW_LEFT, // 58 + STR_HALF_CORKSCREW_RIGHT, // 59 + STR_HALF_CORKSCREW_LEFT, // 60 + STR_HALF_CORKSCREW_RIGHT, // 61 + 0, // 62 + 0, // 63 + 0, // 64 + 0, // 65 + STR_ENTRY_EXIT_PLATFORM, // 66 + STR_VERTICAL_TOWER, // 67 + 0, // 68 + 0, // 69 + 0, // 70 + 0, // 71 + 0, // 72 + 0, // 73 + 0, // 74 + 0, // 75 + 0, // 76 + 0, // 77 + 0, // 78 + 0, // 79 + 0, // 80 + 0, // 81 + 0, // 82 + STR_S_BEND_LEFT, // 83 + STR_S_BEND_RIGHT, // 84 + 0, // 85 + 0, // 86 + STR_HELIX_UP_SMALL, // 87 + STR_HELIX_UP_SMALL, // 88 + STR_HELIX_DOWN_SMALL, // 89 + STR_HELIX_DOWN_SMALL, // 90 + STR_HELIX_UP_LARGE, // 91 + STR_HELIX_UP_LARGE, // 92 + STR_HELIX_DOWN_LARGE, // 93 + STR_HELIX_DOWN_LARGE, // 94 + 0, // 95 + 0, // 96 + 0, // 97 + 0, // 98 + STR_BRAKES, // 99 + STR_SPINNING_CONTROL_TOGGLE_TRACK, // 100 + 0, // 101 + STR_HELIX_UP_LARGE, // 102 + STR_HELIX_UP_LARGE, // 103 + STR_HELIX_DOWN_LARGE, // 104 + STR_HELIX_DOWN_LARGE, // 105 + STR_HELIX_UP_LEFT, // 106 + STR_HELIX_UP_RIGHT, // 107 + STR_HELIX_DOWN_LEFT, // 108 + STR_HELIX_DOWN_RIGHT, // 109 + STR_BASE_SIZE_2_X_2, // 110 + STR_BASE_SIZE_4_X_4, // 111 + STR_WATERFALLS, // 112 + STR_RAPIDS, // 113 + STR_ON_RIDE_PHOTO_SECTION, // 114 + STR_BASE_SIZE_2_X_4, // 115 + STR_BASE_SIZE_5_X_1, // 116 + STR_WATER_SPLASH, // 117 + 0, // 118 + 0, // 119 + STR_WHIRLPOOL, // 120 + 0, // 121 + 0, // 122 + STR_CABLE_LIFT_HILL, // 123 + STR_SLOPE_UP_TO_VERTICAL, // 124 + STR_VERTICAL_TRACK, // 125 + 0, // 126 + 0, // 127 + 0, // 128 + 0, // 129 + 0, // 130 + 0, // 131 + STR_HOLDING_BRAKE_FOR_DROP, // 132 + 0, // 133 + 0, // 134 + 0, // 135 + 0, // 136 + 0, // 137 + 0, // 138 + 0, // 139 + 0, // 140 + 0, // 141 + 0, // 142 + 0, // 143 + 0, // 144 + 0, // 145 + 0, // 146 + 0, // 147 + 0, // 148 + 0, // 149 + 0, // 150 + 0, // 151 + 0, // 152 + 0, // 153 + 0, // 154 + 0, // 155 + 0, // 156 + 0, // 157 + 0, // 158 + 0, // 159 + 0, // 160 + 0, // 161 + 0, // 162 + 0, // 163 + 0, // 164 + 0, // 165 + 0, // 166 + 0, // 167 + 0, // 168 + 0, // 169 + 0, // 170 + 0, // 171 + STR_REVERSER_TURNTABLE, // 172 + STR_SPINNING_TUNNEL, // 173 + STR_BARREL_ROLL_LEFT, // 174 + STR_BARREL_ROLL_RIGHT, // 175 + STR_BARREL_ROLL_LEFT, // 176 + STR_BARREL_ROLL_RIGHT, // 177 + 0, // 178 + 0, // 179 + 0, // 180 + 0, // 181 + STR_LAUNCHED_LIFT_HILL, // 182 + STR_LARGE_HALF_LOOP_LEFT, // 183 + STR_LARGE_HALF_LOOP_RIGHT, // 184 + STR_LARGE_HALF_LOOP_LEFT, // 185 + STR_LARGE_HALF_LOOP_RIGHT, // 186 + STR_IN_LINE_TWIST_LEFT, // 187 + STR_IN_LINE_TWIST_RIGHT, // 188 + STR_IN_LINE_TWIST_LEFT, // 189 + STR_IN_LINE_TWIST_RIGHT, // 190 + STR_HALF_LOOP, // 191 + STR_HALF_LOOP, // 192 + STR_HALF_CORKSCREW_LEFT, // 193 + STR_HALF_CORKSCREW_RIGHT, // 194 + STR_HALF_CORKSCREW_LEFT, // 195 + STR_HALF_CORKSCREW_RIGHT, // 196 + STR_UPPER_TRANSFER, // 197 + STR_LOWER_TRANSFER, // 198 + STR_HEARTLINE_ROLL_LEFT, // 199 + STR_HEARTLINE_ROLL_RIGHT, // 200 + STR_GOLF_HOLE_A, // 201 + STR_GOLF_HOLE_B, // 202 + STR_GOLF_HOLE_C, // 203 + STR_GOLF_HOLE_D, // 204 + STR_GOLF_HOLE_E, // 205 + STR_QUARTER_LOOP, // 206 + STR_QUARTER_LOOP, // 207 + STR_QUARTER_LOOP, // 208 + STR_CURVED_LIFT_HILL_LEFT, // 209 + STR_CURVED_LIFT_HILL_RIGHT, // 210 + STR_REVERSER_LEFT, // 211 + STR_REVERSER_RIGHT, // 212 + STR_TOP_SECTION, // 213 + STR_VERTICAL_TRACK, // 214 + STR_SLOPE_TO_LEVEL, // 215 + STR_BLOCK_BRAKES, // 216 + 0, // 217 + 0, // 218 + 0, // 219 + 0, // 220 + 0, // 221 + 0, // 222 + 0, // 223 + 0, // 224 + 0, // 225 + 0, // 226 + 0, // 227 + 0, // 228 + 0, // 229 + 0, // 230 + 0, // 231 + 0, // 232 + 0, // 233 + 0, // 234 + 0, // 235 + 0, // 236 + 0, // 237 + 0, // 238 + 0, // 239 + 0, // 240 + 0, // 241 + 0, // 242 + 0, // 243 + 0, // 244 + 0, // 245 + 0, // 246 + 0, // 247 + 0, // 248 + 0, // 249 + 0, // 250 + 0, // 251 + 0, // 252 + STR_QUARTER_LOOP, // 253 + STR_QUARTER_LOOP, // 254 + STR_QUARTER_LOOP // 255 +}; + +#pragma endregion + +static void window_ride_construction_next_section(rct_window *w); +static void window_ride_construction_previous_section(rct_window *w); +static void window_ride_construction_construct(rct_window *w); +static void window_ride_construction_mouseup_demolish(rct_window* w); +static void window_ride_construction_rotate(rct_window *w); +static void window_ride_construction_entrance_click(rct_window *w); +static void window_ride_construction_exit_click(rct_window *w); + +static void window_ride_construction_draw_track_piece( + rct_window *w, rct_drawpixelinfo *dpi, + int rideIndex, int trackType, int trackRotation, int unknown, + int width, int height +); +static void window_ride_construction_update_enabled_track_pieces(); +void sub_6C94D8(); +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation); +static void sub_6CBCE2( + int rideIndex, int trackType, int trackDirection, int edx, + int originX, int originY, int originZ +); +static void window_ride_construction_update_map_selection(); +static void window_ride_construction_update_possible_ride_configurations(); +static void window_ride_construction_update_widgets(rct_window *w); +static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y); +money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z); +static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget); +static void ride_selected_track_set_seat_rotation(int seatRotation); +static void loc_6C7502(int al); +static void loc_6C76E9(); + +static void ride_construction_toolupdate_construct(int screenX, int screenY); +static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); +static void ride_construction_tooldown_construct(int screenX, int screenY); +static void ride_construction_tooldown_entrance_exit(int screenX, int screenY); + +uint8 *_currentPossibleRideConfigurations = (uint8*)0x00F4407C; + +static bool is_track_enabled(int trackFlagIndex) +{ + return _enabledRidePieces & (1ULL << trackFlagIndex); +} + +static int ride_get_alternative_type(rct_ride *ride) +{ + return _currentTrackCovered & 2 ? + RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : + ride->type;; +} + /** * * rct2: 0x006CB481 */ -rct_window *window_construction_open() +rct_window *window_ride_construction_open() { - int ride_id = RCT2_GLOBAL(0xF440A7, uint8); - sub_6b2fa9(ride_id); + int rideIndex = _currentRideIndex; + sub_6B2FA9(rideIndex); rct_window *w; - rct_ride* ride = GET_RIDE(ride_id); - if (ride->type == RIDE_TYPE_MAZE){ - w = window_create(0, 29, 166, 200, (uint32*)window_construction_maze_events, WC_RIDE_CONSTRUCTION, WF_9); + rct_ride* ride = GET_RIDE(rideIndex); - w->widgets = (rct_widget*)0x9D7D04; - w->enabled_widgets = 0x6F0001C4; + if (ride->type == RIDE_TYPE_MAZE) + return window_maze_construction_open(); - window_init_scroll_widgets(w); + w = window_create(0, 29, 166, 394, (uint32*)window_ride_construction_events, WC_RIDE_CONSTRUCTION, WF_9); - colour_scheme_update(w); - - w->number = ride_id; - - window_push_others_right(w); - show_gridlines(); - return w; - } - - w = window_create(0, 29, 166, 394, (uint32*)window_construction_events, WC_RIDE_CONSTRUCTION, WF_9); - - w->widgets = (rct_widget*)0x9D7A90; + w->widgets = window_ride_construction_widgets; w->enabled_widgets = 0x67EFFFFFC4; window_init_scroll_widgets(w); @@ -159,48 +518,49 @@ rct_window *window_construction_open() w->colours[1] = 24; w->colours[2] = 24; - w->number = ride_id; + w->number = rideIndex; window_push_others_right(w); show_gridlines(); - RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED; - RCT2_GLOBAL(0xF440CD, uint8) = 8; - RCT2_GLOBAL(0xF440CE, uint8) = 18; - RCT2_GLOBAL(0xF440CF, uint8) = 4; + _currentTrackPrice = MONEY32_UNDEFINED; + RCT2_GLOBAL(0x00F440CD, uint8) = 8; + RCT2_GLOBAL(0x00F440CE, uint8) = 18; + RCT2_GLOBAL(0x00F440CF, uint8) = 4; - if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER){ - RCT2_GLOBAL(0xF440CE, uint8) = 30; - } + if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER) + RCT2_GLOBAL(0x00F440CE, uint8) = 30; - if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER){ - RCT2_GLOBAL(0xF440CE, uint8) = 30; - } + if (ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) + RCT2_GLOBAL(0x00F440CE, uint8) = 30; - RCT2_GLOBAL(0xF440A0, uint16) = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; - RCT2_GLOBAL(0x00F440B2, uint8) = 0; + _currentTrackCurve = RCT2_ADDRESS(0x0097CC68, uint8)[ride->type * 2] | 0x100; + _currentTrackSlopeEnd = 0; RCT2_GLOBAL(0x00F440B3, uint8) = 0; - RCT2_GLOBAL(0x00F440B4, uint8) = 0; - RCT2_GLOBAL(0x00F440B5, uint8) = 0; + _currentTrackLiftHill = 0; + _currentTrackCovered = 0; if (RCT2_ADDRESS(0x0097D4F2, uint16)[ride->type * 4] & 0x8000) - RCT2_GLOBAL(0x00F440B5, uint8) |= 2; + _currentTrackCovered |= 2; RCT2_GLOBAL(0x00F440B6, uint8) = 0; RCT2_GLOBAL(0x00F440B7, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 0; - RCT2_GLOBAL(0x00F440A6, uint8) = 4; - RCT2_GLOBAL(0x00F440B0, uint8) = 0; - RCT2_GLOBAL(0x00F440B1, uint8) = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_PLACE; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; RCT2_GLOBAL(0x00F44159, uint8) = 0; RCT2_GLOBAL(0x00F4415C, uint8) = 0; colour_scheme_update(w); return w; } -/* rct2: 0x006C845D */ -void window_construction_close() +/** + * + * rct2: 0x006C845D + */ +static void window_ride_construction_close() { rct_window *w; rct_xy_element mapElement; @@ -219,241 +579,2970 @@ void window_construction_close() hide_gridlines(); - uint8 rideIndex = RCT2_GLOBAL(0x00F440A7, uint8); - if (!sub_6CAF80(rideIndex, &mapElement)) { + uint8 rideIndex = _currentRideIndex; + if (sub_6CAF80(rideIndex, &mapElement)) { + window_ride_main_open(rideIndex); + } else { int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_7, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; - return; } - - window_ride_main_open(rideIndex); } - -void window_construction_maze_close(){ - rct_window *w; - - window_get_register(w); - - sub_6C9627(); - viewport_set_visibility(0); - - map_invalidate_map_selection_tiles(); - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 1); - - // In order to cancel the yellow arrow correctly the - // selection tool should be cancelled. - tool_cancel(); - - hide_gridlines(); - - uint8 ride_id = RCT2_GLOBAL(0xF440A7, uint8); - - rct_ride* ride = GET_RIDE(ride_id); - - if (ride->overall_view == 0xFFFF){ - int eax = RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8); - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = 0; - game_do_command(0, 9, 0, ride_id, GAME_COMMAND_7, 0, 0); - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; - return; - } - - window_ride_main_open(ride_id); -} - -void window_construction_mouseup_demolish(rct_window* w); - -/* rct2: 0x006C6E14 */ -void window_construction_mouseup(){ +/** + * + * rct2: 0x006C6E14 + */ +static void window_ride_construction_mouseup() +{ short widgetIndex; rct_window *w; window_widget_get_registers(w, widgetIndex); - RCT2_CALLPROC_X(0x6C6A77, 0, 0, 0, 0, 0, 0, 0); - + window_ride_construction_update_enabled_track_pieces(); switch (widgetIndex){ case WIDX_CLOSE: window_close(w); break; - case 27: - RCT2_CALLPROC_X(0x6C9296, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_NEXT_SECTION: + ride_select_next_section(); break; - case 26: - RCT2_CALLPROC_X(0x6C93B8, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_PREVIOUS_SECTION: + ride_select_previous_section(); break; - case 23: - RCT2_CALLPROC_X(0x6C9F72, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_CONSTRUCT: + window_ride_construction_construct(w); break; case WIDX_DEMOLISH: - window_construction_mouseup_demolish(w); + window_ride_construction_mouseup_demolish(w); break; - case 32: - RCT2_CALLPROC_X(0x6C78AA, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_ROTATE: + window_ride_construction_rotate(w); break; - case 29: - RCT2_CALLPROC_X(0x6C7802, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_ENTRANCE: + window_ride_construction_entrance_click(w); break; - case 30: - RCT2_CALLPROC_X(0x6C7866, 0, 0, 0, widgetIndex, (int)w, 0, 0); + case WIDX_EXIT: + window_ride_construction_exit_click(w); break; } } -/* rct2: 0x006C9BA5 */ -void window_construction_mouseup_demolish(rct_window* w){ - RCT2_CALLPROC_X(0x6C9BA5, 0, 0, 0, 0, (int)w, 0, 0); - return; +/** + * + * rct2: 0x006C7934 + */ +static void window_ride_construction_resize() +{ + rct_window *w; - RCT2_GLOBAL(0xF44070, uint32) = MONEY32_UNDEFINED; + window_get_register(w); + + window_ride_construction_update_enabled_track_pieces(); + w->enabled_widgets &= ~(1 << WIDX_CONSTRUCT); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) { + w->enabled_widgets |= (1 << WIDX_CONSTRUCT); + } + + rct_ride *ride = GET_RIDE(_currentRideIndex); + int rideType = ride_get_alternative_type(ride); + + uint64 disabledWidgets = 0; + + if (_currentTrackCurve >= 256) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + } + + // Disable large curves if the start or end of the track is sloped. + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (is_track_enabled(TRACK_SLOPE_CURVE) && is_track_enabled(TRACK_CURVE_VERY_SMALL)) { + // Disable small curves if the start or end of the track is sloped. + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + if (!is_track_enabled(TRACK_SLOPE_CURVE)) { + if (is_track_enabled(TRACK_CURVE_VERTICAL)) { + // Disable all curves only on vertical track + if (_previousTrackSlopeEnd != TRACK_SLOPE_UP_90 || _currentTrackSlopeEnd != TRACK_SLOPE_UP_90) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_90) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + } else { + // Disable all curves on sloped track + if (_previousTrackSlopeEnd != TRACK_SLOPE_NONE || _currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + } + } + if (!is_track_enabled(TRACK_FLAT_ROLL_BANKING)) { + // Disable banking + disabledWidgets |= + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + } + if (!is_track_enabled(TRACK_SLOPE) && !is_track_enabled(TRACK_SLOPE_STEEP)) { + if (rideType != RIDE_TYPE_REVERSE_FREEFALL_COASTER && rideType != RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + // Disable all slopes + disabledWidgets |= + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) { + disabledWidgets |= + (1ULL << WIDX_CONSTRUCT) | + (1ULL << WIDX_DEMOLISH) | + (1ULL << WIDX_PREVIOUS_SECTION) | + (1ULL << WIDX_NEXT_SECTION); + } + switch (_currentTrackCurve) { + case TRACK_CURVE_LEFT_VERY_SMALL: + case TRACK_CURVE_LEFT_SMALL: + case TRACK_CURVE_LEFT: + case TRACK_CURVE_LEFT_LARGE: + disabledWidgets |= (1ULL << WIDX_BANK_RIGHT); + if (_previousTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= (1ULL << WIDX_BANK_LEFT); + } else { + disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT); + } + break; + case TRACK_CURVE_RIGHT_LARGE: + case TRACK_CURVE_RIGHT: + case TRACK_CURVE_RIGHT_SMALL: + case TRACK_CURVE_RIGHT_VERY_SMALL: + disabledWidgets |= (1ULL << WIDX_BANK_LEFT); + if (_previousTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= (1ULL << WIDX_BANK_RIGHT); + } else { + disabledWidgets |= (1ULL << WIDX_BANK_STRAIGHT); + } + break; + } + if (!is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) { + if (_currentTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + } + } + if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) { + switch (_currentTrackSlopeEnd) { + case TRACK_SLOPE_UP_60: + case TRACK_SLOPE_DOWN_60: + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + if (!is_track_enabled(TRACK_SLOPE_CURVE_STEEP)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_SMALL); + } + break; + case TRACK_SLOPE_UP_90: + case TRACK_SLOPE_DOWN_90: + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + if (!is_track_enabled(TRACK_CURVE_VERTICAL)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_SMALL); + } + break; + } + } else { + // Disable all curves + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + + switch (_previousTrackSlopeEnd) { + case TRACK_SLOPE_NONE: + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + break; + case TRACK_SLOPE_DOWN_25: + disabledWidgets |= + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + break; + case TRACK_SLOPE_DOWN_60: + disabledWidgets |= + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + break; + case TRACK_SLOPE_UP_25: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN); + break; + case TRACK_SLOPE_UP_60: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN); + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + break; + case TRACK_SLOPE_DOWN_90: + case TRACK_SLOPE_UP_90: + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP); + break; + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) { + if (!is_track_enabled(TRACK_SLOPE_LONG) && !is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (is_track_enabled(TRACK_SLOPE_VERTICAL)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackPieceDirection < 4) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackPieceDirection < 4) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (_previousTrackBankEnd == TRACK_BANK_LEFT) { + disabledWidgets |= + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE) | + (1ULL << WIDX_BANK_RIGHT); + } + if (_previousTrackBankEnd == TRACK_BANK_RIGHT) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_BANK_LEFT); + } + if (_currentTrackBankEnd != _previousTrackBankEnd) { + disabledWidgets |= + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE); + } + if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE) { + if (is_track_enabled(TRACK_SLOPE_ROLL_BANKING)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_NONE) { + if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } else { + if (_currentTrackSlopeEnd != _previousTrackSlopeEnd) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } else { + if (_currentTrackSlopeEnd != TRACK_SLOPE_UP_25 && _currentTrackSlopeEnd != TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } + } + } else { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + } + } + if (_currentTrackBankEnd != TRACK_BANK_NONE || _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackCurve != TRACK_CURVE_NONE) { + if (!is_track_enabled(TRACK_LIFT_HILL_CURVE)) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_60) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + disabledWidgets |= (1ULL << WIDX_CHAIN_LIFT); + } + if (_previousTrackBankEnd == TRACK_BANK_UPSIDE_DOWN) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (_currentTrackCurve != TRACK_CURVE_NONE) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_BACK || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP); + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL || _rideConstructionState != RIDE_CONSTRUCTION_STATE_FRONT || !is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= (1ULL << WIDX_LEVEL); + } + } + } else if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_UP_STEEP); + if (_currentTrackBankEnd == TRACK_BANK_LEFT) { + disabledWidgets |= + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT); + } + if (_currentTrackBankEnd == TRACK_BANK_RIGHT) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT); + } + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + disabledWidgets |= + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_RIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_SLOPE_UP); + disabledWidgets &= ~(1ULL << WIDX_LEVEL); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_25) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_25) { + disabledWidgets |= + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN); + } + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL) { + disabledWidgets &= ~(1ULL << WIDX_LEFT_CURVE_SMALL); + } + if (_currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + disabledWidgets &= ~(1ULL << WIDX_RIGHT_CURVE_SMALL); + } + } + } + if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_UP_60) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP); + } + if (_currentTrackCurve != TRACK_CURVE_NONE && _currentTrackSlopeEnd == TRACK_SLOPE_DOWN_60) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN); + } + if (_currentTrackLiftHill & 1) { + if (_currentTrackSlopeEnd != TRACK_SLOPE_NONE && !is_track_enabled(TRACK_LIFT_HILL_CURVE)) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (!is_track_enabled(TRACK_LIFT_HILL_STEEP)) { + if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + } + } + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 && _currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_LEVEL); + } + if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 && _currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP_STEEP); + } + if (_currentTrackSlopeEnd == TRACK_SLOPE_UP_90 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= (1ULL << WIDX_SLOPE_UP_STEEP); + } + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + disabledWidgets |= + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE); + } + } else if (_currentTrackSlopeEnd == TRACK_SLOPE_DOWN_90 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) { + if (_currentTrackCurve != TRACK_CURVE_NONE) { + disabledWidgets |= (1ULL << WIDX_SLOPE_DOWN_STEEP); + } + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + disabledWidgets |= + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE); + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_SLOPE_NONE) { + if (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT) { + if (_currentTrackSlopeEnd == _previousTrackSlopeEnd) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + } + } else if ( + ( + is_track_enabled(TRACK_HELIX_SMALL) || + (_currentTrackCurve != TRACK_CURVE_LEFT_SMALL && _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL && !is_track_enabled(TRACK_HELIX_LARGE)) + ) && + ( + _currentTrackCurve == TRACK_CURVE_LEFT || + _currentTrackCurve == TRACK_CURVE_RIGHT || + _currentTrackCurve == TRACK_CURVE_LEFT_SMALL || + _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL + ) && + (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd != TRACK_BANK_NONE) + ) { + if (_previousTrackSlopeEnd == _currentTrackSlopeEnd) { + // Enable helix + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN_STEEP); + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP_STEEP); + } + } + if (is_track_enabled(TRACK_SLOPE_CURVE_BANKED)) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_UP); + } + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (_currentTrackCurve == TRACK_CURVE_LEFT_SMALL || _currentTrackCurve == TRACK_CURVE_RIGHT_SMALL) { + if (_currentTrackSlopeEnd == TRACK_SLOPE_NONE && _previousTrackBankEnd != TRACK_BANK_NONE) { + disabledWidgets &= ~(1ULL << WIDX_SLOPE_DOWN); + } + } + } + } + if (_currentTrackPieceDirection >= 4) { + disabledWidgets |= + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL); + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + disabledWidgets |= (1ULL << WIDX_NEXT_SECTION); + if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { + disabledWidgets |= (1ULL << WIDX_CONSTRUCT); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + disabledWidgets |= (1ULL << WIDX_PREVIOUS_SECTION); + if (sub_6CA2DF(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { + disabledWidgets |= (1ULL << WIDX_CONSTRUCT); + } + } + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); + } + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + disabledWidgets |= + (1ULL << WIDX_DIRECTION_GROUPBOX) | + (1ULL << WIDX_SLOPE_GROUPBOX) | + (1ULL << WIDX_BANKING_GROUPBOX) | + (1ULL << WIDX_LEFT_CURVE_VERY_SMALL) | + (1ULL << WIDX_LEFT_CURVE_SMALL) | + (1ULL << WIDX_LEFT_CURVE) | + (1ULL << WIDX_STRAIGHT) | + (1ULL << WIDX_RIGHT_CURVE) | + (1ULL << WIDX_RIGHT_CURVE_SMALL) | + (1ULL << WIDX_RIGHT_CURVE_VERY_SMALL) | + (1ULL << WIDX_SPECIAL_TRACK_DROPDOWN) | + (1ULL << WIDX_SLOPE_DOWN_STEEP) | + (1ULL << WIDX_SLOPE_DOWN) | + (1ULL << WIDX_LEVEL) | + (1ULL << WIDX_SLOPE_UP) | + (1ULL << WIDX_SLOPE_UP_STEEP) | + (1ULL << WIDX_CHAIN_LIFT) | + (1ULL << WIDX_BANK_LEFT) | + (1ULL << WIDX_BANK_STRAIGHT) | + (1ULL << WIDX_BANK_RIGHT) | + (1ULL << WIDX_LEFT_CURVE_LARGE) | + (1ULL << WIDX_RIGHT_CURVE_LARGE); + } + if (RCT2_GLOBAL(0x00F440D3, uint8) != 0) { + disabledWidgets &= ~(1ULL << WIDX_BANKING_GROUPBOX); + disabledWidgets &= ~(1ULL << WIDX_BANK_LEFT); + disabledWidgets &= ~(1ULL << WIDX_BANK_STRAIGHT); + disabledWidgets &= ~(1ULL << WIDX_BANK_RIGHT); + } + + // Set and invalidate the changed widgets + uint64 currentDisabledWidgets = w->disabled_widgets; + if (currentDisabledWidgets == disabledWidgets) + return; + + for (int i = 0; i < 64; i++) { + if ((disabledWidgets & (1ULL << i)) != (currentDisabledWidgets & (1ULL << i))) { + widget_invalidate(w, i); + } + } + w->disabled_widgets = disabledWidgets; +} + +/** + * + * rct2: 0x006C6E6A + */ +static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + int rideType; + + window_ride_construction_update_enabled_track_pieces(); + switch (widgetIndex) { + case WIDX_LEFT_CURVE: + sub_6C9627(); + _currentTrackCurve = 1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE: + sub_6C9627(); + _currentTrackCurve = 2; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_SMALL: + sub_6C9627(); + _currentTrackCurve = 3; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_SMALL: + sub_6C9627(); + _currentTrackCurve = 4; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_VERY_SMALL: + sub_6C9627(); + _currentTrackCurve = 5; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_VERY_SMALL: + sub_6C9627(); + _currentTrackCurve = 6; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_LEFT_CURVE_LARGE: + sub_6C9627(); + _currentTrackCurve = 7; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_RIGHT_CURVE_LARGE: + sub_6C9627(); + _currentTrackCurve = 8; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_STRAIGHT: + sub_6C9627(); + if (_currentTrackCurve != 0) + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackCurve = 0; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_SLOPE_DOWN_STEEP: + sub_6C9627(); + rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + if (is_track_enabled(TRACK_HELIX_SMALL)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 349; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 350; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 345; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 346; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 360; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 361; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + if (_currentTrackCurve == 1) { + _currentTrackCurve = 364; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2) { + _currentTrackCurve = 365; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + } + if (w->widgets[WIDX_SLOPE_DOWN_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP) { + loc_6C7502(8); + } else { + loc_6C7502(10); + } + break; + case WIDX_SLOPE_DOWN: + sub_6C9627(); + if (_rideConstructionState == 2 && _currentTrackBankEnd != TRACK_BANK_NONE) { + _currentTrackBankEnd = TRACK_BANK_NONE; + } + loc_6C7502(6); + break; + case WIDX_LEVEL: + sub_6C9627(); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _previousTrackSlopeEnd == 6) { + if (_currentTrackCurve == 3) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + } else if (_currentTrackCurve == 4) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK && _previousTrackSlopeEnd == 2) { + if (_currentTrackCurve == 3) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + } else if (_currentTrackCurve == 4) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + } + } + loc_6C7502(0); + break; + case WIDX_SLOPE_UP: + sub_6C9627(); + if (_rideConstructionState == 1 && _currentTrackBankEnd != TRACK_BANK_NONE) { + _currentTrackBankEnd = TRACK_BANK_NONE; + } + if (ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER || ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT && _currentTrackCurve == 0) { + _currentTrackCurve = 124 | 0x100; + sub_6C84CE(); + } + } else { + loc_6C7502(2); + } + break; + case WIDX_SLOPE_UP_STEEP: + sub_6C9627(); + rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + if (is_track_enabled(TRACK_HELIX_SMALL)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 347; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 348; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 3 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 343; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 4 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 344; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE)) { + if (_currentTrackCurve == 1 && _currentTrackBankEnd == TRACK_BANK_LEFT) { + _currentTrackCurve = 358; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2 && _currentTrackBankEnd == TRACK_BANK_RIGHT) { + _currentTrackCurve = 359; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + if (is_track_enabled(TRACK_HELIX_LARGE_UNBANKED)) { + if (_currentTrackBankEnd == TRACK_BANK_NONE) { + if (_currentTrackCurve == 1) { + _currentTrackCurve = 362; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } else if (_currentTrackCurve == 2) { + _currentTrackCurve = 363; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + } + } + } + if (w->widgets[WIDX_SLOPE_UP_STEEP].tooltip == STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP) { + loc_6C7502(4); + } else { + loc_6C7502(18); + } + break; + case WIDX_CHAIN_LIFT: + sub_6C9627(); + _currentTrackLiftHill ^= 1; + if (_currentTrackLiftHill & 1) { + _currentTrackCovered &= ~1; + } + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_BANK_LEFT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_LEFT; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } + break; + case WIDX_BANK_STRAIGHT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } else { + uint8 *ebp = (uint8*)0x00F440CD; + uint8 bl = 30; + if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { + ebp = (uint8*)0x00F440CE; + bl = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); + } + uint8 bh = *ebp + 2; + if (bh <= bl) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + loc_6C76E9(); + } else { + *ebp = bh; + sub_6C84CE(); + } + } + } + break; + case WIDX_BANK_RIGHT: + sub_6C9627(); + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + _currentTrackBankEnd = TRACK_BANK_RIGHT; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + } else { + uint8 *ebp = (uint8*)0x00F440CD; + if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { + ebp = (uint8*)0x00F440CE; + } + uint8 bh = *ebp - 2; + if (bh >= 2) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + loc_6C76E9(); + } else { + *ebp = bh; + sub_6C84CE(); + } + } + } + break; + case WIDX_SPECIAL_TRACK_DROPDOWN: + window_ride_construction_show_special_track_dropdown(w, widget); + break; + case WIDX_U_TRACK: + sub_6C9627(); + _currentTrackCovered &= ~1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_O_TRACK: + sub_6C9627(); + _currentTrackCovered |= 1; + _currentTrackLiftHill &= ~1; + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); + break; + case WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP: + if (_currentSeatRotationAngle < 15) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + ride_selected_track_set_seat_rotation(_currentSeatRotationAngle + 1); + } else { + _currentSeatRotationAngle++; + sub_6C84CE(); + } + } + break; + case WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN: + if (_currentSeatRotationAngle > 0) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + ride_selected_track_set_seat_rotation(_currentSeatRotationAngle - 1); + } else { + _currentSeatRotationAngle--; + sub_6C84CE(); + } + } + break; + } +} + +/** + * + * rct2: 0x006C78CD + */ +static void window_ride_construction_dropdown() +{ + short dropdownIndex, widgetIndex; + rct_window *w; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + if (widgetIndex != WIDX_SPECIAL_TRACK_DROPDOWN) + return; + if (dropdownIndex == -1) + return; + + sub_6C9627(); + _currentTrackPrice = MONEY32_UNDEFINED; + int trackPiece = _currentPossibleRideConfigurations[dropdownIndex]; + switch (trackPiece) { + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_S_BEND_LEFT: + case TRACK_ELEM_S_BEND_RIGHT: + _currentTrackSlopeEnd = 0; + break; + case TRACK_ELEM_LEFT_VERTICAL_LOOP: + case TRACK_ELEM_RIGHT_VERTICAL_LOOP: + _currentTrackBankEnd = TRACK_BANK_NONE; + _currentTrackLiftHill &= ~1; + break; + } + _currentTrackCurve = trackPiece | 0x100; + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C9F72 + */ +static void window_ride_construction_construct(rct_window *w) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation; + track_begin_end trackBeginEnd; + + _currentTrackPrice = MONEY32_UNDEFINED; + RCT2_GLOBAL(0x00F44074, money32) = MONEY32_UNDEFINED; + sub_6C9627(); + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) { + sub_6C84CE(); + return; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; + RCT2_GLOBAL(0x00F44074, money32) = game_do_command( + x, + (GAME_COMMAND_FLAG_APPLY) | (trackDirection << 8), + y, + rideIndex | (trackType << 8) | (edxRS16 << 16), + GAME_COMMAND_PLACE_TRACK, + z | (seatRotation << 28), + 0 + ); + if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + sub_6C84CE(); + return; + } + + sound_play_panned(SOUND_PLACE_ITEM, 0x8001, x, y, z); + + if (RCT2_GLOBAL(0x00F441D4, uint8) & 2) { + viewport_set_visibility(1); + } + + if ( + (_currentTrackCurve >= 343 && _currentTrackCurve <= 350) || + (_currentTrackCurve >= 358 && _currentTrackCurve <= 365) || + (_currentTrackSlopeEnd != TRACK_SLOPE_NONE) + ) { + viewport_set_visibility(2); + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection ^ 2; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x += TileDirectionDelta[trackDirection].x; + y += TileDirectionDelta[trackDirection].y; + } + + if (sub_6C63D6(x, y, z, trackDirection, &trackBeginEnd)) { + _currentTrackBeginX = trackBeginEnd.begin_x; + _currentTrackBeginY = trackBeginEnd.begin_y; + _currentTrackBeginZ = trackBeginEnd.begin_z; + _currentTrackPieceDirection = trackBeginEnd.begin_direction; + _currentTrackPieceType = trackBeginEnd.begin_element->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_previous_section(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + } else { + RCT2_GLOBAL(0x00F441D2, uint8) = _currentRideIndex; + trackDirection = _currentTrackPieceDirection; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (!(trackDirection & 4)) { + x -= TileDirectionDelta[trackDirection].x; + y -= TileDirectionDelta[trackDirection].y; + } + + int dir2; + rct_map_element *mapElement = sub_6C6096(&x, &y, &z, &trackDirection, &dir2); + if (mapElement != NULL) { + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + _currentTrackPieceType = mapElement->properties.track.type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + ride_select_next_section(); + } else { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + } + + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C9BA5 + */ +static void window_ride_construction_mouseup_demolish(rct_window* w) +{ + int x, y, z, direction, type, slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + rct_map_element *mapElement; + rct_xy_element inputElement, outputElement; + track_begin_end trackBeginEnd; + bool gotoStartPlacementMode; + + _currentTrackPrice = MONEY32_UNDEFINED; sub_6C9627(); - RCT2_GLOBAL(0xF440B8, uint8) = 3; - if (RCT2_GLOBAL(0xF440A6, uint8) == 1){ - //6C9C4F + // Select the track element that is to be deleted + RCT2_GLOBAL(0x00F440B8, uint8) = 3; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (!ride_select_backwards_from_front()) { + sub_6C84CE(); + return; + } + RCT2_GLOBAL(0x00F440B8, uint8) = 1; + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (!ride_select_forwards_from_back()) { + sub_6C84CE(); + return; + } + RCT2_GLOBAL(0x00F440B8, uint8) = 2; } - if (RCT2_GLOBAL(0xF440A6, uint8) != 2){ - //6c9cc4 - int eax = RCT2_GLOBAL(0xF440A8, uint16), - ebx = RCT2_GLOBAL(0xF440AF, uint8) || (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) << 8), - ecx = RCT2_GLOBAL(0xF440AA, uint16), - edx = RCT2_GLOBAL(0xF440AC, uint16); - - sub_6C683D(&eax, &ecx, &edx, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), RCT2_GLOBAL(0xF440AF, uint8) & 0x3FF, 0, 0, 0); + // Invalidate the selected track element or make sure its at origin??? + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction & 3, type, 0, &mapElement, 0)) { + sub_6C84CE(); + return; } - int ride_id = RCT2_GLOBAL(0xF440A7, uint8); - RCT2_GLOBAL(0xF441D2, uint8) = ride_id; - //6c9BFE + // Get the previous track element to go to after the selected track element is deleted + inputElement.x = x; + inputElement.y = y; + inputElement.element = mapElement; + if (track_get_previous(x, y, mapElement, &trackBeginEnd)) { + x = trackBeginEnd.begin_x; + y = trackBeginEnd.begin_y; + z = trackBeginEnd.begin_z; + direction = trackBeginEnd.begin_direction; + type = trackBeginEnd.begin_element->properties.track.type; + gotoStartPlacementMode = false; + } else if (track_get_next(&inputElement, &outputElement, &z, &direction)) { + x = outputElement.x; + y = outputElement.y; + direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK; + type = outputElement.element->properties.track.type; + gotoStartPlacementMode = false; + } else { + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + + if (sub_6C683D(&x, &y, &z, direction, type, 0, &mapElement, 0)) { + sub_6C84CE(); + return; + } + + rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); + z = (mapElement->base_height * 8) - trackBlock->z; + gotoStartPlacementMode = true; + } + + money32 cost = ride_remove_track_piece( + _currentTrackBeginX, + _currentTrackBeginY, + _currentTrackBeginZ, + _currentTrackPieceDirection, + _currentTrackPieceType + ); + if (cost == MONEY32_UNDEFINED) { + sub_6C84CE(); + return; + } + + if (gotoStartPlacementMode) { + z &= 0xFFF0; + _currentTrackBeginZ = z; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackSlopeEnd = 0; + _rideConstructionArrowPulseTime = 0; + direction = _currentTrackPieceDirection; + slope = _currentTrackCurve; + slopeEnd = _previousTrackSlopeEnd; + b2 = _currentTrackSlopeEnd; + bankEnd = _previousTrackBankEnd; + bankStart = _currentTrackBankEnd; + b5 = _currentTrackCovered; + b4 = _currentTrackLiftHill; + sub_6C9800(); + sub_6C84CE(); + if (!sub_6CAF80(_currentRideIndex, &outputElement)) { + sub_6CC3FB(_currentRideIndex); + _currentTrackPieceDirection = _currentTrackPieceDirection; + if (slope & 0x100) { + _currentTrackCurve = slope; + _previousTrackSlopeEnd = slopeEnd; + _currentTrackSlopeEnd = b2; + _previousTrackBankEnd = bankEnd; + _currentTrackBankEnd = bankStart; + _currentTrackCovered = b5; + _currentTrackLiftHill = b4; + sub_6C84CE(); + } + } + } else { + if (RCT2_GLOBAL(0x00F440B8, uint8) == 3 || RCT2_GLOBAL(0x00F440B8, uint8) == 1) { + if (type == TRACK_ELEM_MIDDLE_STATION || type == TRACK_ELEM_BEGIN_STATION) { + type = TRACK_ELEM_END_STATION; + } + } + if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + if (type == TRACK_ELEM_MIDDLE_STATION) { + type = TRACK_ELEM_BEGIN_STATION; + } + } + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackPieceDirection = direction; + _currentTrackPieceType = type; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + if (RCT2_GLOBAL(0x00F440B8, uint8) == 1) { + ride_select_next_section(); + } else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + ride_select_previous_section(); + } + sub_6C84CE(); + } } -void window_construction_maze_invalidate() +/** + * + * rct2: 0x006C78AA + */ +static void window_ride_construction_rotate(rct_window *w) { - int ride_idx = RCT2_GLOBAL(0x00F440A7, uint8); - RCT2_GLOBAL(0x13CE958, uint32_t) = RCT2_GLOBAL(0x1362944 + ride_idx * 0x260, uint32_t); - RCT2_GLOBAL(0x13CE956, uint16_t) = RCT2_GLOBAL(0x1362942 + ride_idx * 0x260, uint16_t); + _currentTrackPieceDirection = (_currentTrackPieceDirection + 1) & 3; + sub_6C9627(); + _currentTrackPrice = MONEY32_UNDEFINED; + sub_6C84CE(); } -//0x6C6B86 -void window_construction_paint() +/** + * + * rct2: 0x006C7802 + */ +static void window_ride_construction_entrance_click(rct_window *w) +{ + if (tool_set(w, WIDX_ENTRANCE, 12)) { + if (!sub_6CAF80(_currentRideIndex, NULL)) { + sub_6CC3FB(_currentRideIndex); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) = 0; + RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF; + RCT2_GLOBAL(0x00F44193, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; + sub_6C9627(); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; + } + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006C7866 + */ +static void window_ride_construction_exit_click(rct_window *w) +{ + if (tool_set(w, WIDX_EXIT, 12)) { + if (!sub_6CAF80(_currentRideIndex, NULL)) { + sub_6CC3FB(_currentRideIndex); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) = 1; + RCT2_GLOBAL(0x00F44192, uint8) = w->number & 0xFF; + RCT2_GLOBAL(0x00F44193, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint8) |= INPUT_FLAG_6; + sub_6C9627(); + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + RCT2_GLOBAL(0x00F440CC, uint8) = _rideConstructionState; + _rideConstructionState = RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT; + } + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006C8374 + */ +static void window_ride_construction_update(rct_window *w) +{ + switch (_currentTrackCurve) { + case 429: + case 376: + case 369: + case 368: + widget_invalidate(w, WIDX_CONSTRUCT); + break; + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { + if (!widget_is_active_tool(w, WIDX_CONSTRUCT)) { + window_close(w); + return; + } + } + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT) { + if (!widget_is_active_tool(w, WIDX_ENTRANCE) && !widget_is_active_tool(w, WIDX_EXIT)) { + _rideConstructionState = RCT2_GLOBAL(0x00F440CC, uint8); + sub_6C84CE(); + } + } + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + case RIDE_CONSTRUCTION_STATE_BACK: + case RIDE_CONSTRUCTION_STATE_SELECTED: + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) && + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass) == WC_RIDE_CONSTRUCTION + ) { + tool_cancel(); + } + break; + } + + sub_6C94D8(); +} + +/** + * + * rct2: 0x006CC538 + */ +static bool ride_get_place_position_from_screen_position(int screenX, int screenY, int *outX, int *outY) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = screenX; + ebx = screenY; + RCT2_CALLFUNC_X(0x006CC538, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + + if (outX != NULL) *outX = eax & 0xFFFF; + if (outY != NULL) *outY = ebx & 0xFFFF; + + return (eax & 0xFFFF) != 0x8000; +} + +/** + * + * rct2: 0x006C8229 + */ +static void window_ride_construction_toolupdate() { rct_window *w; - rct_drawpixelinfo *dpi; + short screenX, screenY, widgetIndex; + + window_tool_get_registers(w, widgetIndex, screenX, screenY); + + switch (widgetIndex) { + case WIDX_CONSTRUCT: + ride_construction_toolupdate_construct(screenX, screenY); + break; + case WIDX_ENTRANCE: + case WIDX_EXIT: + ride_construction_toolupdate_entrance_exit(screenX, screenY); + break; + } +} + +/** + * + * rct2: 0x006C8248 + */ +static void window_ride_construction_tooldown() +{ + rct_window *w; + short screenX, screenY, widgetIndex; + + window_tool_get_registers(w, widgetIndex, screenX, screenY); + + switch (widgetIndex) { + case WIDX_CONSTRUCT: + ride_construction_tooldown_construct(screenX, screenY); + break; + case WIDX_ENTRANCE: + case WIDX_EXIT: + ride_construction_tooldown_entrance_exit(screenX, screenY); + break; + } +} + +/** + * + * rct2: 0x006C6AD5 + */ +static void window_ride_construction_invalidate() +{ + rct_window *w; + rct_ride *ride; + rct_string_id stringId; + + window_get_register(w); + + ride = GET_RIDE(_currentRideIndex); + + stringId = STR_RIDE_CONSTRUCTION_SPECIAL; + if (_currentTrackCurve >= 256) { + stringId = RCT2_ADDRESS(0x00999492, rct_string_id)[_currentTrackCurve - 256]; + if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE) + stringId = STR_LOG_BUMPS; + } + RCT2_GLOBAL(0x013CE952, uint16) = stringId; + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 1) + RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CD, uint8) * 9) >> 2) & 0xFFFF; + + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].image = + STR_RIDE_CONSTRUCTION_SEAT_ROTATION_ANGLE_NEG_180 + RCT2_GLOBAL(0x00F440CF, uint8); + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 2) + RCT2_GLOBAL(0x013CE952 + 2, uint16) = ((RCT2_GLOBAL(0x00F440CE, uint8) * 9) >> 2) & 0xFFFF; + + // Set window title arguments + RCT2_GLOBAL(0x013CE952 + 4, uint16) = ride->name; + RCT2_GLOBAL(0x013CE952 + 6, uint32) = ride->name_arguments; +} + +/** + * + * rct2: 0x006C6B86 + */ +static void window_ride_construction_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi, *clipdpi; + rct_widget *widget; + int x, y, width, height; + window_paint_get_registers(w, dpi); + window_draw_widgets(w, dpi); - if (RCT2_GLOBAL(0x9D7C00, uint8_t) == 0) return; - uint32_t eax = 0, esi = (uint32_t)w, ebp = 0;//nothing - uint32_t ebx = 0, ecx = 0, edx = 0, edi = (uint32_t)dpi;//returns - if (RCT2_CALLFUNC_X(0x6CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) return; - RCT2_GLOBAL(0xF44133, uint8_t) = edx & 0xFF; - RCT2_GLOBAL(0xF44134, uint8_t) = (ebx >> 8) & 0xFF; - RCT2_GLOBAL(0xF44135, uint8_t) = (edx >> 8) & 0xFF; - edx >>= 16; - RCT2_GLOBAL(0xF44136, int16_t) = edx; - rct_ride* ride = GET_RIDE(RCT2_GLOBAL(0xF44133, uint8)); - RCT2_GLOBAL(0xF44064, uint32_t) = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32_t); - // 0x009D7C04 is a widget address remember to change when widget implemented - short width = RCT2_GLOBAL(0x9D7C04, int16_t) - RCT2_GLOBAL(0x9D7C02, int16_t) - 1; - short height = RCT2_GLOBAL(0x9D7C08, int16_t) - RCT2_GLOBAL(0x9D7C06, int16_t) - 1; - rct_drawpixelinfo* clip_dpi = clip_drawpixelinfo( - dpi, - // 0x009D7C02 is a widget address remember to change when widget implemented - w->x + RCT2_GLOBAL(0x9D7C02, int16_t) + 1, - width, - w->y + RCT2_GLOBAL(0x9D7C06, int16_t) + 1, - height); - if (clip_dpi != NULL) - { - rct_preview_track *trackBlock; - ecx = RCT2_GLOBAL(0xF44135, uint8_t); - if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) trackBlock = RCT2_ADDRESS(0x994A38, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994A38 + ecx * 4, rct_preview_track*); - else trackBlock = RCT2_ADDRESS(0x994638, rct_preview_track*)[ecx];//RCT2_GLOBAL(0x994638 + ecx * 4, rct_preview_track*); - while ((trackBlock + 1)->var_00 != 0xFF) trackBlock++; - short x = trackBlock->x; - short z = trackBlock->z; - short y = trackBlock->y; - if (trackBlock->var_09 & 2) x = y = 0; - short tmp; - switch (RCT2_GLOBAL(0xF44134, uint8_t) & 3) - { + + widget = &window_ride_construction_widgets[WIDX_CONSTRUCT]; + if (widget->type == WWT_EMPTY) + return; + + int trackType, trackDirection, rideIndex, edxRS16; + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL)) + return; + + // Draw track piece + x = w->x + widget->left + 1; + y = w->y + widget->top + 1; + width = widget->right - widget->left - 1; + height = widget->bottom - widget->top - 1; + clipdpi = clip_drawpixelinfo(dpi, x, width, y, height); + if (clipdpi != NULL) { + window_ride_construction_draw_track_piece(w, clipdpi, rideIndex, trackType, trackDirection, edxRS16, width, height); + rct2_free(clipdpi); + } + + // Draw cost + x = w->x + (widget->left + widget->right) / 2; + y = w->y + widget->bottom - 23; + if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_PLACE) + gfx_draw_string_centred(dpi, 1407, x, y, 0, w); + + y += 11; + if ( + _currentTrackPrice != MONEY32_UNDEFINED && + !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + ) { + gfx_draw_string_centred(dpi, 1408, x, y, 0, (void*)&_currentTrackPrice); + } +} + +/** + * + * rct2: 0x0068B2B7 + */ +static void sub_68B2B7(int x, int y) +{ + RCT2_CALLPROC_X(0x0068B2B7, x, 0, y, 0, 0, 0, 0); +} + +static void window_ride_construction_draw_track_piece( + rct_window *w, rct_drawpixelinfo *dpi, + int rideIndex, int trackType, int trackDirection, int unknown, + int width, int height +) { + rct_preview_track *trackBlock; + rct_ride *ride; + + ride = GET_RIDE(rideIndex); + + trackBlock = get_track_def_from_ride(ride, trackType); + while ((trackBlock + 1)->var_00 != 0xFF) + trackBlock++; + + short x = trackBlock->x; + short z = trackBlock->z; + short y = trackBlock->y; + if (trackBlock->var_09 & 2) { + x = 0; + y = 0; + } + + short tmp; + switch (trackDirection & 3) { + case 1: + tmp = x; + x = y; + y = -tmp; + break; + case 2: + x = -x; + y = -y; + break; + case 3: + tmp = x; + x = -y; + y = tmp; + break; + case 0: + break; + } + //this is actually case 0, but the other cases all jump to it + x = 4112 + (x / 2); + y = 4112 + (y / 2); + z = 1024 + z; + + short bx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x009984A2 + trackType * 8, sint8) : + RCT2_GLOBAL(0x00997CA2 + trackType * 8, sint8); + + z -= bx; + int start_x = x; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { + case 0: + x = y - x; + y = (y + start_x) / 2 - z; + break; + case 1: + x = -x - y; + y = (y - start_x) / 2 - z; + break; + case 2: + x -= y; + y = (-y - start_x) / 2 - z; + break; + case 3: + x += y; + y = (-y + start_x) / 2 - z; + break; + } + dpi->x += x - width / 2; + dpi->y += y - height / 2 - 16; + RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*) = dpi; + uint32_t d = unknown << 16; + d |= rideIndex; + d |= trackType << 8; + + sub_6CBCE2(rideIndex, trackType, trackDirection, d, 4096, 4096, 1024); +} + +static rct_map_element _tempTrackMapElement; +static rct_map_element _tempSideTrackMapElement = { 0x80, 0x8F, 128, 128, 0, 0, 0, 0 }; +static rct_map_element *_backupMapElementArrays[5]; + +/** + * + * rct2: 0x006CBCE2 + * bh: trackDirection + * dl: rideIndex + * dh: trackType + */ +static void sub_6CBCE2( + int rideIndex, int trackType, int trackDirection, int edx, + int originX, int originY, int originZ +) { + rct_ride *ride; + rct_preview_track *trackBlock; + int preserve_word_141E9E4; + int x, y, baseZ, clearanceZ, offsetX, offsetY; + uint64 preserve_map_size_vars; + + preserve_word_141E9E4 = RCT2_GLOBAL(0x0141E9E4, uint16); + RCT2_GLOBAL(0x0141E9E4, uint16) = 0; + trackDirection &= 3; + + RCT2_GLOBAL(0x00EE7880, uint32) = 0x00F1A4CC; + sub_0x68615B(0x00EE788C); + + ride = GET_RIDE(rideIndex); + + preserve_map_size_vars = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16) = 255 * 32; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_MINUS_2, uint16) = (255 * 32) + 286; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, uint16) = 256; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = (256 * 32) - 1; + + trackBlock = get_track_def_from_ride(ride, trackType); + while (trackBlock->var_00 != 255) { + int bl = trackBlock->var_08; + int bh; + switch (trackDirection) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; case 1: - tmp = x; - x = y; - y = -tmp; + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + bl = rol8(bl, 1); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xEE; + bh &= 0x11; + bl |= bh; break; case 2: - x = -x; - y = -y; + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + bl = rol8(bl, 2); + bh = bl; + bh = ror8(bh, 4); + bl &= 0xCC; + bh &= 0x33; + bl |= bh; break; case 3: - tmp = x; - x = -y; - y = tmp; - break; - case 0: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + bl = rol8(bl, 3); + bh |= bl; + bh = ror8(bh, 4); + bl &= 0x88; + bh &= 0x77; + bl |= bh; break; } - //this is actually case 0, but the other cases all jump to it - x /= 2; - y /= 2; - x += 4112; - y += 4112; - z += 1024; - ebx = RCT2_GLOBAL(0xF44135, uint8_t); - short bx; - if (RCT2_GLOBAL(0xF44064, uint32_t) & 0x80000) bx = RCT2_GLOBAL(0x9984A2 + ebx * 8, sint8); - else bx = RCT2_GLOBAL(0x997CA2 + ebx * 8, sint8); + x = originX + offsetX; + y = originY + offsetY; + baseZ = (originZ + trackBlock->z) >> 3; + clearanceZ = ((trackBlock->var_07 + RCT2_GLOBAL(0x0097D219 + (ride->type * 8), uint8)) >> 3) + baseZ + 4; + + int tileX = x >> 5; + int tileY = y >> 5; + + // Replace map elements with temporary ones containing track + _backupMapElementArrays[0] = map_get_first_element_at(tileX + 0, tileY + 0); + _backupMapElementArrays[1] = map_get_first_element_at(tileX + 1, tileY + 0); + _backupMapElementArrays[2] = map_get_first_element_at(tileX - 1, tileY + 0); + _backupMapElementArrays[3] = map_get_first_element_at(tileX + 0, tileY + 1); + _backupMapElementArrays[4] = map_get_first_element_at(tileX + 0, tileY - 1); + map_set_tile_elements(tileX + 0, tileY + 0, &_tempTrackMapElement); + map_set_tile_elements(tileX + 1, tileY + 0, &_tempSideTrackMapElement); + map_set_tile_elements(tileX - 1, tileY + 0, &_tempSideTrackMapElement); + map_set_tile_elements(tileX + 0, tileY + 1, &_tempSideTrackMapElement); + map_set_tile_elements(tileX + 0, tileY - 1, &_tempSideTrackMapElement); + + // Set the temporary track element + _tempTrackMapElement.type = trackDirection | MAP_ELEMENT_TYPE_TRACK | (edx & 0x10000 ? 0x80 : 0); + _tempTrackMapElement.flags = (bl & 0x0F) | MAP_ELEMENT_FLAG_LAST_TILE; + _tempTrackMapElement.base_height = baseZ; + _tempTrackMapElement.clearance_height = clearanceZ; + _tempTrackMapElement.properties.track.type = trackType; + _tempTrackMapElement.properties.track.sequence = trackBlock->var_00; + _tempTrackMapElement.properties.track.colour = (edx & 0x20000 ? 4 : 0); + _tempTrackMapElement.properties.track.ride_index = rideIndex; + + // Draw this map tile + sub_68B2B7(x, y); + + // Restore map elements + map_set_tile_elements(tileX + 0, tileY + 0, _backupMapElementArrays[0]); + map_set_tile_elements(tileX + 1, tileY + 0, _backupMapElementArrays[1]); + map_set_tile_elements(tileX - 1, tileY + 0, _backupMapElementArrays[2]); + map_set_tile_elements(tileX + 0, tileY + 1, _backupMapElementArrays[3]); + map_set_tile_elements(tileX + 0, tileY - 1, _backupMapElementArrays[4]); + + trackBlock++; + } + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint64) = preserve_map_size_vars; + + sub_688217(); + sub_688485(); + + RCT2_GLOBAL(0x0141E9E4, uint16) = preserve_word_141E9E4; +} + +/** + * + * rct2: 0x006C84CE + */ +void sub_6C84CE() +{ + rct_window *w; + rct_map_element *mapElement; + + window_ride_construction_update_enabled_track_pieces(); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) + return; + + window_ride_construction_update_map_selection(); + + RCT2_GLOBAL(0x00F440D0, uint8) = 255; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { + int x = _currentTrackBeginX; + int y = _currentTrackBeginY; + int z = _currentTrackBeginZ; + if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + RCT2_GLOBAL(0x00F440D0, uint8) = mapElement->properties.track.type; + if (mapElement->properties.track.type == 99) + RCT2_GLOBAL(0x00F440CD, uint8) = (mapElement->properties.track.sequence >> 4) << 1; + _currentSeatRotationAngle = mapElement->properties.track.colour >> 4; + } + } + + window_ride_construction_update_possible_ride_configurations(); + window_ride_construction_update_widgets(w); +} + +/** + * + * rct2: 0x006CA2DF + * bh: trackRotation (out) + * dl: ??? (out) + * dh: trackType (out) + * edx >> 16: ??? (out) + */ +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *seatRotation) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) + return true; + + if (trackType != NULL) *trackType = (edx >> 8) & 0xFF; + if (trackDirection != NULL) *trackDirection = (ebx >> 8) & 0xFF; + if (rideIndex != NULL) *rideIndex = edx & 0xFF; + if (edxRS16 != NULL) *edxRS16 = (edx >> 16) & 0xFFFF; + if (x != NULL) *x = eax & 0xFFFF; + if (y != NULL) *y = ecx & 0xFFFF; + if (z != NULL) *z = edi & 0xFFFF; + if (seatRotation != NULL) *seatRotation = (edi >> 28) & 0xF; + return false; +} + +/** + * + * rct2: 0x006C6A77 + */ +static void window_ride_construction_update_enabled_track_pieces() +{ + rct_ride *ride = GET_RIDE(_currentRideIndex); + rct_ride_type *rideEntry = ride_get_entry(ride); + + int rideType = _currentTrackCovered & 2 ? RCT2_ADDRESS(0x0097D4F5, uint8)[ride->type * 8] : ride->type; + _enabledRidePiecesA = rideEntry->enabledTrackPiecesA & RCT2_ADDRESS(0x01357444, uint32)[rideType]; + _enabledRidePiecesB = rideEntry->enabledTrackPiecesB & RCT2_ADDRESS(0x01357644, uint32)[rideType]; +} + +/** + * + * rct2: 0x006CA162 + */ +money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16, int x, int y, int z) +{ + rct_ride *ride; + money32 result; + + sub_6C96C0(); + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_MAZE) { + result = game_do_command(x, 105 | (4 << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_38, z, 0); + if (result == MONEY32_UNDEFINED) + return result; + + RCT2_GLOBAL(0x00F440C5, uint16) = x; + RCT2_GLOBAL(0x00F440C7, uint16) = y; + RCT2_GLOBAL(0x00F440C9, uint16) = z; + RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; + _currentTrackSelectionFlags |= 2; + viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + if (_currentTrackSlopeEnd != 0) + viewport_set_visibility(2); + + return result; + } else { + result = game_do_command(x, 105 | (trackDirection << 8), y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_PLACE_TRACK, z, 0); + if (result == MONEY32_UNDEFINED) + return result; + + RCT2_GLOBAL(0x00F440C5, uint16) = x; + RCT2_GLOBAL(0x00F440C7, uint16) = y; + z += ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x009972BD + (trackType * 10), uint16) : + RCT2_GLOBAL(0x009968BD + (trackType * 10), uint16); + + RCT2_GLOBAL(0x00F440C9, uint16) = z; + RCT2_GLOBAL(0x00F440CB, uint8) = trackDirection; + _currentTrackSelectionFlags |= 2; + viewport_set_visibility(RCT2_GLOBAL(0x00F441D4, uint8) & 2 ? 1 : 3); + if (_currentTrackSlopeEnd != 0) + viewport_set_visibility(2); + + return result; + } +} + +/** + * + * rct2: 0x006C94D8 + */ +void sub_6C94D8() +{ + int x, y, z, direction, type, rideIndex, edxRS16; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + case RIDE_CONSTRUCTION_STATE_BACK: + if (!(_currentTrackSelectionFlags & 2)) { + if (sub_6CA2DF(&type, &direction, &rideIndex, &edxRS16, &x, &y, &z, NULL)) { + sub_6C96C0(); + } else { + _currentTrackPrice = sub_6CA162(rideIndex, type, direction, edxRS16, x, y, z); + sub_6C84CE(); + } + } + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + if (direction >= 4) + direction += 4; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) + direction ^= 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; + if (_currentTrackSelectionFlags & 1) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + map_invalidate_tile_full(x, y); + break; + case RIDE_CONSTRUCTION_STATE_SELECTED: + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection & 3; + type = _currentTrackPieceType; + if (sub_6C683D(&x, &y, &z, direction, type, 0, NULL, _currentTrackSelectionFlags & 1 ? 2 : 1)) { + sub_6C96C0(); + _rideConstructionState = RIDE_CONSTRUCTION_STATE_0; + } + break; + case 6: + case 7: + case 8: + _rideConstructionArrowPulseTime--; + if (_rideConstructionArrowPulseTime >= 0) + break; + + _rideConstructionArrowPulseTime = 5; + _currentTrackSelectionFlags ^= 1; + x = _currentTrackBeginX & 0xFFE0; + y = _currentTrackBeginY & 0xFFE0; + z = _currentTrackBeginZ + 15; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 4; + if (((_currentTrackBeginX & 0x1F) | (_currentTrackBeginY & 0x1F)) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 6; + if (((_currentTrackBeginX & 0x1F) & (_currentTrackBeginY & 0x1F)) == 0) { + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 5; + if ((_currentTrackBeginY & 0x1F) == 0) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = 7; + } + } + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~4; + if (_currentTrackSelectionFlags & 1) + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + map_invalidate_tile_full(x, y); + break; + } +} + +/** + * + * rct2: 0x006C84E2 + */ +static void window_ride_construction_update_map_selection() +{ + rct_ride *ride; + int trackType, trackDirection, x, y; + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 10; + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_0: + trackDirection = _currentTrackPieceDirection; + trackType = 0; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + break; + case RIDE_CONSTRUCTION_STATE_SELECTED: + trackDirection = _currentTrackPieceDirection; + trackType = _currentTrackPieceType; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + break; + default: + if (sub_6CA2DF(&trackType, &trackDirection, NULL, NULL, &x, &y, NULL, NULL)) { + trackDirection = _currentTrackPieceDirection; + trackType = 0; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + } + break; + } + + ride = GET_RIDE(_currentRideIndex); + window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); + map_invalidate_map_selection_tiles(); +} + +/** + * + * rct2: 0x006C8648 + */ +static void window_ride_construction_update_possible_ride_configurations() +{ + rct_ride *ride; + int trackType; + int edx, edi; + + ride = GET_RIDE(_currentRideIndex); + + RCT2_GLOBAL(0x00F440D3, uint8) = 0; + if (_currentTrackCovered & 2) + edi = RCT2_GLOBAL(0x0097D4F5 + (ride->type * 8), uint8); + else + edi = ride->type; + + int currentPossibleRideConfigurationIndex = 0; + _numCurrentPossibleSpecialTrackPieces = 0; + for (trackType = 0; trackType < 256; trackType++) { + edx = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? + RCT2_GLOBAL(0x0099849D + (trackType * 8), uint8) : + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8); + + if (edx == 0) + continue; + + if (edx & 0x80) { + edx &= 0x7F; + if (edx != edi) + continue; + } else if (!is_track_enabled(edx)) { + continue; + } + + int slope, bank; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT || _rideConstructionState == RIDE_CONSTRUCTION_STATE_PLACE) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + slope = RCT2_GLOBAL(0x0099849F + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x009984A1 + (trackType * 8), uint8); + } else { + slope = RCT2_GLOBAL(0x00997C9F + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x00997CA1 + (trackType * 8), uint8); + } + } else if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + slope = RCT2_GLOBAL(0x0099849E + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x009984A0 + (trackType * 8), uint8); + } else { + slope = RCT2_GLOBAL(0x00997C9E + (trackType * 8), uint8); + bank = RCT2_GLOBAL(0x00997CA0 + (trackType * 8), uint8); + } + } else { + continue; + } + + if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + if ( + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == 21 || + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) != 22 + ) { + if (bank != _previousTrackBankEnd) { + if (_previousTrackBankEnd != 0) + continue; + + if (bank != TRACK_BANK_LEFT) + continue; + } + } + } + + if (bank == TRACK_BANK_UPSIDE_DOWN && bank != _previousTrackBankEnd) + continue; + + _currentPossibleRideConfigurations[currentPossibleRideConfigurationIndex] = trackType; + RCT2_GLOBAL(0x00F4409C, uint32) |= (1 << currentPossibleRideConfigurationIndex); + if ( + _currentTrackPieceDirection < 4 && + slope == _previousTrackSlopeEnd && + bank == _previousTrackBankEnd && + (trackType != 66 || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) + ) { + RCT2_GLOBAL(0x00F4409C, uint32) &= ~(1 << currentPossibleRideConfigurationIndex); + _numCurrentPossibleSpecialTrackPieces++; + } + currentPossibleRideConfigurationIndex++; + } + _numCurrentPossibleRideConfigurations = currentPossibleRideConfigurationIndex; +} + +/** + * + * rct2: 0x006C87F5 + */ +static void window_ride_construction_update_widgets(rct_window *w) +{ + uint8 rideIndex = _currentRideIndex; + rct_ride *ride = GET_RIDE(rideIndex); + int rideType = ride_get_alternative_type(ride); + + w->hold_down_widgets = 0; + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_IS_SHOP)) { + window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_EXIT].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_ENTRANCE_EXIT_GROUPBOX].type = WWT_GROUPBOX; + window_ride_construction_widgets[WIDX_ENTRANCE].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_EXIT].type = WWT_DROPDOWN_BUTTON; + } + + if (_numCurrentPossibleSpecialTrackPieces == 0) { + window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_SPECIAL_TRACK_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + } + + if (is_track_enabled(TRACK_STRAIGHT)) { + window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_FLATBTN; + } else { + window_ride_construction_widgets[WIDX_STRAIGHT].type = WWT_EMPTY; + } + + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_30)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_FLATBTN; + } else { + window_ride_construction_widgets[WIDX_LEFT_CURVE_LARGE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_LARGE].type = WWT_EMPTY; + } + + window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 28; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 49; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 116; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 137; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5139; + if (is_track_enabled(TRACK_SLOPE_STEEP_LONG)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141; + } + if (is_track_enabled(TRACK_CURVE)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].left = 6; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].right = 27; + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].image = 5140; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].left = 138; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].right = 159; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].image = 5141; + } + if (is_track_enabled(TRACK_CURVE_SMALL)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_SMALL].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_CURVE_VERY_SMALL)) { + window_ride_construction_widgets[WIDX_LEFT_CURVE_VERY_SMALL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_RIGHT_CURVE_VERY_SMALL].type = WWT_FLATBTN; + } + + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP; + if (rideType == RIDE_TYPE_REVERSE_FREEFALL_COASTER || rideType == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER) { + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_SLOPE) || is_track_enabled(TRACK_SLOPE_STEEP)) { + window_ride_construction_widgets[WIDX_LEVEL].type = WWT_FLATBTN; + } + if (is_track_enabled(TRACK_SLOPE)) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_SLOPE_UP].type = WWT_FLATBTN; + } + if ( + is_track_enabled(TRACK_HELIX_SMALL) && + _currentTrackBankEnd != TRACK_BANK_NONE && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE + ) { + if (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) { + // Enable helix + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN; + if (rideType != RIDE_TYPE_SPLASH_BOATS) + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN; + } + } + + if (is_track_enabled(TRACK_SLOPE_STEEP)) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].type = WWT_FLATBTN; + if (rideType != RIDE_TYPE_SPLASH_BOATS) + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].type = WWT_FLATBTN; + } + + int x; + if (is_track_enabled(TRACK_LIFT_HILL) && _currentTrackCurve < 256) { + window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_FLATBTN; + x = 9; + } else { + window_ride_construction_widgets[WIDX_CHAIN_LIFT].type = WWT_EMPTY; + x = 23; + } + + for (int i = WIDX_SLOPE_DOWN_STEEP; i <= WIDX_SLOPE_UP_STEEP; i++) { + window_ride_construction_widgets[i].left = x; + window_ride_construction_widgets[i].right = x + 23; + x += 24; + } + + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5148; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_UP_TIP; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5144; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_STEEP_SLOPE_DOWN_TIP; + if (is_track_enabled(TRACK_SLOPE_VERTICAL)) { + if (_previousTrackSlopeEnd == TRACK_SLOPE_UP_60 || _previousTrackSlopeEnd == TRACK_SLOPE_UP_90) { + int originalSlopeUpSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left; + int originalSlopeUpSteepRight = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + for (int i = WIDX_SLOPE_UP_STEEP; i > WIDX_SLOPE_DOWN_STEEP; i--) { + window_ride_construction_widgets[i].left = window_ride_construction_widgets[i - 1].left; + window_ride_construction_widgets[i].right = window_ride_construction_widgets[i - 1].right; + } + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = originalSlopeUpSteepLeft; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = originalSlopeUpSteepRight; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5149; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_RISE_TIP; + } else if (_previousTrackSlopeEnd == TRACK_SLOPE_DOWN_60 || _previousTrackSlopeEnd == TRACK_SLOPE_DOWN_90) { + int originalSlopeDownSteepLeft = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + int originalSlopeDownSteepRight = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + for (int i = WIDX_SLOPE_DOWN_STEEP; i < WIDX_SLOPE_UP_STEEP; i++) { + window_ride_construction_widgets[i].left = window_ride_construction_widgets[i + 1].left; + window_ride_construction_widgets[i].right = window_ride_construction_widgets[i + 1].right; + } + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = originalSlopeDownSteepLeft; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = originalSlopeDownSteepRight; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5150; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_VERTICAL_DROP_TIP; + } + } + + if ( + is_track_enabled(TRACK_HELIX_LARGE_UNBANKED) && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE && + _currentTrackBankEnd == TRACK_BANK_NONE && + (_currentTrackCurve == TRACK_CURVE_LEFT || _currentTrackCurve == TRACK_CURVE_RIGHT) + ) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP; + + int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp; + } + + if ( + (is_track_enabled(TRACK_HELIX_LARGE) || is_track_enabled(TRACK_HELIX_SMALL)) && + (_currentTrackCurve >= TRACK_CURVE_LEFT && _currentTrackCurve <= TRACK_CURVE_RIGHT_SMALL) && + _currentTrackSlopeEnd == TRACK_SLOPE_NONE && + _currentTrackBankEnd != TRACK_BANK_NONE + ) { + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].image = 5151; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_DOWN_TIP; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].image = 5152; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].tooltip = STR_RIDE_CONSTRUCTION_HELIX_UP_TIP; + + int tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_DOWN].left; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_DOWN].right; + window_ride_construction_widgets[WIDX_SLOPE_DOWN].right = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].left = window_ride_construction_widgets[WIDX_SLOPE_UP].left; + window_ride_construction_widgets[WIDX_SLOPE_UP].left = tmp; + + tmp = window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP_STEEP].right = window_ride_construction_widgets[WIDX_SLOPE_UP].right; + window_ride_construction_widgets[WIDX_SLOPE_UP].right = tmp; + } + + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_ROLL_BANKING; + window_ride_construction_widgets[WIDX_BANK_LEFT].image = 5153; + window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_LEFT_CURVE_TIP; + window_ride_construction_widgets[WIDX_BANK_LEFT].left = 47; + window_ride_construction_widgets[WIDX_BANK_LEFT].right = 70; + window_ride_construction_widgets[WIDX_BANK_LEFT].top = 132; + window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = 5154; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_NO_ROLL_TIP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 71; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 94; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 132; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_RIGHT].image = 5155; + window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_ROLL_FOR_RIGHT_CURVE_TIP; + window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 95; + window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 118; + window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 132; + window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 155; + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_EMPTY; + if (RCT2_GLOBAL(0x00F440D0, uint8) != 99 && _currentTrackCurve != 355) { + if (is_track_enabled(TRACK_FLAT_ROLL_BANKING)) { + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_FLATBTN; + } + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (rideType == RIDE_TYPE_WATER_COASTER) { + window_ride_construction_widgets[WIDX_U_TRACK].image = 5158; + window_ride_construction_widgets[WIDX_O_TRACK].image = 5159; + window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_STANDARD_RC_TRACK_TIP; + window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_WATER_CHANNEL_TIP; + if (_currentTrackCurve < TRACK_CURVE_LEFT_SMALL && _currentTrackSlopeEnd == TRACK_SLOPE_NONE && _currentTrackBankEnd == TRACK_BANK_NONE) { + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN; + } + } else { + window_ride_construction_widgets[WIDX_U_TRACK].image = 5156; + window_ride_construction_widgets[WIDX_O_TRACK].image = 5157; + window_ride_construction_widgets[WIDX_U_TRACK].tooltip = STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP; + window_ride_construction_widgets[WIDX_O_TRACK].tooltip = STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP; + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_TRACK_STYLE; + window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_FLATBTN; + } + } + } else { + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].image = STR_RIDE_CONSTRUCTION_BRAKE_SPEED; + RCT2_GLOBAL(0x00F440D3, uint8) = 1; + window_ride_construction_widgets[WIDX_BANK_LEFT].image = 1675; + window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_RIGHT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP; + window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_SPINNER; + window_ride_construction_widgets[WIDX_BANK_LEFT].left = 12; + window_ride_construction_widgets[WIDX_BANK_LEFT].right = 83; + window_ride_construction_widgets[WIDX_BANK_LEFT].top = 138; + window_ride_construction_widgets[WIDX_BANK_LEFT].bottom = 149; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].image = STR_NUMERIC_UP; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].left = 72; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].right = 82; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].top = 139; + window_ride_construction_widgets[WIDX_BANK_STRAIGHT].bottom = 143; + window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANK_RIGHT].image = STR_NUMERIC_DOWN; + window_ride_construction_widgets[WIDX_BANK_RIGHT].left = 72; + window_ride_construction_widgets[WIDX_BANK_RIGHT].right = 82; + window_ride_construction_widgets[WIDX_BANK_RIGHT].top = 144; + window_ride_construction_widgets[WIDX_BANK_RIGHT].bottom = 148; + w->hold_down_widgets |= (1 << WIDX_BANK_STRAIGHT) | (1 << WIDX_BANK_RIGHT); + } + + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 162; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = 0; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = 0; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = 0; + if ( + (rideType == RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER || rideType == RIDE_TYPE_38) && + RCT2_GLOBAL(0x00F440D0, uint8) != 99 && + _currentTrackCurve != 355 + ) { + window_ride_construction_widgets[WIDX_SEAT_ROTATION_GROUPBOX].type = WWT_GROUPBOX; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER].type = WWT_SPINNER; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_UP].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_SEAT_ROTATION_ANGLE_SPINNER_DOWN].type = WWT_DROPDOWN_BUTTON; + window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].right = 92; + if (window_ride_construction_widgets[WIDX_BANK_LEFT].type != WWT_SPINNER) { + for (int i = WIDX_BANK_LEFT; i <= WIDX_BANK_RIGHT; i++) { + window_ride_construction_widgets[i].left -= 36; + window_ride_construction_widgets[i].right -= 36; + } + } + } + + uint64 pressedWidgets = w->pressed_widgets & ( + (1 << WIDX_BACKGROUND) | + (1 << WIDX_TITLE) | + (1 << WIDX_CLOSE) | + (1 << WIDX_DIRECTION_GROUPBOX) | + (1 << WIDX_SLOPE_GROUPBOX) | + (1 << WIDX_BANKING_GROUPBOX) | + (1 << WIDX_CONSTRUCT) | + (1 << WIDX_DEMOLISH) | + (1 << WIDX_PREVIOUS_SECTION) | + (1 << WIDX_NEXT_SECTION) | + (1 << WIDX_ENTRANCE_EXIT_GROUPBOX) | + (1 << WIDX_ENTRANCE) | + (1 << WIDX_EXIT) + ); + + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_ROTATE].type = WWT_EMPTY; + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_8)) { + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + } else { + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_FLATBTN; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_FLATBTN; + } + + switch (_rideConstructionState) { + case RIDE_CONSTRUCTION_STATE_FRONT: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + break; + case RIDE_CONSTRUCTION_STATE_BACK: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + break; + case RIDE_CONSTRUCTION_STATE_PLACE: + window_ride_construction_widgets[WIDX_CONSTRUCT].type = WWT_IMGBTN; + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_ROTATE].type = WWT_FLATBTN; + break; + case RIDE_CONSTRUCTION_STATE_ENTRANCE_EXIT: + window_ride_construction_widgets[WIDX_DEMOLISH].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_NEXT_SECTION].type = WWT_EMPTY; + window_ride_construction_widgets[WIDX_PREVIOUS_SECTION].type = WWT_EMPTY; + break; + default: + w->pressed_widgets = pressedWidgets; + window_invalidate(w); + return; + } + + int widgetIndex; + switch (_currentTrackCurve) { + case TRACK_CURVE_NONE: + widgetIndex = WIDX_STRAIGHT; + break; + case TRACK_CURVE_LEFT: + widgetIndex = WIDX_LEFT_CURVE; + break; + case TRACK_CURVE_RIGHT: + widgetIndex = WIDX_RIGHT_CURVE; + break; + case TRACK_CURVE_LEFT_SMALL: + widgetIndex = WIDX_LEFT_CURVE_SMALL; + break; + case TRACK_CURVE_RIGHT_SMALL: + widgetIndex = WIDX_RIGHT_CURVE_SMALL; + break; + case TRACK_CURVE_LEFT_VERY_SMALL: + widgetIndex = WIDX_LEFT_CURVE_VERY_SMALL; + break; + case TRACK_CURVE_RIGHT_VERY_SMALL: + widgetIndex = WIDX_RIGHT_CURVE_VERY_SMALL; + break; + case TRACK_CURVE_LEFT_LARGE: + widgetIndex = WIDX_LEFT_CURVE_LARGE; + break; + case TRACK_CURVE_RIGHT_LARGE: + widgetIndex = WIDX_RIGHT_CURVE_LARGE; + break; + default: + widgetIndex = WIDX_SPECIAL_TRACK_DROPDOWN; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + + switch (_currentTrackSlopeEnd) { + case TRACK_SLOPE_DOWN_60: + case TRACK_SLOPE_UP_90: + widgetIndex = WIDX_SLOPE_DOWN_STEEP; + break; + case TRACK_SLOPE_DOWN_25: + widgetIndex = WIDX_SLOPE_DOWN; + break; + case TRACK_SLOPE_UP_25: + widgetIndex = WIDX_SLOPE_UP; + break; + case TRACK_SLOPE_UP_60: + case TRACK_SLOPE_DOWN_90: + widgetIndex = WIDX_SLOPE_UP_STEEP; + break; + default: + widgetIndex = WIDX_LEVEL; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + + if (RCT2_GLOBAL(0x00F440D3, uint8) == 0) { + if (ride_type_has_flag(rideType, RIDE_TYPE_FLAG_12)) { + if (_currentTrackCovered & 1) { + w->pressed_widgets |= (1ULL << WIDX_O_TRACK); + } else { + w->pressed_widgets |= (1ULL << WIDX_U_TRACK); + } + } + switch (_currentTrackBankEnd) { + case TRACK_BANK_LEFT: + widgetIndex = WIDX_BANK_LEFT; + break; + case TRACK_BANK_NONE: + widgetIndex = WIDX_BANK_STRAIGHT; + break; + default: + widgetIndex = WIDX_BANK_RIGHT; + break; + } + pressedWidgets |= (1ULL << widgetIndex); + } + + if (_currentTrackLiftHill & 1) + pressedWidgets |= (1 << WIDX_CHAIN_LIFT); + + w->pressed_widgets = pressedWidgets; + window_invalidate(w); +} + +static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y) +{ + rct_preview_track *trackBlock; + int offsetX, offsetY; + + trackBlock = get_track_def_from_ride(ride, trackType); + trackDirection &= 3; + int selectionTileIndex = 0; + while (trackBlock->var_00 != 255) { + switch (trackDirection) { + case 0: + offsetX = trackBlock->x; + offsetY = trackBlock->y; + break; + case 1: + offsetX = trackBlock->y; + offsetY = -trackBlock->x; + break; + case 2: + offsetX = -trackBlock->x; + offsetY = -trackBlock->y; + break; + case 3: + offsetX = -trackBlock->y; + offsetY = trackBlock->x; + break; + } + gMapSelectionTiles[selectionTileIndex].x = x + offsetX; + gMapSelectionTiles[selectionTileIndex].y = y + offsetY; + selectionTileIndex++; + trackBlock++; + } + gMapSelectionTiles[selectionTileIndex].x = -1; + gMapSelectionTiles[selectionTileIndex].y = -1; +} + +/** + * + * rct2: 0x006C776D + */ +static void window_ride_construction_show_special_track_dropdown(rct_window *w, rct_widget *widget) +{ + window_dropdown_show_text_custom_width( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1], + 0, + _numCurrentPossibleRideConfigurations, + widget->right - widget->left + ); + + for (int i = 0; i < _numCurrentPossibleRideConfigurations; i++) { + uint8 trackPiece = _currentPossibleRideConfigurations[i]; + rct_string_id trackPieceStringId = RideConfigurationStringIds[trackPiece]; + if (trackPieceStringId == STR_RAPIDS) { + rct_ride *ride = GET_RIDE(_currentRideIndex); + if (ride->type == RIDE_TYPE_CAR_RIDE) + trackPieceStringId = STR_LOG_BUMPS; + } + gDropdownItemsFormat[i] = trackPieceStringId; + if ((trackPiece | 0x100) == _currentTrackCurve) { + RCT2_GLOBAL(0x009DEBA2, sint16) = i; + } + } + *gDropdownItemsDisabled = RCT2_GLOBAL(0x00F4409C, uint32); +} + +/** + * + * rct2: 0x006C7630 + */ +static void ride_selected_track_set_seat_rotation(int seatRotation) +{ + int x, y, z; + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, seatRotation, NULL, (1 << 5)); + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C7502 + */ +static void loc_6C7502(int al) +{ + _currentTrackSlopeEnd = al; + _currentTrackPrice = MONEY32_UNDEFINED; + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_FRONT) { + if (al != 2 && al != 4 && al != 0) { + _currentTrackLiftHill &= ~1; + } + } + sub_6C84CE(); +} + +/** + * + * rct2: 0x006C76E9 + */ +static void loc_6C76E9() +{ + rct_map_element *mapElement; + int x, y, z; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + if (sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + game_do_command( + _currentTrackBeginX, + GAME_COMMAND_FLAG_APPLY | ((_currentTrackPieceDirection & 3) << 8), + _currentTrackBeginY, + mapElement->properties.track.type, + GAME_COMMAND_28, + _currentTrackBeginZ, + 0 + ); + } + sub_6C84CE(); +} + +/** + * + * rct2: 0x006CC6A8 + */ +static void ride_construction_toolupdate_construct(int screenX, int screenY) +{ + int x, y, z, highestZ; + rct_ride *ride; + rct_preview_track *trackBlock; + + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) { + sub_6C9627(); + map_invalidate_map_selection_tiles(); + return; + } + + z = RCT2_GLOBAL(0x00F44163, uint16); + if (z == 0) + z = map_get_highest_z(x >> 5, y >> 5); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~8; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = _currentTrackPieceDirection; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + gMapSelectionTiles[0].x = x; + gMapSelectionTiles[0].y = y; + gMapSelectionTiles[1].x = -1; + gMapSelectionTiles[1].y = -1; + + int trackType, trackDirection, rideIndex, edxRS16; + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, NULL, NULL, NULL, NULL)) { + sub_6C9627(); + map_invalidate_map_selection_tiles(); + return; + } + _currentTrackPieceType = trackType; + ride = GET_RIDE(_currentRideIndex); + + // Re-using this other code, very slight difference from original + // - Original code checks for MSB mask instead of 255 on trackPart->var_00 + // - Original code checks this first as its already set origin tile, probably just a micro optimisation + window_ride_construction_select_map_tiles(ride, trackType, trackDirection, x, y); + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + // Raise z above all slopes and water + highestZ = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { + rct_xy16 *selectedTile = gMapSelectionTiles; + while (selectedTile->x != -1) { + if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) + continue; + + z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + if (z > highestZ) + highestZ = z; + + selectedTile++; + } + } + // loc_6CC8BF: + // z = map_get_highest_z(x >> 5, y >> 5); + } + // loc_6CC91B: + trackBlock = get_track_def_from_ride(ride, trackType); + int bx = 0; + do { + bx = min(bx, trackBlock->z); + trackBlock++; + } while (trackBlock->var_00 != 255); + z -= bx; + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; + bx = 41; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + if ( + (_currentTrackSelectionFlags & 2) && + x == _previousTrackPieceX && + y == _previousTrackPieceY && + z == _previousTrackPieceZ + ) { + map_invalidate_map_selection_tiles(); + return; + } + + _previousTrackPieceX = x; + _previousTrackPieceY = y; + _previousTrackPieceZ = z; + if (ride->type == RIDE_TYPE_MAZE) { + // goto loc_6CCA31 + return; + } + + for (;;) { + sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, NULL); + _currentTrackPrice = sub_6CA162(rideIndex, trackType, trackDirection, edxRS16, x, y, z); + if (_currentTrackPrice != MONEY32_UNDEFINED) + break; + + bx--; + if (bx == 0) + break; + + _currentTrackBeginZ -= 8; + if (_currentTrackBeginZ & 0x8000) + break; + + if (bx >= 0) + _currentTrackBeginZ += 16; + } + + sub_6C84CE(); + map_invalidate_map_selection_tiles(); +} + +/** + * + * rct2: 0x006CD354 + */ +static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) +{ + int x, y, direction; + uint8 unk; + + map_invalidate_selection_rect(); + map_invalidate_map_selection_tiles(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &x, &y, &direction); + if (RCT2_GLOBAL(0x00F44194, uint8) == 255) { + sub_6C9627(); + return; + } + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) |= 1 | 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_TYPE, uint16) = 4; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = direction ^ 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, uint16) = x; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Y, uint16) = y; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = RCT2_GLOBAL(0x00F44190, uint8) * 8; + map_invalidate_selection_rect(); + + direction = RCT2_GLOBAL(0x00F44194, uint8) ^ 2; + unk = RCT2_GLOBAL(0x00F44193, uint8); + if ( + !(_currentTrackSelectionFlags & 4) || + x != RCT2_GLOBAL(0x00F440BF, uint16) || + y != RCT2_GLOBAL(0x00F440C1, uint16) || + direction != RCT2_GLOBAL(0x00F440C3, uint8) || + unk != RCT2_GLOBAL(0x00F440C4, uint8) + ) { + _currentTrackPrice = ride_get_entrance_or_exit_price( + _currentRideIndex, x, y, direction, RCT2_GLOBAL(0x00F44191, uint8), unk + ); + sub_6C84CE(); + } +} + +/** + * + * rct2: 0x006CCA73 + */ +static void ride_construction_tooldown_construct(int screenX, int screenY) +{ + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation, highestZ; + rct_window *w; + + map_invalidate_map_selection_tiles(); + sub_6C9627(); + + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) + return; + + _currentTrackPieceType = trackType; + + // Raise z above all slopes and water + highestZ = 0; + if (RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & 2) { + rct_xy16 *selectedTile = gMapSelectionTiles; + while (selectedTile->x != -1) { + if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) + continue; + + z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + if (z > highestZ) + highestZ = z; + + selectedTile++; + } + } + RCT2_GLOBAL(0x00F440E2, uint16) = z; + + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); + if (!ride_get_place_position_from_screen_position(screenX, screenY, &x, &y)) + return; + + z = RCT2_GLOBAL(0x00F44163, uint16); + if (z == 0) + z = map_get_highest_z(x >> 5, y >> 5); + + tool_cancel(); + + rct_ride *ride = GET_RIDE(_currentRideIndex); + if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { + rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); + int bx = 0; + do { + bx = min(bx, trackBlock->z); + trackBlock++; + } while (trackBlock->var_00 != 255); z -= bx; - int start_x = x; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) - { - case 0: - x = y - x; - y = (y + start_x) / 2 - z; + z -= 16; + } else { + z = RCT2_GLOBAL(0x00F44163, uint16); + } + + if (ride->type == RIDE_TYPE_MAZE) { + // goto loc_6CCDE4 + return; + } + + for (int zAttempts = 41; zAttempts >= 0; zAttempts--) { + _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; + _currentTrackBeginX = x; + _currentTrackBeginY = y; + _currentTrackBeginZ = z; + _currentTrackSelectionFlags = 0; + _rideConstructionArrowPulseTime = 0; + sub_6C84CE(); + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w == NULL) break; - case 1: - x = -x - y; - y = (y - start_x) / 2 - z; - break; - case 2: - x -= y; - y = (-y - start_x) / 2 - z; - break; - case 3: - x += y; - y = (-y + start_x) / 2 - z; + + RCT2_GLOBAL(0x009A8C29, uint8) |= 1; + window_event_mouse_up_call(w, WIDX_CONSTRUCT); + RCT2_GLOBAL(0x009A8C29, uint8) &= ~1; + + if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { + rct_string_id errorText = RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id); + if ( + errorText == STR_NOT_ENOUGH_CASH_REQUIRES || + errorText == STR_CAN_ONLY_BUILD_THIS_UNDERWATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ON_WATER || + errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || + errorText == STR_TOO_HIGH_FOR_SUPPORTS || + zAttempts == 0 || + z - 8 < 0 + ) { + int saveTrackDirection = _currentTrackPieceDirection; + int saveCurrentTrackCurve = _currentTrackCurve; + int savePreviousTrackSlopeEnd = _previousTrackSlopeEnd; + int saveCurrentTrackSlopeEnd = _currentTrackSlopeEnd; + int savePreviousTrackBankEnd = _previousTrackBankEnd; + int saveCurrentTrackBankEnd = _currentTrackBankEnd; + int saveCurrentTrackCovered = _currentTrackCovered; + int saveCurrentTrackLiftHill = _currentTrackLiftHill; + + sub_6CC3FB(_currentRideIndex); + + _currentTrackPieceDirection = saveTrackDirection; + _currentTrackCurve = saveCurrentTrackCurve; + _previousTrackSlopeEnd = savePreviousTrackSlopeEnd; + _currentTrackSlopeEnd = saveCurrentTrackSlopeEnd; + _previousTrackBankEnd = savePreviousTrackBankEnd; + _currentTrackBankEnd = saveCurrentTrackBankEnd; + _currentTrackCovered = saveCurrentTrackCovered; + _currentTrackLiftHill = saveCurrentTrackLiftHill; + + sound_play_panned(SOUND_ERROR, RCT2_GLOBAL(0x0142406C, sint32), x, y, z); + break; + } else if (zAttempts >= 0) { + z += 16; + } + } else { + window_close_by_class(WC_ERROR); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_0) { + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL) { + if (ride_are_all_possible_entrances_and_exits_built(ride)) { + window_close(w); + } else { + window_event_mouse_up_call(w, WIDX_ENTRANCE); + } + } + } break; } - clip_dpi->x += x - width / 2; - clip_dpi->y += y - height / 2 - 16; - RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = clip_dpi; - uint32_t d = RCT2_GLOBAL(0xF44136, int16_t) << 16; - d |= RCT2_GLOBAL(0xF44133, uint8_t);// Ride id - d |= RCT2_GLOBAL(0xF44135, uint8_t) << 8; - RCT2_CALLPROC_X(0x6CBCE2, 0x1000, (((uint16_t)bx) & 0xFF) | (RCT2_GLOBAL(0xF44134, uint8_t) << 8), 0x1000, d, width / 2, 0x400, height / 2); - rct2_free(clip_dpi); } - short string_x = (RCT2_GLOBAL(0x9D7C02, int16_t) + RCT2_GLOBAL(0x9D7C04, int16_t)) / 2 + w->x; - short string_y = RCT2_GLOBAL(0x9D7C08, int16_t) + w->y - 23; - if (RCT2_GLOBAL(0xF440A6, uint8_t) != 4) gfx_draw_string_centred(dpi, 1407, string_x, string_y, 0, w); - string_y += 11; - if (RCT2_GLOBAL(0xF44070, uint32_t) != MONEY32_UNDEFINED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32_t) & 0x800)) - gfx_draw_string_centred(dpi, 1408, string_x, string_y, 0, (void*)0xF44070); } -//0x006CD45B -void window_construction_maze_paint() +/** + * + * rct2: 0x006CCA73 + */ +static void ride_construction_tooldown_entrance_exit(int screenX, int screenY) { - rct_window *w; - rct_drawpixelinfo *dpi; - window_paint_get_registers(w, dpi); - window_draw_widgets(w, dpi); -} \ No newline at end of file + sub_6C9627(); + map_invalidate_selection_rect(); + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 4); + + int mapX, mapY, direction; + ride_get_entrance_or_exit_position_from_screen_position(screenX, screenY, &mapX, &mapY, &direction); + if (RCT2_GLOBAL(0x00F44194, uint8) == 255) + return; + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ? + STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION : + STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION; + + money32 cost = game_do_command( + RCT2_GLOBAL(0x00F44188, uint16), + (GAME_COMMAND_FLAG_APPLY) | ((RCT2_GLOBAL(0x00F44194, uint8) ^ 2) << 8), + RCT2_GLOBAL(0x00F4418A, uint16), + RCT2_GLOBAL(0x00F44192, uint8) | (RCT2_GLOBAL(0x00F44191, uint8) << 8), + GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, + RCT2_GLOBAL(0x00F44193, uint8), + 0 + ); + if (cost == MONEY32_UNDEFINED) { + return; + } + + sound_play_panned( + SOUND_PLACE_ITEM, + 0x8001, + RCT2_GLOBAL(0x009DEA5E, uint16), + RCT2_GLOBAL(0x009DEA60, uint16), + RCT2_GLOBAL(0x009DEA62, uint16) + ); + + rct_ride *ride = GET_RIDE(RCT2_GLOBAL(0x00F44192, uint8)); + if (ride_are_all_possible_entrances_and_exits_built(ride)) { + tool_cancel(); + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_15)) { + window_close_by_class(WC_RIDE_CONSTRUCTION); + } + } else { + RCT2_GLOBAL(0x00F44191, uint8) ^= 1; + window_invalidate_by_class(77); + RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16) = (RCT2_GLOBAL(0x00F44191, uint8) == 0) ? + WIDX_ENTRANCE : WIDX_EXIT; + } +} diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 7e8bcbf35f..7e19dba052 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -357,7 +357,7 @@ static void window_track_place_attempt_placement(int x, int y, int z, int bl, mo ebx = bl; ecx = y; edi = z; - result = game_do_command_p(GAME_COMMAND_PLACE_TRACK, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + result = game_do_command_p(GAME_COMMAND_PLACE_TRACK_DESIGN, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); if (cost != NULL) *cost = result; if (rideIndex != NULL) *rideIndex = edi & 0xFF; diff --git a/src/world/map.c b/src/world/map.c index fd40301cd3..602be3f4ee 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -153,14 +153,22 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it) rct_map_element *map_get_first_element_at(int x, int y) { - if (x < 0 || y < 0 || x > 255 || y > 255) - { - log_error("Trying to access element outside of range"); + if (x < 0 || y < 0 || x > 255 || y > 255) { + log_error("Trying to access element outside of range"); return NULL; } return TILE_MAP_ELEMENT_POINTER(x + y * 256); } +void map_set_tile_elements(int x, int y, rct_map_element *elements) +{ + if (x < 0 || y < 0 || x > 255 || y > 255) { + log_error("Trying to access element outside of range"); + return; + } + TILE_MAP_ELEMENT_POINTER(x + y * 256) = elements; +} + int map_element_is_last_for_tile(rct_map_element *element) { return element->flags & MAP_ELEMENT_FLAG_LAST_TILE; @@ -171,6 +179,11 @@ int map_element_get_type(rct_map_element *element) return element->type & MAP_ELEMENT_TYPE_MASK; } +int map_element_get_direction(rct_map_element *element) +{ + return element->type & MAP_ELEMENT_DIRECTION_MASK; +} + int map_element_get_terrain(rct_map_element *element) { int terrain = (element->properties.surface.terrain >> 5) & 7; @@ -3061,3 +3074,24 @@ static void sub_68AE2A(int x, int y) } } } + +int map_get_highest_z(int tileX, int tileY) +{ + rct_map_element *mapElement; + int z; + + mapElement = map_get_surface_element_at(tileX, tileY); + if (mapElement == NULL) + return -1; + + z = mapElement->base_height * 8; + + // Raise z so that is above highest point of land and water on tile + if ((mapElement->properties.surface.slope & 0x0F) != 0) + z += 16; + if ((mapElement->properties.surface.slope & 0x10) != 0) + z += 16; + + z = max(z, (mapElement->properties.surface.terrain & 0x1F) * 16); + return z; +} diff --git a/src/world/map.h b/src/world/map.h index 6fcf3df8b2..0c2882bb0c 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -121,6 +121,10 @@ enum { MAP_ELEMENT_TYPE_BANNER = (7 << 2) }; +enum { + MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT = (1 << 6) +}; + enum { MAP_ELEMENT_DIRECTION_WEST, MAP_ELEMENT_DIRECTION_NORTH, @@ -254,8 +258,10 @@ extern bool gClearFootpath; void map_init(int size); void map_update_tile_pointers(); rct_map_element *map_get_first_element_at(int x, int y); +void map_set_tile_elements(int x, int y, rct_map_element *elements); int map_element_is_last_for_tile(rct_map_element *element); int map_element_get_type(rct_map_element *element); +int map_element_get_direction(rct_map_element *element); int map_element_get_terrain(rct_map_element *element); int map_element_get_terrain_edge(rct_map_element *element); void map_element_set_terrain(rct_map_element *element, int terrain); @@ -322,6 +328,7 @@ void map_element_iterator_restart_for_tile(map_element_iterator *it); void map_remove_intersecting_walls(int x, int y, int z0, int z1, int direction); void map_update_tiles(); +int map_get_highest_z(int tileX, int tileY); void sub_6A7594(); int map_element_get_banner_index(rct_map_element *mapElement); From d45cf519e355a1126e2e2c72351d0467dabdb7be Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 15:21:32 +0100 Subject: [PATCH 10/16] fix warnings --- src/title.c | 2 +- src/windows/title_editor.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/title.c b/src/title.c index 160de8c665..b8c9e715ab 100644 --- a/src/title.c +++ b/src/title.c @@ -720,7 +720,7 @@ bool title_refresh_sequence() if (_loadedScript != _magicMountainScript) SafeFree(_loadedScript); _scriptCurrentPreset = 0; - _loadedScript = _magicMountainScript; + _loadedScript = (uint8*)_magicMountainScript; _currentScript = _magicMountainScript; _scriptWaitCounter = 0; gTitleScriptCommand = -1; diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index a62e17a86d..2b13bcc63a 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -319,7 +319,7 @@ static void window_title_editor_mouseup() case WIDX_TITLE_EDITOR_NEW_BUTTON: commandEditorOpen *= 2; if (!commandEditorOpen) - window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, NULL, 64); + window_text_input_open(w, widgetIndex, 5239, 5406, STR_NONE, 0, 64); break; case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: commandEditorOpen *= 2; From 457e7862b388c9e6dd8650a4831365292b217c1b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 17:53:28 +0100 Subject: [PATCH 11/16] prepare track place and remove game commands --- src/game.c | 10 +++++----- src/localisation/string_ids.h | 7 +++++++ src/ride/track.c | 26 +++++++++++++++++++++++--- src/ride/track.h | 5 ++++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/game.c b/src/game.c index 2a032562e7..cfd8ba82b1 100644 --- a/src/game.c +++ b/src/game.c @@ -909,8 +909,8 @@ static uint32 game_do_command_table[58] = { 0, 0x0066397F, 0, - 0x006C511D, - 0x006C5B69, + 0, + 0, 0, 0x006B3F0F, 0, @@ -972,8 +972,8 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_set_ride_appearance, game_command_emptysub, game_pause_toggle, - game_command_emptysub, - game_command_emptysub, + game_command_place_track, + game_command_remove_track, game_load_or_quit, game_command_emptysub, game_command_demolish_ride, @@ -1016,7 +1016,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_remove_large_scenery, game_command_set_current_loan, game_command_set_research_funding, - game_command_place_track, + game_command_place_track_design, game_command_start_campaign, game_command_emptysub, game_command_place_banner, // 50 diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b93bab5ec7..464d3f454d 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -561,6 +561,8 @@ enum { STR_RIDE_CONSTRUCTION_U_SHAPED_OPEN_TRACK_TIP = 1460, STR_RIDE_CONSTRUCTION_O_SHAPED_ENCLOSED_TRACK_TIP = 1461, + STR_TOO_STEEP_FOR_LIFT_HILL = 1462, + STR_GUESTS = 1463, STR_HELIX_UP_SMALL = 1464, @@ -688,6 +690,9 @@ enum { STR_NUMBER_OF_SWINGS = 1769, STR_NUMBER_OF_SWINGS_TIP = 1770, + STR_ONLY_ONE_ON_RIDE_PHOTO_PER_RIDE = 1773, + STR_ONLY_ONE_CABLE_LIFT_HILL_PER_RIDE = 1774, + STR_OFF = 1775, STR_ON = 1776, STR_MUSIC = 1777, @@ -1154,6 +1159,8 @@ enum { STR_TOP_SECTION = 3069, STR_SLOPE_TO_LEVEL = 3070, + STR_NOT_ALLOWED_TO_MODIFY_STATION = 3092, + // Cheats STR_CHEAT_TITLE = 5217, STR_CHEAT_TITLE_FINANCIAL = 5345, diff --git a/src/ride/track.c b/src/ride/track.c index 0f73007b47..c51e298618 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -20,23 +20,25 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" #include "../config.h" #include "../game.h" #include "../interface/viewport.h" #include "../localisation/localisation.h" +#include "../management/finance.h" #include "../platform/platform.h" #include "../rct1.h" #include "../util/sawyercoding.h" #include "../util/util.h" +#include "../world/map_animation.h" #include "../world/park.h" #include "../world/scenery.h" #include "../world/footpath.h" #include "../windows/error.h" -#include "ride_ratings.h" #include "ride.h" +#include "ride_ratings.h" #include "track.h" #include "track_data.h" -#include "../rct1.h" /** * @@ -3170,7 +3172,7 @@ int install_track(char* source_path, char* dest_name){ } /* rct2: 0x006D13FE */ -void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ +void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp){ int x = *eax; int y = *ecx; int z = *edi; @@ -3439,3 +3441,21 @@ rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) { return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } + +/** + * + * rct2: 0x006C511D + */ +void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + RCT2_CALLFUNC_X(0x006C511D, eax, ebx, ecx, edx, esi, edi, ebp); +} + +/** + * + * rct2: 0x006C5B69 + */ +void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + RCT2_CALLFUNC_X(0x006C5B69, eax, ebx, ecx, edx, esi, edi, ebp); +} \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index 5497bdbc45..ce70239a47 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -486,7 +486,7 @@ int sub_6D01B3(uint8 bl, uint8 rideIndex, int x, int y, int z); int save_track_design(uint8 rideIndex); int install_track(char* source_path, char* dest_name); void window_track_list_format_name(char *dst, const char *src, char colour, char quotes); -void game_command_place_track(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); @@ -494,4 +494,7 @@ void track_save_select_nearby_scenery(int rideIndex); rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); +void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + #endif From 97e4a4d66301be46414b6280d75e824f762ad51f Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 22:53:52 +0100 Subject: [PATCH 12/16] add track block and possible ride configuration tables --- src/ride/ride.c | 6 +- src/ride/track.c | 18 +- src/ride/track.h | 8 +- src/ride/track_data.c | 4409 ++++++++++++++++++++++++++++++- src/ride/track_data.h | 7 +- src/windows/ride_construction.c | 24 +- src/windows/track_place.c | 6 +- 7 files changed, 4445 insertions(+), 33 deletions(-) diff --git a/src/ride/ride.c b/src/ride/ride.c index c71dfd4e9f..6d557a5082 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -836,7 +836,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par return 1; // Possibly z should be & 0xF8 - rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); + const rct_preview_track *trackBlock = get_track_def_from_ride_index(mapElement->properties.track.ride_index, type); int sequence = mapElement->properties.track.sequence & 0x0F; uint8 mapDirection = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; @@ -863,7 +863,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par int start_x = *x, start_y = *y, start_z = *z; *z += trackBlock[0].z; - for (int i = 0; trackBlock[i].var_00 != 0xFF; ++i){ + for (int i = 0; trackBlock[i].index != 0xFF; ++i){ int cur_x = start_x, cur_y = start_y, cur_z = start_z; switch (mapDirection){ case MAP_ELEMENT_DIRECTION_WEST: @@ -899,7 +899,7 @@ int sub_6C683D(int* x, int* y, int* z, int direction, int type, uint16 extra_par if ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) != direction) continue; - if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].var_00) + if ((mapElement->properties.track.sequence & 0xF) != trackBlock[i].index) continue; if (type == mapElement->properties.track.type) { diff --git a/src/ride/track.c b/src/ride/track.c index c51e298618..ae0de4c416 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1530,8 +1530,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac track_update_max_min_coordinates(x, y, z); if (RCT2_GLOBAL(0x00F440D4, uint8) == 0){ - for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; - trackBlock->var_00 != 0xFF; + for (const rct_preview_track* trackBlock = TrackBlocks[track_type]; + trackBlock->index != 0xFF; trackBlock++){ rct_xy16 tile; tile.x = x; @@ -1585,7 +1585,7 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac //di int temp_z = z; temp_z -= track_coordinates->z_negative; - rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; + const rct_preview_track* trackBlock = TrackBlocks[track_type]; temp_z += trackBlock->z; // rotation in bh @@ -1628,8 +1628,8 @@ int track_place_ride(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } if (RCT2_GLOBAL(0x00F440D4, uint8) == 3){ - for (rct_preview_track* trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[track_type]; - trackBlock->var_00 != 0xFF; + for (const rct_preview_track* trackBlock = TrackBlocks[track_type]; + trackBlock->index != 0xFF; trackBlock++){ rct_xy16 tile; tile.x = x; @@ -3430,14 +3430,14 @@ static void track_save_add_map_element(int mapElementSelectType, int x, int y, r RCT2_CALLPROC_X(0x006D2B3C, x, mapElementSelectType, y, (int)mapElement, 0, 0, 0); } -rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) +const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType) { return ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) ? - RCT2_ADDRESS(0x00994A38, rct_preview_track*)[trackType] : - RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; + FlatRideTrackBlocks[trackType] : + TrackBlocks[trackType]; } -rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) +const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType) { return get_track_def_from_ride(GET_RIDE(rideIndex), trackType); } diff --git a/src/ride/track.h b/src/ride/track.h index ce70239a47..197a516d59 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -39,10 +39,10 @@ typedef struct { * Size: 0x0A */ typedef struct { - uint8 var_00; + uint8 index; // 0x00 sint16 x; // 0x01 sint16 y; // 0x03 - sint16 z; + sint16 z; // 0x05 uint8 var_07; uint8 var_08; uint8 var_09; @@ -491,8 +491,8 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int void track_save_reset_scenery(); void track_save_select_nearby_scenery(int rideIndex); -rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); -rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); +const rct_preview_track *get_track_def_from_ride(rct_ride *ride, int trackType); +const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackType); void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_remove_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 636cb95522..f6fda77678 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -18,6 +18,7 @@ * along with this program. If not, see . *****************************************************************************/ +#include "track.h" #include "track_data.h" const rct_track_coordinates TrackCoordinates[256] = { @@ -277,4 +278,4410 @@ const rct_track_coordinates TrackCoordinates[256] = { { 0, 2, 0, 96, 64, 0 }, { 0, 2, 0, -128, -96, 0 }, { 0, 2, 0, 128, 64, 0 } -}; \ No newline at end of file +}; + +// rct2: 0x0097C468 (0 - 31) and 0x0097C5D4 (32 - 63) +const uint64 RideTypePossibleTrackConfigurations[91] = { + /* RIDE_TYPE_SPIRAL_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_STAND_UP_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_SUSPENDED_SWINGING_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_LARGE_UNBANKED | TRACK_BRAKES, + /* RIDE_TYPE_INVERTED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_HALF_LOOP_LARGE, + /* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MINIATURE_RAILWAY */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MINI_SUSPENDED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_BOAT_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_WOODEN_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_STEEPLECHASE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_CAR_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_TOWER_BASE, + /* RIDE_TYPE_LAUNCHED_FREEFALL */ TRACK_TOWER_BASE, + /* RIDE_TYPE_BOBSLEIGH_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_OBSERVATION_TOWER */ TRACK_TOWER_BASE, + /* RIDE_TYPE_LOOPING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_DINGHY_SLIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_MINE_TRAIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_CHAIRLIFT */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_MAZE */ 0, + /* RIDE_TYPE_SPIRAL_SLIDE */ 0, + /* RIDE_TYPE_GO_KARTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_LOG_FLUME */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_RIVER_RAPIDS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_TOWER_BASE | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_DODGEMS */ 0, + /* RIDE_TYPE_PIRATE_SHIP */ 0, + /* RIDE_TYPE_SWINGING_INVERTER_SHIP */ 0, + /* RIDE_TYPE_FOOD_STALL */ 0, + /* RIDE_TYPE_1D */ 0, + /* RIDE_TYPE_DRINK_STALL */ 0, + /* RIDE_TYPE_1F */ 0, + /* RIDE_TYPE_SHOP */ 0, + /* RIDE_TYPE_MERRY_GO_ROUND */ 0, + /* RIDE_TYPE_22 */ 0, + /* RIDE_TYPE_INFORMATION_KIOSK */ 0, + /* RIDE_TYPE_TOILETS */ 0, + /* RIDE_TYPE_FERRIS_WHEEL */ 0, + /* RIDE_TYPE_MOTION_SIMULATOR */ 0, + /* RIDE_TYPE_3D_CINEMA */ 0, + /* RIDE_TYPE_TOP_SPIN */ 0, + /* RIDE_TYPE_SPACE_RINGS */ 0, + /* RIDE_TYPE_REVERSE_FREEFALL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP, + /* RIDE_TYPE_LIFT */ TRACK_TOWER_BASE, + /* RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_CASH_MACHINE */ 0, + /* RIDE_TYPE_TWIST */ 0, + /* RIDE_TYPE_HAUNTED_HOUSE */ 0, + /* RIDE_TYPE_FIRST_AID */ 0, + /* RIDE_TYPE_CIRCUS_SHOW */ 0, + /* RIDE_TYPE_GHOST_TRAIN */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_TWISTER_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL | TRACK_BARREL_ROLL | TRACK_POWERED_LIFT | TRACK_HALF_LOOP_LARGE, + /* RIDE_TYPE_WOODEN_ROLLER_COASTER */ TRACK_FLAT | TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_WATER_SPLASH, + /* RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_WILD_MOUSE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HALF_LOOP | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_38 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_FLYING_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_3A */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_VIRGINIA_REEL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_SPLASH_BOATS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_S_BEND | TRACK_CURVE, + /* RIDE_TYPE_MINI_HELICOPTERS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_LAY_DOWN_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_SUSPENDED_MONORAIL */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_40 */ TRACK_STRAIGHT | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_REVERSER_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_HEARTLINE_TWISTER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_SLOPE | TRACK_SLOPE_STEEP, + /* RIDE_TYPE_MINI_GOLF */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL, + /* RIDE_TYPE_GIGA_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_ROTO_DROP */ TRACK_TOWER_BASE, + /* RIDE_TYPE_FLYING_SAUCERS */ 0, + /* RIDE_TYPE_CROOKED_HOUSE */ 0, + /* RIDE_TYPE_MONORAIL_CYCLES */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE, + /* RIDE_TYPE_COMPACT_INVERTED_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_HALF_LOOP | TRACK_CORKSCREW | TRACK_HELIX_LARGE | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_WATER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL_STEEP | TRACK_LIFT_HILL_CURVE | TRACK_FLAT_ROLL_BANKING | TRACK_CURVE | TRACK_BRAKES, + /* RIDE_TYPE_INVERTED_HAIRPIN_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_LIFT_HILL_STEEP | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_LONG | TRACK_SLOPE_CURVE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MAGIC_CARPET */ 0, + /* RIDE_TYPE_SUBMARINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL, + /* RIDE_TYPE_RIVER_RAFTS */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_S_BEND | TRACK_CURVE, + /* RIDE_TYPE_50 */ 0, + /* RIDE_TYPE_ENTERPRISE */ 0, + /* RIDE_TYPE_52 */ 0, + /* RIDE_TYPE_53 */ 0, + /* RIDE_TYPE_54 */ 0, + /* RIDE_TYPE_55 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_INVERTED_IMPULSE_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_VERTICAL, + /* RIDE_TYPE_MINI_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_MINE_RIDE */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_HELIX_SMALL | TRACK_ON_RIDE_PHOTO, + /* RIDE_TYPE_59 */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_LIFT_HILL | TRACK_FLAT_ROLL_BANKING | TRACK_SLOPE | TRACK_CURVE_VERY_SMALL | TRACK_CURVE_SMALL | TRACK_BRAKES, + /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL +}; + +static const rct_preview_track TrackBlocks000[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks001[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks002[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks003[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks004[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks005[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks006[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks007[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks008[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks009[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks010[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks011[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks012[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks013[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks014[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks015[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks016[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks017[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks018[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks019[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks020[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks021[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks022[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks023[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks024[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks025[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks026[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks027[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks028[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks029[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks030[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks031[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks032[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks033[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks034[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks035[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks036[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks037[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks038[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks039[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks040[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 2, 0 }, + { 3, -32, 0, 120, 16, 6, 0 }, + { 4, -32, -32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, -32, 120, 16, 9, 0 }, + { 7, 32, -32, 32, 96, 8, 0 }, + { 8, 0, -32, 16, 16, 63, 0 }, + { 9, -32, -32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks041[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 1, 0 }, + { 3, -32, 0, 120, 16, 9, 0 }, + { 4, -32, 32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, 32, 120, 16, 6, 0 }, + { 7, 32, 32, 32, 96, 4, 0 }, + { 8, 0, 32, 16, 16, 63, 0 }, + { 9, -32, 32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks042[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks043[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks044[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks045[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks046[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks047[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks048[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks049[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks050[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks051[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks052[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks053[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks054[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks055[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks056[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 32, 15 } +}; + +static const rct_preview_track TrackBlocks057[] = { + { 0, 0, 0, -32, 32, 15, 0 }, + { 1, -32, 0, -120, 96, 3, 0 }, + { 2, 0, 0, -136, 16, 207, 0 }, + { 3, 32, 0, -152, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks058[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks059[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks060[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 7, 0 }, + { 2, -32, -32, -80, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks061[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 11, 0 }, + { 2, -32, 32, -80, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks062[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks063[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 24, 63 } +}; + +static const rct_preview_track TrackBlocks064[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks065[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track TrackBlocks066[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks067[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 32, 0, 0, 0, 0, 3 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks068[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks069[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks070[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks071[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks072[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks073[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks074[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks075[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks076[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks077[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks078[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks079[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks080[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks081[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks082[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks083[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks084[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks085[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks086[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track TrackBlocks087[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 4, 2, 0 }, + { 3, -32, -32, 0, 4, 7, 0 }, + { 4, -32, -64, 8, 0, 11, 0 }, + { 5, 0, -64, 8, 0, 4, 1 }, + { 6, -32, -96, 8, 4, 1, 0 }, + { 7, 0, -96, 8, 4, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks088[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 4, 1, 0 }, + { 3, -32, 32, 0, 4, 11, 0 }, + { 4, -32, 64, 8, 0, 7, 0 }, + { 5, 0, 64, 8, 0, 8, 1 }, + { 6, -32, 96, 8, 4, 2, 0 }, + { 7, 0, 96, 8, 4, 7, 0 }, + { 255, 0, 0, 2048, 0, 4, 7 } +}; + +static const rct_preview_track TrackBlocks089[] = { + { 0, 0, 0, 8, 4, 7, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 0, 2, 0 }, + { 3, -32, -32, 8, 0, 7, 0 }, + { 4, -32, -64, 0, 4, 11, 0 }, + { 5, 0, -64, 0, 4, 4, 1 }, + { 6, -32, -96, 0, 0, 1, 0 }, + { 7, 0, -96, 0, 0, 11, 0 }, + { 255, 0, 0, 2048, 0, 4, 11 } +}; + +static const rct_preview_track TrackBlocks090[] = { + { 0, 0, 0, 8, 4, 11, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 0, 1, 0 }, + { 3, -32, 32, 8, 0, 11, 0 }, + { 4, -32, 64, 0, 4, 7, 0 }, + { 5, 0, 64, 0, 4, 8, 1 }, + { 6, -32, 96, 0, 0, 2, 0 }, + { 7, 0, 96, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks091[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 4, 8, 1 }, + { 5, -64, -32, 0, 4, 7, 0 }, + { 6, -64, -64, 0, 4, 15, 0 }, + { 7, -64, -96, 8, 0, 15, 0 }, + { 8, -32, -96, 8, 0, 4, 1 }, + { 9, -64, -128, 8, 0, 11, 0 }, + { 10, -32, -128, 8, 0, 14, 0 }, + { 11, 0, -128, 8, 4, 4, 1 }, + { 12, -32, -160, 8, 4, 11, 0 }, + { 13, 0, -160, 8, 4, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks092[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 4, 4, 1 }, + { 5, -64, 32, 0, 4, 11, 0 }, + { 6, -64, 64, 0, 4, 15, 0 }, + { 7, -64, 96, 8, 0, 15, 0 }, + { 8, -32, 96, 8, 0, 8, 1 }, + { 9, -64, 128, 8, 0, 7, 0 }, + { 10, -32, 128, 8, 0, 13, 0 }, + { 11, 0, 128, 8, 4, 8, 1 }, + { 12, -32, 160, 8, 4, 7, 0 }, + { 13, 0, 160, 8, 4, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track TrackBlocks093[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 4, 7, 0 }, + { 3, -32, -32, 8, 0, 13, 0 }, + { 4, -32, -64, 8, 0, 8, 1 }, + { 5, -64, -32, 8, 0, 7, 0 }, + { 6, -64, -64, 8, 0, 15, 0 }, + { 7, -64, -96, 0, 4, 15, 0 }, + { 8, -32, -96, 0, 4, 4, 1 }, + { 9, -64, -128, 0, 4, 11, 0 }, + { 10, -32, -128, 0, 0, 14, 0 }, + { 11, 0, -128, 0, 0, 4, 1 }, + { 12, -32, -160, 0, 0, 11, 0 }, + { 13, 0, -160, 0, 0, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track TrackBlocks094[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 4, 11, 0 }, + { 3, -32, 32, 8, 0, 14, 0 }, + { 4, -32, 64, 8, 0, 4, 1 }, + { 5, -64, 32, 8, 0, 11, 0 }, + { 6, -64, 64, 8, 0, 15, 0 }, + { 7, -64, 96, 0, 4, 15, 0 }, + { 8, -32, 96, 0, 4, 8, 1 }, + { 9, -64, 128, 0, 4, 7, 0 }, + { 10, -32, 128, 0, 0, 13, 0 }, + { 11, 0, 128, 0, 0, 8, 1 }, + { 12, -32, 160, 0, 0, 7, 0 }, + { 13, 0, 160, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track TrackBlocks095[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks096[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks097[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks098[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks099[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks100[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks101[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks102[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks103[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks104[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks105[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks106[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks107[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks108[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track TrackBlocks109[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks110[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks111[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks112[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks113[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks114[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks115[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks116[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks117[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 16, 15, 0 }, + { 4, -128, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks118[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 24, 15, 0 }, + { 3, -96, 0, 40, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks119[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, -32, 0, 40, 48, 15, 0 }, + { 2, -64, 0, 64, 24, 15, 0 }, + { 3, -96, 0, 80, 8, 15, 0 }, + { 255, 0, 0, 10240, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks120[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks121[] = { + { 0, 0, 0, 40, 48, 15, 0 }, + { 1, -32, 0, 16, 24, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 20480, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks122[] = { + { 0, 0, 0, 80, 8, 15, 0 }, + { 1, -32, 0, 64, 24, 15, 0 }, + { 2, -64, 0, 40, 48, 15, 0 }, + { 3, -96, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks123[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 1, -32, 0, 0, 8, 63, 0 }, + { 2, -64, 0, -32, 32, 63, 0 }, + { 3, -96, 0, -96, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks124[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 48, 15, 0 }, + { 3, -96, 0, 0, 80, 15, 0 }, + { 4, -128, 0, 0, 160, 15, 0 }, + { 5, -192, 0, 0, 208, 15, 0 }, + { 6, -160, 0, 0, 208, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks125[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks126[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks127[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks128[] = { + { 0, 0, 0, 0, 32, 207, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track TrackBlocks129[] = { + { 0, 0, 0, 0, 32, 63, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks130[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks131[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks132[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track TrackBlocks133[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks134[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks135[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks136[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks137[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks138[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks139[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks140[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks141[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks142[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track TrackBlocks143[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks144[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks145[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks146[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks147[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks148[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track TrackBlocks149[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks150[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks151[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks152[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track TrackBlocks153[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks154[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks155[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks156[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks157[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks158[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks159[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks160[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks161[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks162[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks163[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks164[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks165[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track TrackBlocks166[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks167[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track TrackBlocks168[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks169[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track TrackBlocks170[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks171[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track TrackBlocks172[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks173[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks174[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks175[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks176[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track TrackBlocks177[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track TrackBlocks178[] = { + { 0, 0, 0, 0, 0, 71, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks179[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks180[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 0, 0, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks181[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 0, 0, 43, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks182[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks183[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, -32, 120, 96, 15, 0 }, + { 5, -96, -32, 64, 192, 15, 0 }, + { 6, -64, -32, 248, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track TrackBlocks184[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, 32, 120, 96, 15, 0 }, + { 5, -96, 32, 64, 192, 15, 0 }, + { 6, -64, 32, 248, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track TrackBlocks185[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, -32, -216, 192, 15, 0 }, + { 4, 0, -32, -248, 56, 15, 0 }, + { 5, 32, -32, -264, 40, 207, 0 }, + { 6, 64, -32, -280, 24, 207, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track TrackBlocks186[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, 32, -216, 192, 15, 0 }, + { 4, 0, 32, -248, 56, 15, 0 }, + { 5, 32, 32, -264, 40, 207, 0 }, + { 6, 64, 32, -280, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks187[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks188[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks189[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks190[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks191[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track TrackBlocks192[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, -32, 0, -88, 96, 3, 0 }, + { 2, 0, 0, -104, 16, 207, 0 }, + { 3, 32, 0, -120, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks193[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks194[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks195[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 7, 0 }, + { 2, -32, -32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track TrackBlocks196[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 11, 0 }, + { 2, -32, 32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks197[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 3, 0, 0, 32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks198[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -32, 32, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 3, 0, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks199[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks200[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks201[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks202[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks203[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks204[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks205[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks206[] = { + { 0, 0, 0, 0, 16, 15, 4 }, + { 1, -32, 0, -40, 32, 15, 4 }, + { 2, -64, 0, -96, 56, 15, 4 }, + { 3, -96, 0, -96, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 0 } +}; + +static const rct_preview_track TrackBlocks207[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks208[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks209[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 8, 2, 0 }, + { 3, -32, -32, 0, 8, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track TrackBlocks210[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 0 }, + { 3, -32, 32, 0, 8, 11, 0 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks211[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks212[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track TrackBlocks213[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, 32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 32, 15, 0 }, + { 3, -32, 0, 0, 32, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track TrackBlocks214[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 208, 15 } +}; + +static const rct_preview_track TrackBlocks215[] = { + { 0, 0, 0, 0, 208, 15, 0 }, + { 1, 32, 0, 0, 208, 15, 0 }, + { 2, -32, 0, 0, 160, 15, 0 }, + { 3, -64, 0, 0, 80, 15, 0 }, + { 4, -96, 0, 0, 48, 15, 0 }, + { 5, -128, 0, 0, 32, 15, 0 }, + { 6, -160, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks216[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks217[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track TrackBlocks218[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track TrackBlocks219[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track TrackBlocks220[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track TrackBlocks221[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track TrackBlocks222[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks223[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track TrackBlocks224[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track TrackBlocks225[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks226[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks227[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks228[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track TrackBlocks229[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks230[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks231[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks232[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track TrackBlocks233[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks234[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks235[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks236[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks237[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks238[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks239[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks240[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks241[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks242[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks243[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks244[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track TrackBlocks245[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks246[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track TrackBlocks247[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks248[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track TrackBlocks249[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks250[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks251[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track TrackBlocks252[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track TrackBlocks253[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track TrackBlocks254[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 8192, 0, 56, 15 } +}; + +static const rct_preview_track TrackBlocks255[] = { + { 0, 0, 0, 32, 56, 15, 4 }, + { 1, 32, 0, 88, 32, 15, 4 }, + { 2, 64, 0, 128, 16, 15, 4 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +// rct2: 0x00994638 +const rct_preview_track *TrackBlocks[256] = { + TrackBlocks000, + TrackBlocks001, + TrackBlocks002, + TrackBlocks003, + TrackBlocks004, + TrackBlocks005, + TrackBlocks006, + TrackBlocks007, + TrackBlocks008, + TrackBlocks009, + TrackBlocks010, + TrackBlocks011, + TrackBlocks012, + TrackBlocks013, + TrackBlocks014, + TrackBlocks015, + TrackBlocks016, + TrackBlocks017, + TrackBlocks018, + TrackBlocks019, + TrackBlocks020, + TrackBlocks021, + TrackBlocks022, + TrackBlocks023, + TrackBlocks024, + TrackBlocks025, + TrackBlocks026, + TrackBlocks027, + TrackBlocks028, + TrackBlocks029, + TrackBlocks030, + TrackBlocks031, + TrackBlocks032, + TrackBlocks033, + TrackBlocks034, + TrackBlocks035, + TrackBlocks036, + TrackBlocks037, + TrackBlocks038, + TrackBlocks039, + TrackBlocks040, + TrackBlocks041, + TrackBlocks042, + TrackBlocks043, + TrackBlocks044, + TrackBlocks045, + TrackBlocks046, + TrackBlocks047, + TrackBlocks048, + TrackBlocks049, + TrackBlocks050, + TrackBlocks051, + TrackBlocks052, + TrackBlocks053, + TrackBlocks054, + TrackBlocks055, + TrackBlocks056, + TrackBlocks057, + TrackBlocks058, + TrackBlocks059, + TrackBlocks060, + TrackBlocks061, + TrackBlocks062, + TrackBlocks063, + TrackBlocks064, + TrackBlocks065, + TrackBlocks066, + TrackBlocks067, + TrackBlocks068, + TrackBlocks069, + TrackBlocks070, + TrackBlocks071, + TrackBlocks072, + TrackBlocks073, + TrackBlocks074, + TrackBlocks075, + TrackBlocks076, + TrackBlocks077, + TrackBlocks078, + TrackBlocks079, + TrackBlocks080, + TrackBlocks081, + TrackBlocks082, + TrackBlocks083, + TrackBlocks084, + TrackBlocks085, + TrackBlocks086, + TrackBlocks087, + TrackBlocks088, + TrackBlocks089, + TrackBlocks090, + TrackBlocks091, + TrackBlocks092, + TrackBlocks093, + TrackBlocks094, + TrackBlocks095, + TrackBlocks096, + TrackBlocks097, + TrackBlocks098, + TrackBlocks099, + TrackBlocks100, + TrackBlocks101, + TrackBlocks102, + TrackBlocks103, + TrackBlocks104, + TrackBlocks105, + TrackBlocks106, + TrackBlocks107, + TrackBlocks108, + TrackBlocks109, + TrackBlocks110, + TrackBlocks111, + TrackBlocks112, + TrackBlocks113, + TrackBlocks114, + TrackBlocks115, + TrackBlocks116, + TrackBlocks117, + TrackBlocks118, + TrackBlocks119, + TrackBlocks120, + TrackBlocks121, + TrackBlocks122, + TrackBlocks123, + TrackBlocks124, + TrackBlocks125, + TrackBlocks126, + TrackBlocks127, + TrackBlocks128, + TrackBlocks129, + TrackBlocks130, + TrackBlocks131, + TrackBlocks132, + TrackBlocks133, + TrackBlocks134, + TrackBlocks135, + TrackBlocks136, + TrackBlocks137, + TrackBlocks138, + TrackBlocks139, + TrackBlocks140, + TrackBlocks141, + TrackBlocks142, + TrackBlocks143, + TrackBlocks144, + TrackBlocks145, + TrackBlocks146, + TrackBlocks147, + TrackBlocks148, + TrackBlocks149, + TrackBlocks150, + TrackBlocks151, + TrackBlocks152, + TrackBlocks153, + TrackBlocks154, + TrackBlocks155, + TrackBlocks156, + TrackBlocks157, + TrackBlocks158, + TrackBlocks159, + TrackBlocks160, + TrackBlocks161, + TrackBlocks162, + TrackBlocks163, + TrackBlocks164, + TrackBlocks165, + TrackBlocks166, + TrackBlocks167, + TrackBlocks168, + TrackBlocks169, + TrackBlocks170, + TrackBlocks171, + TrackBlocks172, + TrackBlocks173, + TrackBlocks174, + TrackBlocks175, + TrackBlocks176, + TrackBlocks177, + TrackBlocks178, + TrackBlocks179, + TrackBlocks180, + TrackBlocks181, + TrackBlocks182, + TrackBlocks183, + TrackBlocks184, + TrackBlocks185, + TrackBlocks186, + TrackBlocks187, + TrackBlocks188, + TrackBlocks189, + TrackBlocks190, + TrackBlocks191, + TrackBlocks192, + TrackBlocks193, + TrackBlocks194, + TrackBlocks195, + TrackBlocks196, + TrackBlocks197, + TrackBlocks198, + TrackBlocks199, + TrackBlocks200, + TrackBlocks201, + TrackBlocks202, + TrackBlocks203, + TrackBlocks204, + TrackBlocks205, + TrackBlocks206, + TrackBlocks207, + TrackBlocks208, + TrackBlocks209, + TrackBlocks210, + TrackBlocks211, + TrackBlocks212, + TrackBlocks213, + TrackBlocks214, + TrackBlocks215, + TrackBlocks216, + TrackBlocks217, + TrackBlocks218, + TrackBlocks219, + TrackBlocks220, + TrackBlocks221, + TrackBlocks222, + TrackBlocks223, + TrackBlocks224, + TrackBlocks225, + TrackBlocks226, + TrackBlocks227, + TrackBlocks228, + TrackBlocks229, + TrackBlocks230, + TrackBlocks231, + TrackBlocks232, + TrackBlocks233, + TrackBlocks234, + TrackBlocks235, + TrackBlocks236, + TrackBlocks237, + TrackBlocks238, + TrackBlocks239, + TrackBlocks240, + TrackBlocks241, + TrackBlocks242, + TrackBlocks243, + TrackBlocks244, + TrackBlocks245, + TrackBlocks246, + TrackBlocks247, + TrackBlocks248, + TrackBlocks249, + TrackBlocks250, + TrackBlocks251, + TrackBlocks252, + TrackBlocks253, + TrackBlocks254, + TrackBlocks255 +}; + +static const rct_preview_track FlatRideTrackBlocks000[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks001[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks002[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks003[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks004[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks005[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks006[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks007[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks008[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks009[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks010[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks011[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks012[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks013[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks014[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks015[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks016[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks017[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks018[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks019[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks020[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks021[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks022[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks023[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks024[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks025[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks026[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks027[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks028[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks029[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks030[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks031[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks032[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks033[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks034[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks035[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks036[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks037[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks038[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks039[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks040[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 2, 0 }, + { 3, -32, 0, 120, 16, 6, 0 }, + { 4, -32, -32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, -32, 120, 16, 9, 0 }, + { 7, 32, -32, 32, 96, 8, 0 }, + { 8, 0, -32, 16, 16, 63, 0 }, + { 9, -32, -32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks041[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 1, 0 }, + { 3, -32, 0, 120, 16, 9, 0 }, + { 4, -32, 32, 120, 0, 0, 0 }, + { 5, 0, 0, 120, 0, 0, 0 }, + { 6, 0, 32, 120, 16, 6, 0 }, + { 7, 32, 32, 32, 96, 4, 0 }, + { 8, 0, 32, 16, 16, 63, 0 }, + { 9, -32, 32, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks042[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks043[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks044[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks045[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks046[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks047[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks048[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks049[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks050[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks051[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks052[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks053[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks054[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks055[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks056[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks057[] = { + { 0, 0, 0, -32, 32, 15, 0 }, + { 1, -32, 0, -120, 96, 3, 0 }, + { 2, 0, 0, -136, 16, 207, 0 }, + { 3, 32, 0, -152, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks058[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks059[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks060[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 7, 0 }, + { 2, -32, -32, -80, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks061[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -56, 32, 11, 0 }, + { 2, -32, 32, -80, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks062[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks063[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 24, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks064[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks065[] = { + { 0, 0, 0, 0, 24, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks066[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks067[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 32, 0, 0, 0, 0, 3 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks068[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks069[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks070[] = { + { 0, 0, 0, 0, 64, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks071[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks072[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks073[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks074[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks075[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks076[] = { + { 0, 0, 0, 0, 64, 63, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks077[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks078[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks079[] = { + { 0, 0, 0, 0, 32, 63, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks080[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks081[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks082[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks083[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 7, 0 }, + { 2, -32, -32, 0, 0, 13, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks084[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 11, 0 }, + { 2, -32, 32, 0, 0, 14, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks085[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 2, 0 }, + { 3, -32, -32, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks086[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 0 }, + { 3, -32, 32, 0, 0, 11, 0 }, + { 255, 0, 0, 0, 0, 16, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks087[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 4, 2, 0 }, + { 3, -32, -32, 0, 4, 7, 0 }, + { 4, -32, -64, 8, 0, 11, 0 }, + { 5, 0, -64, 8, 0, 4, 1 }, + { 6, -32, -96, 8, 4, 1, 0 }, + { 7, 0, -96, 8, 4, 11, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks088[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 4, 1, 0 }, + { 3, -32, 32, 0, 4, 11, 0 }, + { 4, -32, 64, 8, 0, 7, 0 }, + { 5, 0, 64, 8, 0, 8, 1 }, + { 6, -32, 96, 8, 4, 2, 0 }, + { 7, 0, 96, 8, 4, 7, 0 }, + { 255, 0, 0, 2048, 0, 4, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks089[] = { + { 0, 0, 0, 8, 4, 7, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 0, 2, 0 }, + { 3, -32, -32, 8, 0, 7, 0 }, + { 4, -32, -64, 0, 4, 11, 0 }, + { 5, 0, -64, 0, 4, 4, 1 }, + { 6, -32, -96, 0, 0, 1, 0 }, + { 7, 0, -96, 0, 0, 11, 0 }, + { 255, 0, 0, 2048, 0, 4, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks090[] = { + { 0, 0, 0, 8, 4, 11, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 0, 1, 0 }, + { 3, -32, 32, 8, 0, 11, 0 }, + { 4, -32, 64, 0, 4, 7, 0 }, + { 5, 0, 64, 0, 4, 8, 1 }, + { 6, -32, 96, 0, 0, 2, 0 }, + { 7, 0, 96, 0, 0, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks091[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 4, 8, 1 }, + { 5, -64, -32, 0, 4, 7, 0 }, + { 6, -64, -64, 0, 4, 15, 0 }, + { 7, -64, -96, 8, 0, 15, 0 }, + { 8, -32, -96, 8, 0, 4, 1 }, + { 9, -64, -128, 8, 0, 11, 0 }, + { 10, -32, -128, 8, 0, 14, 0 }, + { 11, 0, -128, 8, 4, 4, 1 }, + { 12, -32, -160, 8, 4, 11, 0 }, + { 13, 0, -160, 8, 4, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks092[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 4, 4, 1 }, + { 5, -64, 32, 0, 4, 11, 0 }, + { 6, -64, 64, 0, 4, 15, 0 }, + { 7, -64, 96, 8, 0, 15, 0 }, + { 8, -32, 96, 8, 0, 8, 1 }, + { 9, -64, 128, 8, 0, 7, 0 }, + { 10, -32, 128, 8, 0, 13, 0 }, + { 11, 0, 128, 8, 4, 8, 1 }, + { 12, -32, 160, 8, 4, 7, 0 }, + { 13, 0, 160, 8, 4, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks093[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, -32, 8, 4, 8, 1 }, + { 2, -32, 0, 8, 4, 7, 0 }, + { 3, -32, -32, 8, 0, 13, 0 }, + { 4, -32, -64, 8, 0, 8, 1 }, + { 5, -64, -32, 8, 0, 7, 0 }, + { 6, -64, -64, 8, 0, 15, 0 }, + { 7, -64, -96, 0, 4, 15, 0 }, + { 8, -32, -96, 0, 4, 4, 1 }, + { 9, -64, -128, 0, 4, 11, 0 }, + { 10, -32, -128, 0, 0, 14, 0 }, + { 11, 0, -128, 0, 0, 4, 1 }, + { 12, -32, -160, 0, 0, 11, 0 }, + { 13, 0, -160, 0, 0, 15, 0 }, + { 255, 0, 0, 2048, 0, 4, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks094[] = { + { 0, 0, 0, 8, 4, 15, 0 }, + { 1, 0, 32, 8, 4, 4, 1 }, + { 2, -32, 0, 8, 4, 11, 0 }, + { 3, -32, 32, 8, 0, 14, 0 }, + { 4, -32, 64, 8, 0, 4, 1 }, + { 5, -64, 32, 8, 0, 11, 0 }, + { 6, -64, 64, 8, 0, 15, 0 }, + { 7, -64, 96, 0, 4, 15, 0 }, + { 8, -32, 96, 0, 4, 8, 1 }, + { 9, -64, 128, 0, 4, 7, 0 }, + { 10, -32, 128, 0, 0, 13, 0 }, + { 11, 0, 128, 0, 0, 8, 1 }, + { 12, -32, 160, 0, 0, 7, 0 }, + { 13, 0, 160, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 64, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks095[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks096[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks097[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks098[] = { + { 0, 0, 0, 0, 64, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks099[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks100[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks101[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks102[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks103[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks104[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks105[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks106[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 0, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 12, 8, 1 }, + { 5, -64, -32, 0, 12, 7, 0 }, + { 6, -64, -64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks107[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 12, 4, 1 }, + { 5, -64, 32, 0, 12, 11, 0 }, + { 6, -64, 64, 0, 12, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks108[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, -32, 0, 12, 8, 1 }, + { 2, -32, 0, 0, 12, 7, 0 }, + { 3, -32, -32, 0, 0, 13, 0 }, + { 4, -32, -64, 0, 0, 8, 1 }, + { 5, -64, -32, 0, 0, 7, 0 }, + { 6, -64, -64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 12, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks109[] = { + { 0, 0, 0, 0, 12, 15, 0 }, + { 1, 0, 32, 0, 12, 4, 1 }, + { 2, -32, 0, 0, 12, 11, 0 }, + { 3, -32, 32, 0, 0, 14, 0 }, + { 4, -32, 64, 0, 0, 4, 1 }, + { 5, -64, 32, 0, 0, 11, 0 }, + { 6, -64, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks110[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 32, 0, 0, 0, 15, 0 }, + { 3, 32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks111[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 0, 64, 0, 0, 15, 0 }, + { 3, 0, 96, 0, 0, 15, 0 }, + { 4, 32, 0, 0, 0, 15, 0 }, + { 5, 32, 32, 0, 0, 15, 0 }, + { 6, 32, 64, 0, 0, 15, 0 }, + { 7, 32, 96, 0, 0, 15, 0 }, + { 8, 64, 0, 0, 0, 15, 0 }, + { 9, 64, 32, 0, 0, 15, 0 }, + { 10, 64, 64, 0, 0, 15, 0 }, + { 11, 64, 96, 0, 0, 15, 0 }, + { 12, 96, 0, 0, 0, 15, 0 }, + { 13, 96, 32, 0, 0, 15, 0 }, + { 14, 96, 64, 0, 0, 15, 0 }, + { 15, 96, 96, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks112[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks113[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks114[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks115[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, 0, 64, 0, 0, 15, 0 }, + { 3, 0, 96, 0, 0, 15, 0 }, + { 4, 32, 0, 0, 0, 15, 0 }, + { 5, 32, 32, 0, 0, 15, 0 }, + { 6, 32, 64, 0, 0, 15, 0 }, + { 7, 32, 96, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks116[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 0 }, + { 4, 64, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks117[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 3, -96, 0, 0, 16, 15, 0 }, + { 4, -128, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks118[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks119[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks120[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks121[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks122[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -64, 0, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks123[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, -32, 0, 0, 15, 0 }, + { 2, -32, 0, 0, 0, 15, 0 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, 0, -32, 0, 0, 15, 0 }, + { 5, 0, 32, 0, 0, 15, 0 }, + { 6, 32, -32, 0, 0, 15, 0 }, + { 7, 32, 32, 0, 0, 15, 0 }, + { 8, 32, 0, 0, 0, 15, 2 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks124[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 48, 15, 0 }, + { 3, -96, 0, 0, 80, 15, 0 }, + { 4, -128, 0, 0, 160, 15, 0 }, + { 5, -192, 0, 0, 208, 15, 0 }, + { 6, -160, 0, 0, 208, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks125[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks126[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks127[] = { + { 0, 0, 0, 0, 8, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks128[] = { + { 0, 0, 0, 0, 32, 207, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 32, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks129[] = { + { 0, 0, 0, 0, 32, 63, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks130[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks131[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks132[] = { + { 0, 0, 0, 0, 24, 63, 0 }, + { 255, 0, 0, 0, 0, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks133[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks134[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks135[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks136[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks137[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 8, 0 }, + { 3, -64, 0, 0, 0, 2, 1 }, + { 4, -64, -32, 0, 0, 1, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks138[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 4, 0 }, + { 3, -64, 0, 0, 0, 1, 1 }, + { 4, -64, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks139[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, -32, 0, 0, 0, 1, 0 }, + { 2, 0, 32, 0, 0, 4, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -64, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks140[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 0 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 15, 0 }, + { 4, -32, 64, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks141[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks142[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks143[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks144[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks145[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks146[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks147[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks148[] = { + { 0, 0, 0, 0, 16, 13, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 1 }, + { 3, -32, 32, 0, 16, 2, 0 }, + { 255, 0, 0, 0, 0, 64, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks149[] = { + { 0, 0, 0, 0, 64, 13, 0 }, + { 1, 0, 32, 0, 64, 4, 1 }, + { 2, -32, 0, 0, 64, 1, 1 }, + { 3, -32, 32, 0, 64, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks150[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks151[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks152[] = { + { 0, 0, 0, 0, 32, 13, 0 }, + { 1, 0, 32, 0, 32, 4, 1 }, + { 2, -32, 0, 0, 32, 1, 1 }, + { 3, -32, 32, 0, 32, 2, 0 }, + { 255, 0, 0, 0, 0, 8, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks153[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks154[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks155[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks156[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks157[] = { + { 0, 0, 0, 0, 24, 13, 0 }, + { 1, 0, 32, 0, 24, 4, 1 }, + { 2, -32, 0, 0, 24, 1, 1 }, + { 3, -32, 32, 0, 24, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks158[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks159[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks160[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks161[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks162[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks163[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks164[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks165[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 16, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks166[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks167[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 32, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks168[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks169[] = { + { 0, 0, 0, 0, 8, 13, 0 }, + { 1, 0, 32, 0, 8, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 1 }, + { 3, -32, 32, 0, 8, 2, 0 }, + { 255, 0, 0, 0, 0, 24, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks170[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks171[] = { + { 0, 0, 0, 0, 0, 13, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 0, 1, 1 }, + { 3, -32, 32, 0, 0, 2, 0 }, + { 255, 0, 0, 0, 0, 0, 13 } +}; + +static const rct_preview_track FlatRideTrackBlocks172[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks173[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks174[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks175[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 0, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks176[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks177[] = { + { 0, 0, 0, -32, 16, 15, 0 }, + { 1, -32, 0, -32, 16, 15, 0 }, + { 2, -64, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 71 } +}; + +static const rct_preview_track FlatRideTrackBlocks178[] = { + { 0, 0, 0, 0, 0, 71, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks179[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks180[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 0, 16, 8, 1 }, + { 2, -32, 0, 0, 16, 2, 0 }, + { 3, -32, -32, 0, 0, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks181[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 0, 16, 4, 1 }, + { 2, -32, 0, 0, 16, 1, 0 }, + { 3, -32, 32, 0, 0, 43, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks182[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks183[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, -32, 120, 96, 15, 0 }, + { 5, -96, -32, 64, 192, 15, 0 }, + { 6, -64, -32, 248, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 24, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks184[] = { + { 0, 0, 0, 0, 24, 207, 0 }, + { 1, -32, 0, 16, 40, 207, 0 }, + { 2, -64, 0, 32, 56, 15, 0 }, + { 3, -96, 0, 64, 192, 15, 0 }, + { 4, -128, 32, 120, 96, 15, 0 }, + { 5, -96, 32, 64, 192, 15, 0 }, + { 6, -64, 32, 248, 16, 15, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks185[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, -32, -216, 192, 15, 0 }, + { 4, 0, -32, -248, 56, 15, 0 }, + { 5, 32, -32, -264, 40, 207, 0 }, + { 6, 64, -32, -280, 24, 207, 0 }, + { 255, 0, 0, -8192, 255, 24, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks186[] = { + { 0, 0, 0, -32, 24, 15, 0 }, + { 1, -32, 0, -216, 192, 15, 0 }, + { 2, -64, 0, -160, 96, 15, 0 }, + { 3, -32, 32, -216, 192, 15, 0 }, + { 4, 0, 32, -248, 56, 15, 0 }, + { 5, 32, 32, -264, 40, 207, 0 }, + { 6, 64, 32, -280, 24, 207, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks187[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks188[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -16, 16, 15, 0 }, + { 2, -64, 0, -16, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks189[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks190[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 0, 16, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks191[] = { + { 0, 0, 0, 0, 32, 207, 0 }, + { 1, -32, 0, 16, 16, 207, 0 }, + { 2, -64, 0, 32, 96, 3, 0 }, + { 3, -32, 0, 120, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks192[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, -32, 0, -88, 96, 3, 0 }, + { 2, 0, 0, -104, 16, 207, 0 }, + { 3, 32, 0, -120, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks193[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 7, 0 }, + { 2, -32, -32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks194[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, 24, 32, 11, 0 }, + { 2, -32, 32, 48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks195[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 7, 0 }, + { 2, -32, -32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks196[] = { + { 0, 0, 0, 0, 16, 15, 0 }, + { 1, -32, 0, -24, 32, 11, 0 }, + { 2, -32, 32, -48, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks197[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 16, 0, 15, 0 }, + { 3, 0, 0, 32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks198[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, -32, 32, 15, 0 }, + { 2, -64, 0, -16, 0, 15, 0 }, + { 3, 0, 0, -32, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks199[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks200[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -64, 0, 0, 0, 15, 0 }, + { 3, -96, 0, 0, 0, 15, 0 }, + { 4, -128, 0, 0, 0, 15, 0 }, + { 5, -160, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks201[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks202[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks203[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks204[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks205[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, -32, 0, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks206[] = { + { 0, 0, 0, 0, 16, 15, 4 }, + { 1, -32, 0, -40, 32, 15, 4 }, + { 2, -64, 0, -96, 56, 15, 4 }, + { 3, -96, 0, -96, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 0, 0 } +}; + +static const rct_preview_track FlatRideTrackBlocks207[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks208[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks209[] = { + { 0, 0, 0, 0, 0, 7, 0 }, + { 1, 0, -32, 0, 0, 8, 1 }, + { 2, -32, 0, 0, 8, 2, 0 }, + { 3, -32, -32, 0, 8, 7, 0 }, + { 255, 0, 0, 0, 0, 0, 11 } +}; + +static const rct_preview_track FlatRideTrackBlocks210[] = { + { 0, 0, 0, 0, 0, 11, 0 }, + { 1, 0, 32, 0, 0, 4, 1 }, + { 2, -32, 0, 0, 8, 1, 0 }, + { 3, -32, 32, 0, 8, 11, 0 }, + { 255, 0, 0, 0, 0, 56, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks211[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, -32, 0, 0, 15, 0 }, + { 2, -32, -32, 0, 0, 15, 0 }, + { 3, -64, -32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks212[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 1, 0, 32, 0, 0, 15, 0 }, + { 2, -32, 32, 0, 0, 15, 0 }, + { 3, -64, 32, 0, 0, 15, 0 }, + { 4, -32, 0, 0, 0, 15, 0 }, + { 5, -64, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 32, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks213[] = { + { 0, 0, 0, 0, 32, 15, 0 }, + { 1, 32, 0, 0, 32, 15, 0 }, + { 2, -64, 0, 0, 32, 15, 0 }, + { 3, -32, 0, 0, 32, 15, 0 }, + { 255, 0, 0, 0, 0, 48, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks214[] = { + { 0, 0, 0, 0, 48, 15, 0 }, + { 1, 32, 0, 0, 48, 15, 0 }, + { 255, 0, 0, 0, 0, 208, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks215[] = { + { 0, 0, 0, 0, 208, 15, 0 }, + { 1, 32, 0, 0, 208, 15, 0 }, + { 2, -32, 0, 0, 160, 15, 0 }, + { 3, -64, 0, 0, 80, 15, 0 }, + { 4, -96, 0, 0, 48, 15, 0 }, + { 5, -128, 0, 0, 32, 15, 0 }, + { 6, -160, 0, 0, 16, 15, 0 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks216[] = { + { 0, 0, 0, 0, 0, 15, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks217[] = { + { 0, 0, 0, 0, 16, 71, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 16, 16, 103, 0 }, + { 255, 0, 0, 0, 0, 16, 139 } +}; + +static const rct_preview_track FlatRideTrackBlocks218[] = { + { 0, 0, 0, 0, 16, 139, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 16, 16, 155, 0 }, + { 255, 0, 0, 4096, 0, 16, 55 } +}; + +static const rct_preview_track FlatRideTrackBlocks219[] = { + { 0, 0, 0, 16, 16, 55, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 0, 2, 0 }, + { 3, -32, -32, 0, 16, 23, 0 }, + { 255, 0, 0, 4096, 0, 16, 59 } +}; + +static const rct_preview_track FlatRideTrackBlocks220[] = { + { 0, 0, 0, 16, 16, 59, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 0, 1, 0 }, + { 3, -32, 32, 0, 16, 43, 0 }, + { 255, 0, 0, 0, 0, 0, 7 } +}; + +static const rct_preview_track FlatRideTrackBlocks221[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, -32, 16, 0, 8, 1 }, + { 2, -32, 0, 16, 16, 71, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 48, 0, 8, 1 }, + { 5, -64, -32, 32, 16, 71, 0 }, + { 6, -64, -64, 48, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 16, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks222[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 1, 0, 32, 16, 0, 4, 1 }, + { 2, -32, 0, 16, 16, 139, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 48, 0, 4, 1 }, + { 5, -64, 32, 32, 16, 139, 0 }, + { 6, -64, 64, 48, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks223[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, -32, 48, 0, 8, 1 }, + { 2, -32, 0, 32, 16, 23, 0 }, + { 3, -32, -32, 24, 16, 13, 0 }, + { 4, -32, -64, 16, 0, 8, 1 }, + { 5, -64, -32, 16, 16, 23, 0 }, + { 6, -64, -64, 0, 16, 159, 0 }, + { 255, 0, 0, 12288, 0, 16, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks224[] = { + { 0, 0, 0, 48, 16, 63, 0 }, + { 1, 0, 32, 48, 0, 4, 1 }, + { 2, -32, 0, 32, 16, 43, 0 }, + { 3, -32, 32, 24, 16, 14, 0 }, + { 4, -32, 64, 16, 0, 4, 1 }, + { 5, -64, 32, 16, 16, 43, 0 }, + { 6, -64, 64, 0, 16, 111, 0 }, + { 255, 0, 0, 0, 0, 0, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks225[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks226[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks227[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks228[] = { + { 0, 0, 0, 0, 16, 207, 0 }, + { 255, 0, 0, 0, 0, 64, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks229[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks230[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks231[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks232[] = { + { 0, 0, 0, 0, 16, 63, 0 }, + { 255, 0, 0, 0, 0, 64, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks233[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks234[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks235[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks236[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks237[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks238[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks239[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks240[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks241[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks242[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks243[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks244[] = { + { 0, 0, 0, 0, 8, 207, 0 }, + { 255, 0, 0, 0, 0, 8, 63 } +}; + +static const rct_preview_track FlatRideTrackBlocks245[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks246[] = { + { 0, 0, 0, 0, 8, 63, 0 }, + { 255, 0, 0, 0, 0, 32, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks247[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks248[] = { + { 0, 0, 0, 0, 8, 15, 0 }, + { 255, 0, 0, 0, 0, 8, 207 } +}; + +static const rct_preview_track FlatRideTrackBlocks249[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks250[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks251[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, 32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 72, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks252[] = { + { 0, 0, 0, 0, 72, 15, 4 }, + { 1, 0, -32, 0, 0, 0, 5 }, + { 255, 0, 0, 0, 0, 8, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks253[] = { + { 0, 0, 0, 0, 56, 15, 4 }, + { 1, 32, 0, 56, 32, 15, 4 }, + { 2, 64, 0, 96, 16, 15, 4 }, + { 255, 0, 0, -8192, 255, 16, 15 } +}; + +static const rct_preview_track FlatRideTrackBlocks254[] = { + { 0, 0, 0, -32, 16, 15, 4 }, + { 1, -32, 0, -72, 32, 15, 4 }, + { 2, -64, 0, -128, 56, 15, 4 }, + { 3, -96, 0, -128, 0, 0, 5 }, + { 255, 0, 0, 8192, 0, 56, 15 } +}; + +// rct2: 0x00994A38 +const rct_preview_track *FlatRideTrackBlocks[255] = { + FlatRideTrackBlocks000, + FlatRideTrackBlocks001, + FlatRideTrackBlocks002, + FlatRideTrackBlocks003, + FlatRideTrackBlocks004, + FlatRideTrackBlocks005, + FlatRideTrackBlocks006, + FlatRideTrackBlocks007, + FlatRideTrackBlocks008, + FlatRideTrackBlocks009, + FlatRideTrackBlocks010, + FlatRideTrackBlocks011, + FlatRideTrackBlocks012, + FlatRideTrackBlocks013, + FlatRideTrackBlocks014, + FlatRideTrackBlocks015, + FlatRideTrackBlocks016, + FlatRideTrackBlocks017, + FlatRideTrackBlocks018, + FlatRideTrackBlocks019, + FlatRideTrackBlocks020, + FlatRideTrackBlocks021, + FlatRideTrackBlocks022, + FlatRideTrackBlocks023, + FlatRideTrackBlocks024, + FlatRideTrackBlocks025, + FlatRideTrackBlocks026, + FlatRideTrackBlocks027, + FlatRideTrackBlocks028, + FlatRideTrackBlocks029, + FlatRideTrackBlocks030, + FlatRideTrackBlocks031, + FlatRideTrackBlocks032, + FlatRideTrackBlocks033, + FlatRideTrackBlocks034, + FlatRideTrackBlocks035, + FlatRideTrackBlocks036, + FlatRideTrackBlocks037, + FlatRideTrackBlocks038, + FlatRideTrackBlocks039, + FlatRideTrackBlocks040, + FlatRideTrackBlocks041, + FlatRideTrackBlocks042, + FlatRideTrackBlocks043, + FlatRideTrackBlocks044, + FlatRideTrackBlocks045, + FlatRideTrackBlocks046, + FlatRideTrackBlocks047, + FlatRideTrackBlocks048, + FlatRideTrackBlocks049, + FlatRideTrackBlocks050, + FlatRideTrackBlocks051, + FlatRideTrackBlocks052, + FlatRideTrackBlocks053, + FlatRideTrackBlocks054, + FlatRideTrackBlocks055, + FlatRideTrackBlocks056, + FlatRideTrackBlocks057, + FlatRideTrackBlocks058, + FlatRideTrackBlocks059, + FlatRideTrackBlocks060, + FlatRideTrackBlocks061, + FlatRideTrackBlocks062, + FlatRideTrackBlocks063, + FlatRideTrackBlocks064, + FlatRideTrackBlocks065, + FlatRideTrackBlocks066, + FlatRideTrackBlocks067, + FlatRideTrackBlocks068, + FlatRideTrackBlocks069, + FlatRideTrackBlocks070, + FlatRideTrackBlocks071, + FlatRideTrackBlocks072, + FlatRideTrackBlocks073, + FlatRideTrackBlocks074, + FlatRideTrackBlocks075, + FlatRideTrackBlocks076, + FlatRideTrackBlocks077, + FlatRideTrackBlocks078, + FlatRideTrackBlocks079, + FlatRideTrackBlocks080, + FlatRideTrackBlocks081, + FlatRideTrackBlocks082, + FlatRideTrackBlocks083, + FlatRideTrackBlocks084, + FlatRideTrackBlocks085, + FlatRideTrackBlocks086, + FlatRideTrackBlocks087, + FlatRideTrackBlocks088, + FlatRideTrackBlocks089, + FlatRideTrackBlocks090, + FlatRideTrackBlocks091, + FlatRideTrackBlocks092, + FlatRideTrackBlocks093, + FlatRideTrackBlocks094, + FlatRideTrackBlocks095, + FlatRideTrackBlocks096, + FlatRideTrackBlocks097, + FlatRideTrackBlocks098, + FlatRideTrackBlocks099, + FlatRideTrackBlocks100, + FlatRideTrackBlocks101, + FlatRideTrackBlocks102, + FlatRideTrackBlocks103, + FlatRideTrackBlocks104, + FlatRideTrackBlocks105, + FlatRideTrackBlocks106, + FlatRideTrackBlocks107, + FlatRideTrackBlocks108, + FlatRideTrackBlocks109, + FlatRideTrackBlocks110, + FlatRideTrackBlocks111, + FlatRideTrackBlocks112, + FlatRideTrackBlocks113, + FlatRideTrackBlocks114, + FlatRideTrackBlocks115, + FlatRideTrackBlocks116, + FlatRideTrackBlocks117, + FlatRideTrackBlocks118, + FlatRideTrackBlocks119, + FlatRideTrackBlocks120, + FlatRideTrackBlocks121, + FlatRideTrackBlocks122, + FlatRideTrackBlocks123, + FlatRideTrackBlocks124, + FlatRideTrackBlocks125, + FlatRideTrackBlocks126, + FlatRideTrackBlocks127, + FlatRideTrackBlocks128, + FlatRideTrackBlocks129, + FlatRideTrackBlocks130, + FlatRideTrackBlocks131, + FlatRideTrackBlocks132, + FlatRideTrackBlocks133, + FlatRideTrackBlocks134, + FlatRideTrackBlocks135, + FlatRideTrackBlocks136, + FlatRideTrackBlocks137, + FlatRideTrackBlocks138, + FlatRideTrackBlocks139, + FlatRideTrackBlocks140, + FlatRideTrackBlocks141, + FlatRideTrackBlocks142, + FlatRideTrackBlocks143, + FlatRideTrackBlocks144, + FlatRideTrackBlocks145, + FlatRideTrackBlocks146, + FlatRideTrackBlocks147, + FlatRideTrackBlocks148, + FlatRideTrackBlocks149, + FlatRideTrackBlocks150, + FlatRideTrackBlocks151, + FlatRideTrackBlocks152, + FlatRideTrackBlocks153, + FlatRideTrackBlocks154, + FlatRideTrackBlocks155, + FlatRideTrackBlocks156, + FlatRideTrackBlocks157, + FlatRideTrackBlocks158, + FlatRideTrackBlocks159, + FlatRideTrackBlocks160, + FlatRideTrackBlocks161, + FlatRideTrackBlocks162, + FlatRideTrackBlocks163, + FlatRideTrackBlocks164, + FlatRideTrackBlocks165, + FlatRideTrackBlocks166, + FlatRideTrackBlocks167, + FlatRideTrackBlocks168, + FlatRideTrackBlocks169, + FlatRideTrackBlocks170, + FlatRideTrackBlocks171, + FlatRideTrackBlocks172, + FlatRideTrackBlocks173, + FlatRideTrackBlocks174, + FlatRideTrackBlocks175, + FlatRideTrackBlocks176, + FlatRideTrackBlocks177, + FlatRideTrackBlocks178, + FlatRideTrackBlocks179, + FlatRideTrackBlocks180, + FlatRideTrackBlocks181, + FlatRideTrackBlocks182, + FlatRideTrackBlocks183, + FlatRideTrackBlocks184, + FlatRideTrackBlocks185, + FlatRideTrackBlocks186, + FlatRideTrackBlocks187, + FlatRideTrackBlocks188, + FlatRideTrackBlocks189, + FlatRideTrackBlocks190, + FlatRideTrackBlocks191, + FlatRideTrackBlocks192, + FlatRideTrackBlocks193, + FlatRideTrackBlocks194, + FlatRideTrackBlocks195, + FlatRideTrackBlocks196, + FlatRideTrackBlocks197, + FlatRideTrackBlocks198, + FlatRideTrackBlocks199, + FlatRideTrackBlocks200, + FlatRideTrackBlocks201, + FlatRideTrackBlocks202, + FlatRideTrackBlocks203, + FlatRideTrackBlocks204, + FlatRideTrackBlocks205, + FlatRideTrackBlocks206, + FlatRideTrackBlocks207, + FlatRideTrackBlocks208, + FlatRideTrackBlocks209, + FlatRideTrackBlocks210, + FlatRideTrackBlocks211, + FlatRideTrackBlocks212, + FlatRideTrackBlocks213, + FlatRideTrackBlocks214, + FlatRideTrackBlocks215, + FlatRideTrackBlocks216, + FlatRideTrackBlocks217, + FlatRideTrackBlocks218, + FlatRideTrackBlocks219, + FlatRideTrackBlocks220, + FlatRideTrackBlocks221, + FlatRideTrackBlocks222, + FlatRideTrackBlocks223, + FlatRideTrackBlocks224, + FlatRideTrackBlocks225, + FlatRideTrackBlocks226, + FlatRideTrackBlocks227, + FlatRideTrackBlocks228, + FlatRideTrackBlocks229, + FlatRideTrackBlocks230, + FlatRideTrackBlocks231, + FlatRideTrackBlocks232, + FlatRideTrackBlocks233, + FlatRideTrackBlocks234, + FlatRideTrackBlocks235, + FlatRideTrackBlocks236, + FlatRideTrackBlocks237, + FlatRideTrackBlocks238, + FlatRideTrackBlocks239, + FlatRideTrackBlocks240, + FlatRideTrackBlocks241, + FlatRideTrackBlocks242, + FlatRideTrackBlocks243, + FlatRideTrackBlocks244, + FlatRideTrackBlocks245, + FlatRideTrackBlocks246, + FlatRideTrackBlocks247, + FlatRideTrackBlocks248, + FlatRideTrackBlocks249, + FlatRideTrackBlocks250, + FlatRideTrackBlocks251, + FlatRideTrackBlocks252, + FlatRideTrackBlocks253, + FlatRideTrackBlocks254 +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index c10ad9bd3d..e4da7a149f 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ + #include "../common.h" /* size 0x0A */ @@ -30,4 +31,8 @@ typedef struct{ }rct_track_coordinates; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 -extern const rct_track_coordinates TrackCoordinates[256]; \ No newline at end of file +extern const rct_track_coordinates TrackCoordinates[256]; + +extern const uint64 RideTypePossibleTrackConfigurations[91]; +extern const rct_preview_track *TrackBlocks[256]; +extern const rct_preview_track *FlatRideTrackBlocks[255]; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ae22b6fff6..1149e47c0a 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1727,7 +1727,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); + const rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); z = (mapElement->base_height * 8) - trackBlock->z; gotoStartPlacementMode = true; } @@ -2066,13 +2066,13 @@ static void window_ride_construction_draw_track_piece( int rideIndex, int trackType, int trackDirection, int unknown, int width, int height ) { - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; rct_ride *ride; ride = GET_RIDE(rideIndex); trackBlock = get_track_def_from_ride(ride, trackType); - while ((trackBlock + 1)->var_00 != 0xFF) + while ((trackBlock + 1)->index != 0xFF) trackBlock++; short x = trackBlock->x; @@ -2157,7 +2157,7 @@ static void sub_6CBCE2( int originX, int originY, int originZ ) { rct_ride *ride; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; int preserve_word_141E9E4; int x, y, baseZ, clearanceZ, offsetX, offsetY; uint64 preserve_map_size_vars; @@ -2179,7 +2179,7 @@ static void sub_6CBCE2( RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAX_XY, uint16) = (256 * 32) - 1; trackBlock = get_track_def_from_ride(ride, trackType); - while (trackBlock->var_00 != 255) { + while (trackBlock->index != 255) { int bl = trackBlock->var_08; int bh; switch (trackDirection) { @@ -2244,7 +2244,7 @@ static void sub_6CBCE2( _tempTrackMapElement.base_height = baseZ; _tempTrackMapElement.clearance_height = clearanceZ; _tempTrackMapElement.properties.track.type = trackType; - _tempTrackMapElement.properties.track.sequence = trackBlock->var_00; + _tempTrackMapElement.properties.track.sequence = trackBlock->index; _tempTrackMapElement.properties.track.colour = (edx & 0x20000 ? 4 : 0); _tempTrackMapElement.properties.track.ride_index = rideIndex; @@ -3072,13 +3072,13 @@ static void window_ride_construction_update_widgets(rct_window *w) static void window_ride_construction_select_map_tiles(rct_ride *ride, int trackType, int trackDirection, int x, int y) { - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; int offsetX, offsetY; trackBlock = get_track_def_from_ride(ride, trackType); trackDirection &= 3; int selectionTileIndex = 0; - while (trackBlock->var_00 != 255) { + while (trackBlock->index != 255) { switch (trackDirection) { case 0: offsetX = trackBlock->x; @@ -3202,7 +3202,7 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) { int x, y, z, highestZ; rct_ride *ride; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; map_invalidate_map_selection_tiles(); RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 | 2 | 4); @@ -3268,7 +3268,7 @@ static void ride_construction_toolupdate_construct(int screenX, int screenY) do { bx = min(bx, trackBlock->z); trackBlock++; - } while (trackBlock->var_00 != 255); + } while (trackBlock->index != 255); z -= bx; RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_Z, uint16) = z; @@ -3407,12 +3407,12 @@ static void ride_construction_tooldown_construct(int screenX, int screenY) rct_ride *ride = GET_RIDE(_currentRideIndex); if (RCT2_GLOBAL(0x00F44163, uint16) == 0) { - rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); + const rct_preview_track *trackBlock = get_track_def_from_ride(ride, _currentTrackPieceType); int bx = 0; do { bx = min(bx, trackBlock->z); trackBlock++; - } while (trackBlock->var_00 != 255); + } while (trackBlock->index != 255); z -= bx; z -= 16; } else { diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 7e19dba052..c204bff517 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -130,7 +130,7 @@ static void window_track_place_draw_mini_preview() int i, rotation, pass, x, y, pixelX, pixelY, originX, originY, minX, minY, maxX, maxY; rct_maze_element *mazeElement; rct_track_element *trackElement; - rct_preview_track *trackBlock; + const rct_preview_track *trackBlock; window_track_place_clear_mini_preview(); @@ -163,8 +163,8 @@ static void window_track_place_draw_mini_preview() colour = RCT2_ADDRESS(0x0099BA64, uint8)[trackType * 16] & 0x10 ? 222 : 218; // Follow a single track piece shape - trackBlock = RCT2_ADDRESS(0x00994638, rct_preview_track*)[trackType]; - while (trackBlock->var_00 != 255) { + trackBlock = TrackBlocks[trackType]; + while (trackBlock->index != 255) { x = originX; y = originY; From 2e1c449e915b9dad3c352e575a758cb86c2c82fd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 22:58:03 +0100 Subject: [PATCH 13/16] use TRACK_BLOCK_END instead of random 255 arrays --- src/ride/track_data.c | 1024 +++++++++++++++++++++-------------------- 1 file changed, 513 insertions(+), 511 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index f6fda77678..5a3759230b 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -375,84 +375,86 @@ const uint64 RideTypePossibleTrackConfigurations[91] = { /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ TRACK_STRAIGHT | TRACK_STATION_END | TRACK_FLAT_ROLL_BANKING | TRACK_VERTICAL_LOOP | TRACK_SLOPE | TRACK_SLOPE_STEEP | TRACK_SLOPE_CURVE | TRACK_SLOPE_CURVE_STEEP | TRACK_S_BEND | TRACK_CURVE_SMALL | TRACK_CURVE | TRACK_TWIST | TRACK_CORKSCREW | TRACK_HELIX_SMALL | TRACK_BRAKES | TRACK_ON_RIDE_PHOTO | TRACK_SLOPE_VERTICAL }; +#define TRACK_BLOCK_END { 255, 255, 255, 255, 255, 255, 255 } + static const rct_preview_track TrackBlocks000[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks001[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks002[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks003[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks004[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks005[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks006[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks007[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks008[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks009[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks010[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks011[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks012[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks013[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks014[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks015[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks016[] = { @@ -463,7 +465,7 @@ static const rct_preview_track TrackBlocks016[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks017[] = { @@ -474,27 +476,27 @@ static const rct_preview_track TrackBlocks017[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks018[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks019[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks020[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks021[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks022[] = { @@ -505,7 +507,7 @@ static const rct_preview_track TrackBlocks022[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks023[] = { @@ -516,57 +518,57 @@ static const rct_preview_track TrackBlocks023[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks024[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks025[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks026[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks027[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks028[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks029[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks030[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks031[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks032[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks033[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks034[] = { @@ -577,7 +579,7 @@ static const rct_preview_track TrackBlocks034[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks035[] = { @@ -588,7 +590,7 @@ static const rct_preview_track TrackBlocks035[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks036[] = { @@ -599,7 +601,7 @@ static const rct_preview_track TrackBlocks036[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks037[] = { @@ -610,7 +612,7 @@ static const rct_preview_track TrackBlocks037[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks038[] = { @@ -618,7 +620,7 @@ static const rct_preview_track TrackBlocks038[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks039[] = { @@ -626,7 +628,7 @@ static const rct_preview_track TrackBlocks039[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks040[] = { @@ -640,7 +642,7 @@ static const rct_preview_track TrackBlocks040[] = { { 7, 32, -32, 32, 96, 8, 0 }, { 8, 0, -32, 16, 16, 63, 0 }, { 9, -32, -32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks041[] = { @@ -654,7 +656,7 @@ static const rct_preview_track TrackBlocks041[] = { { 7, 32, 32, 32, 96, 4, 0 }, { 8, 0, 32, 16, 16, 63, 0 }, { 9, -32, 32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks042[] = { @@ -662,7 +664,7 @@ static const rct_preview_track TrackBlocks042[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks043[] = { @@ -670,7 +672,7 @@ static const rct_preview_track TrackBlocks043[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks044[] = { @@ -678,7 +680,7 @@ static const rct_preview_track TrackBlocks044[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks045[] = { @@ -686,7 +688,7 @@ static const rct_preview_track TrackBlocks045[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks046[] = { @@ -694,7 +696,7 @@ static const rct_preview_track TrackBlocks046[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks047[] = { @@ -702,7 +704,7 @@ static const rct_preview_track TrackBlocks047[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks048[] = { @@ -710,7 +712,7 @@ static const rct_preview_track TrackBlocks048[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks049[] = { @@ -718,45 +720,45 @@ static const rct_preview_track TrackBlocks049[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks050[] = { { 0, 0, 0, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks051[] = { { 0, 0, 0, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks052[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks053[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks054[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks055[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks056[] = { @@ -764,7 +766,7 @@ static const rct_preview_track TrackBlocks056[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks057[] = { @@ -772,55 +774,55 @@ static const rct_preview_track TrackBlocks057[] = { { 1, -32, 0, -120, 96, 3, 0 }, { 2, 0, 0, -136, 16, 207, 0 }, { 3, 32, 0, -152, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks058[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks059[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks060[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 7, 0 }, { 2, -32, -32, -80, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks061[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 11, 0 }, { 2, -32, 32, -80, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks062[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks063[] = { { 0, 0, 0, 0, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 24, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks064[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks065[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks066[] = { @@ -833,78 +835,78 @@ static const rct_preview_track TrackBlocks066[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks067[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, 32, 0, 0, 0, 0, 3 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks068[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks069[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks070[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks071[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks072[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks073[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks074[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks075[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks076[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks077[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks078[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks079[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks080[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks081[] = { @@ -915,7 +917,7 @@ static const rct_preview_track TrackBlocks081[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks082[] = { @@ -926,7 +928,7 @@ static const rct_preview_track TrackBlocks082[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks083[] = { @@ -934,7 +936,7 @@ static const rct_preview_track TrackBlocks083[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks084[] = { @@ -942,7 +944,7 @@ static const rct_preview_track TrackBlocks084[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks085[] = { @@ -950,7 +952,7 @@ static const rct_preview_track TrackBlocks085[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks086[] = { @@ -958,7 +960,7 @@ static const rct_preview_track TrackBlocks086[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks087[] = { @@ -970,7 +972,7 @@ static const rct_preview_track TrackBlocks087[] = { { 5, 0, -64, 8, 0, 4, 1 }, { 6, -32, -96, 8, 4, 1, 0 }, { 7, 0, -96, 8, 4, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks088[] = { @@ -982,7 +984,7 @@ static const rct_preview_track TrackBlocks088[] = { { 5, 0, 64, 8, 0, 8, 1 }, { 6, -32, 96, 8, 4, 2, 0 }, { 7, 0, 96, 8, 4, 7, 0 }, - { 255, 0, 0, 2048, 0, 4, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks089[] = { @@ -994,7 +996,7 @@ static const rct_preview_track TrackBlocks089[] = { { 5, 0, -64, 0, 4, 4, 1 }, { 6, -32, -96, 0, 0, 1, 0 }, { 7, 0, -96, 0, 0, 11, 0 }, - { 255, 0, 0, 2048, 0, 4, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks090[] = { @@ -1006,7 +1008,7 @@ static const rct_preview_track TrackBlocks090[] = { { 5, 0, 64, 0, 4, 8, 1 }, { 6, -32, 96, 0, 0, 2, 0 }, { 7, 0, 96, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks091[] = { @@ -1024,7 +1026,7 @@ static const rct_preview_track TrackBlocks091[] = { { 11, 0, -128, 8, 4, 4, 1 }, { 12, -32, -160, 8, 4, 11, 0 }, { 13, 0, -160, 8, 4, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks092[] = { @@ -1042,7 +1044,7 @@ static const rct_preview_track TrackBlocks092[] = { { 11, 0, 128, 8, 4, 8, 1 }, { 12, -32, 160, 8, 4, 7, 0 }, { 13, 0, 160, 8, 4, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks093[] = { @@ -1060,7 +1062,7 @@ static const rct_preview_track TrackBlocks093[] = { { 11, 0, -128, 0, 0, 4, 1 }, { 12, -32, -160, 0, 0, 11, 0 }, { 13, 0, -160, 0, 0, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks094[] = { @@ -1078,42 +1080,42 @@ static const rct_preview_track TrackBlocks094[] = { { 11, 0, 128, 0, 0, 8, 1 }, { 12, -32, 160, 0, 0, 7, 0 }, { 13, 0, 160, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks095[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks096[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks097[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks098[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks099[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks100[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks101[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks102[] = { @@ -1124,7 +1126,7 @@ static const rct_preview_track TrackBlocks102[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks103[] = { @@ -1135,7 +1137,7 @@ static const rct_preview_track TrackBlocks103[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks104[] = { @@ -1146,7 +1148,7 @@ static const rct_preview_track TrackBlocks104[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks105[] = { @@ -1157,7 +1159,7 @@ static const rct_preview_track TrackBlocks105[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks106[] = { @@ -1168,7 +1170,7 @@ static const rct_preview_track TrackBlocks106[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks107[] = { @@ -1179,7 +1181,7 @@ static const rct_preview_track TrackBlocks107[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks108[] = { @@ -1190,7 +1192,7 @@ static const rct_preview_track TrackBlocks108[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks109[] = { @@ -1201,42 +1203,42 @@ static const rct_preview_track TrackBlocks109[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks110[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks111[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks112[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks113[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks114[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks115[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks116[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks117[] = { @@ -1245,7 +1247,7 @@ static const rct_preview_track TrackBlocks117[] = { { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 16, 15, 0 }, { 4, -128, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks118[] = { @@ -1253,7 +1255,7 @@ static const rct_preview_track TrackBlocks118[] = { { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 24, 15, 0 }, { 3, -96, 0, 40, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks119[] = { @@ -1261,12 +1263,12 @@ static const rct_preview_track TrackBlocks119[] = { { 1, -32, 0, 40, 48, 15, 0 }, { 2, -64, 0, 64, 24, 15, 0 }, { 3, -96, 0, 80, 8, 15, 0 }, - { 255, 0, 0, 10240, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks120[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks121[] = { @@ -1274,7 +1276,7 @@ static const rct_preview_track TrackBlocks121[] = { { 1, -32, 0, 16, 24, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 20480, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks122[] = { @@ -1282,7 +1284,7 @@ static const rct_preview_track TrackBlocks122[] = { { 1, -32, 0, 64, 24, 15, 0 }, { 2, -64, 0, 40, 48, 15, 0 }, { 3, -96, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks123[] = { @@ -1290,7 +1292,7 @@ static const rct_preview_track TrackBlocks123[] = { { 1, -32, 0, 0, 8, 63, 0 }, { 2, -64, 0, -32, 32, 63, 0 }, { 3, -96, 0, -96, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks124[] = { @@ -1301,52 +1303,52 @@ static const rct_preview_track TrackBlocks124[] = { { 4, -128, 0, 0, 160, 15, 0 }, { 5, -192, 0, 0, 208, 15, 0 }, { 6, -160, 0, 0, 208, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks125[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks126[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks127[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks128[] = { { 0, 0, 0, 0, 32, 207, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks129[] = { { 0, 0, 0, 0, 32, 63, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks130[] = { { 0, 0, 0, 0, 56, 15, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks131[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks132[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks133[] = { @@ -1355,7 +1357,7 @@ static const rct_preview_track TrackBlocks133[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks134[] = { @@ -1364,7 +1366,7 @@ static const rct_preview_track TrackBlocks134[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks135[] = { @@ -1373,7 +1375,7 @@ static const rct_preview_track TrackBlocks135[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks136[] = { @@ -1382,7 +1384,7 @@ static const rct_preview_track TrackBlocks136[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks137[] = { @@ -1391,7 +1393,7 @@ static const rct_preview_track TrackBlocks137[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks138[] = { @@ -1400,7 +1402,7 @@ static const rct_preview_track TrackBlocks138[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks139[] = { @@ -1409,7 +1411,7 @@ static const rct_preview_track TrackBlocks139[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks140[] = { @@ -1418,7 +1420,7 @@ static const rct_preview_track TrackBlocks140[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks141[] = { @@ -1426,7 +1428,7 @@ static const rct_preview_track TrackBlocks141[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks142[] = { @@ -1434,7 +1436,7 @@ static const rct_preview_track TrackBlocks142[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks143[] = { @@ -1442,7 +1444,7 @@ static const rct_preview_track TrackBlocks143[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks144[] = { @@ -1450,7 +1452,7 @@ static const rct_preview_track TrackBlocks144[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks145[] = { @@ -1458,7 +1460,7 @@ static const rct_preview_track TrackBlocks145[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks146[] = { @@ -1466,7 +1468,7 @@ static const rct_preview_track TrackBlocks146[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks147[] = { @@ -1474,7 +1476,7 @@ static const rct_preview_track TrackBlocks147[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks148[] = { @@ -1482,7 +1484,7 @@ static const rct_preview_track TrackBlocks148[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks149[] = { @@ -1490,7 +1492,7 @@ static const rct_preview_track TrackBlocks149[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks150[] = { @@ -1498,7 +1500,7 @@ static const rct_preview_track TrackBlocks150[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks151[] = { @@ -1506,7 +1508,7 @@ static const rct_preview_track TrackBlocks151[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks152[] = { @@ -1514,7 +1516,7 @@ static const rct_preview_track TrackBlocks152[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks153[] = { @@ -1522,7 +1524,7 @@ static const rct_preview_track TrackBlocks153[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks154[] = { @@ -1530,7 +1532,7 @@ static const rct_preview_track TrackBlocks154[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks155[] = { @@ -1538,7 +1540,7 @@ static const rct_preview_track TrackBlocks155[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks156[] = { @@ -1546,7 +1548,7 @@ static const rct_preview_track TrackBlocks156[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks157[] = { @@ -1554,7 +1556,7 @@ static const rct_preview_track TrackBlocks157[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks158[] = { @@ -1562,7 +1564,7 @@ static const rct_preview_track TrackBlocks158[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks159[] = { @@ -1570,7 +1572,7 @@ static const rct_preview_track TrackBlocks159[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks160[] = { @@ -1578,7 +1580,7 @@ static const rct_preview_track TrackBlocks160[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks161[] = { @@ -1586,7 +1588,7 @@ static const rct_preview_track TrackBlocks161[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks162[] = { @@ -1594,7 +1596,7 @@ static const rct_preview_track TrackBlocks162[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks163[] = { @@ -1602,7 +1604,7 @@ static const rct_preview_track TrackBlocks163[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks164[] = { @@ -1610,7 +1612,7 @@ static const rct_preview_track TrackBlocks164[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks165[] = { @@ -1618,7 +1620,7 @@ static const rct_preview_track TrackBlocks165[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks166[] = { @@ -1626,7 +1628,7 @@ static const rct_preview_track TrackBlocks166[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks167[] = { @@ -1634,7 +1636,7 @@ static const rct_preview_track TrackBlocks167[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks168[] = { @@ -1642,7 +1644,7 @@ static const rct_preview_track TrackBlocks168[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks169[] = { @@ -1650,7 +1652,7 @@ static const rct_preview_track TrackBlocks169[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks170[] = { @@ -1658,7 +1660,7 @@ static const rct_preview_track TrackBlocks170[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks171[] = { @@ -1666,45 +1668,45 @@ static const rct_preview_track TrackBlocks171[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks172[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks173[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks174[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks175[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks176[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks177[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks178[] = { @@ -1712,7 +1714,7 @@ static const rct_preview_track TrackBlocks178[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks179[] = { @@ -1720,7 +1722,7 @@ static const rct_preview_track TrackBlocks179[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks180[] = { @@ -1728,7 +1730,7 @@ static const rct_preview_track TrackBlocks180[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 0, 0, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks181[] = { @@ -1736,12 +1738,12 @@ static const rct_preview_track TrackBlocks181[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 0, 0, 43, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks182[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks183[] = { @@ -1752,7 +1754,7 @@ static const rct_preview_track TrackBlocks183[] = { { 4, -128, -32, 120, 96, 15, 0 }, { 5, -96, -32, 64, 192, 15, 0 }, { 6, -64, -32, 248, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks184[] = { @@ -1763,7 +1765,7 @@ static const rct_preview_track TrackBlocks184[] = { { 4, -128, 32, 120, 96, 15, 0 }, { 5, -96, 32, 64, 192, 15, 0 }, { 6, -64, 32, 248, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks185[] = { @@ -1774,7 +1776,7 @@ static const rct_preview_track TrackBlocks185[] = { { 4, 0, -32, -248, 56, 15, 0 }, { 5, 32, -32, -264, 40, 207, 0 }, { 6, 64, -32, -280, 24, 207, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks186[] = { @@ -1785,35 +1787,35 @@ static const rct_preview_track TrackBlocks186[] = { { 4, 0, 32, -248, 56, 15, 0 }, { 5, 32, 32, -264, 40, 207, 0 }, { 6, 64, 32, -280, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks187[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks188[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks189[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks190[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks191[] = { @@ -1821,7 +1823,7 @@ static const rct_preview_track TrackBlocks191[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks192[] = { @@ -1829,35 +1831,35 @@ static const rct_preview_track TrackBlocks192[] = { { 1, -32, 0, -88, 96, 3, 0 }, { 2, 0, 0, -104, 16, 207, 0 }, { 3, 32, 0, -120, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks193[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks194[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks195[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 7, 0 }, { 2, -32, -32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks196[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 11, 0 }, { 2, -32, 32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks197[] = { @@ -1865,7 +1867,7 @@ static const rct_preview_track TrackBlocks197[] = { { 1, -32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, { 3, 0, 0, 32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks198[] = { @@ -1873,7 +1875,7 @@ static const rct_preview_track TrackBlocks198[] = { { 1, -32, 0, -32, 32, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, { 3, 0, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks199[] = { @@ -1883,7 +1885,7 @@ static const rct_preview_track TrackBlocks199[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks200[] = { @@ -1893,39 +1895,39 @@ static const rct_preview_track TrackBlocks200[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks201[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks202[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks203[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks204[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks205[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks206[] = { @@ -1933,14 +1935,14 @@ static const rct_preview_track TrackBlocks206[] = { { 1, -32, 0, -40, 32, 15, 4 }, { 2, -64, 0, -96, 56, 15, 4 }, { 3, -96, 0, -96, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 0 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks207[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks208[] = { @@ -1948,7 +1950,7 @@ static const rct_preview_track TrackBlocks208[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks209[] = { @@ -1956,7 +1958,7 @@ static const rct_preview_track TrackBlocks209[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 8, 2, 0 }, { 3, -32, -32, 0, 8, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks210[] = { @@ -1964,7 +1966,7 @@ static const rct_preview_track TrackBlocks210[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 8, 1, 0 }, { 3, -32, 32, 0, 8, 11, 0 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks211[] = { @@ -1974,7 +1976,7 @@ static const rct_preview_track TrackBlocks211[] = { { 3, -64, -32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks212[] = { @@ -1984,7 +1986,7 @@ static const rct_preview_track TrackBlocks212[] = { { 3, -64, 32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks213[] = { @@ -1992,13 +1994,13 @@ static const rct_preview_track TrackBlocks213[] = { { 1, 32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 0, 32, 15, 0 }, { 3, -32, 0, 0, 32, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks214[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 208, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks215[] = { @@ -2009,12 +2011,12 @@ static const rct_preview_track TrackBlocks215[] = { { 4, -96, 0, 0, 48, 15, 0 }, { 5, -128, 0, 0, 32, 15, 0 }, { 6, -160, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks216[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks217[] = { @@ -2022,7 +2024,7 @@ static const rct_preview_track TrackBlocks217[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks218[] = { @@ -2030,7 +2032,7 @@ static const rct_preview_track TrackBlocks218[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks219[] = { @@ -2038,7 +2040,7 @@ static const rct_preview_track TrackBlocks219[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks220[] = { @@ -2046,7 +2048,7 @@ static const rct_preview_track TrackBlocks220[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks221[] = { @@ -2057,7 +2059,7 @@ static const rct_preview_track TrackBlocks221[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks222[] = { @@ -2068,7 +2070,7 @@ static const rct_preview_track TrackBlocks222[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks223[] = { @@ -2079,7 +2081,7 @@ static const rct_preview_track TrackBlocks223[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks224[] = { @@ -2090,158 +2092,158 @@ static const rct_preview_track TrackBlocks224[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks225[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks226[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks227[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks228[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks229[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks230[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks231[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks232[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks233[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks234[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks235[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks236[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks237[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks238[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks239[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks240[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks241[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks242[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks243[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks244[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks245[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks246[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks247[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks248[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks249[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks250[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks251[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks252[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks253[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks254[] = { @@ -2249,14 +2251,14 @@ static const rct_preview_track TrackBlocks254[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 8192, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track TrackBlocks255[] = { { 0, 0, 0, 32, 56, 15, 4 }, { 1, 32, 0, 88, 32, 15, 4 }, { 2, 64, 0, 128, 16, 15, 4 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; // rct2: 0x00994638 @@ -2521,82 +2523,82 @@ const rct_preview_track *TrackBlocks[256] = { static const rct_preview_track FlatRideTrackBlocks000[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks001[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks002[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks003[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks004[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks005[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks006[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks007[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks008[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks009[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks010[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks011[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks012[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks013[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks014[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks015[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks016[] = { @@ -2607,7 +2609,7 @@ static const rct_preview_track FlatRideTrackBlocks016[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks017[] = { @@ -2618,27 +2620,27 @@ static const rct_preview_track FlatRideTrackBlocks017[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks018[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks019[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks020[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks021[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks022[] = { @@ -2649,7 +2651,7 @@ static const rct_preview_track FlatRideTrackBlocks022[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks023[] = { @@ -2660,57 +2662,57 @@ static const rct_preview_track FlatRideTrackBlocks023[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks024[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks025[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks026[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks027[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks028[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks029[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks030[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks031[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks032[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks033[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks034[] = { @@ -2721,7 +2723,7 @@ static const rct_preview_track FlatRideTrackBlocks034[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks035[] = { @@ -2732,7 +2734,7 @@ static const rct_preview_track FlatRideTrackBlocks035[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks036[] = { @@ -2743,7 +2745,7 @@ static const rct_preview_track FlatRideTrackBlocks036[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks037[] = { @@ -2754,7 +2756,7 @@ static const rct_preview_track FlatRideTrackBlocks037[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks038[] = { @@ -2762,7 +2764,7 @@ static const rct_preview_track FlatRideTrackBlocks038[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks039[] = { @@ -2770,7 +2772,7 @@ static const rct_preview_track FlatRideTrackBlocks039[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks040[] = { @@ -2784,7 +2786,7 @@ static const rct_preview_track FlatRideTrackBlocks040[] = { { 7, 32, -32, 32, 96, 8, 0 }, { 8, 0, -32, 16, 16, 63, 0 }, { 9, -32, -32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks041[] = { @@ -2798,7 +2800,7 @@ static const rct_preview_track FlatRideTrackBlocks041[] = { { 7, 32, 32, 32, 96, 4, 0 }, { 8, 0, 32, 16, 16, 63, 0 }, { 9, -32, 32, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks042[] = { @@ -2806,7 +2808,7 @@ static const rct_preview_track FlatRideTrackBlocks042[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks043[] = { @@ -2814,7 +2816,7 @@ static const rct_preview_track FlatRideTrackBlocks043[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks044[] = { @@ -2822,7 +2824,7 @@ static const rct_preview_track FlatRideTrackBlocks044[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks045[] = { @@ -2830,7 +2832,7 @@ static const rct_preview_track FlatRideTrackBlocks045[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks046[] = { @@ -2838,7 +2840,7 @@ static const rct_preview_track FlatRideTrackBlocks046[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks047[] = { @@ -2846,7 +2848,7 @@ static const rct_preview_track FlatRideTrackBlocks047[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks048[] = { @@ -2854,7 +2856,7 @@ static const rct_preview_track FlatRideTrackBlocks048[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks049[] = { @@ -2862,45 +2864,45 @@ static const rct_preview_track FlatRideTrackBlocks049[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks050[] = { { 0, 0, 0, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks051[] = { { 0, 0, 0, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks052[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks053[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks054[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks055[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks056[] = { @@ -2908,7 +2910,7 @@ static const rct_preview_track FlatRideTrackBlocks056[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks057[] = { @@ -2916,55 +2918,55 @@ static const rct_preview_track FlatRideTrackBlocks057[] = { { 1, -32, 0, -120, 96, 3, 0 }, { 2, 0, 0, -136, 16, 207, 0 }, { 3, 32, 0, -152, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks058[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks059[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks060[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 7, 0 }, { 2, -32, -32, -80, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks061[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -56, 32, 11, 0 }, { 2, -32, 32, -80, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks062[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks063[] = { { 0, 0, 0, 0, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 24, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks064[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks065[] = { { 0, 0, 0, 0, 24, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks066[] = { @@ -2977,78 +2979,78 @@ static const rct_preview_track FlatRideTrackBlocks066[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks067[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, 32, 0, 0, 0, 0, 3 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks068[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks069[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks070[] = { { 0, 0, 0, 0, 64, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks071[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks072[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks073[] = { { 0, 0, 0, 0, 32, 207, 0 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks074[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks075[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks076[] = { { 0, 0, 0, 0, 64, 63, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks077[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks078[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks079[] = { { 0, 0, 0, 0, 32, 63, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks080[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks081[] = { @@ -3059,7 +3061,7 @@ static const rct_preview_track FlatRideTrackBlocks081[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks082[] = { @@ -3070,7 +3072,7 @@ static const rct_preview_track FlatRideTrackBlocks082[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks083[] = { @@ -3078,7 +3080,7 @@ static const rct_preview_track FlatRideTrackBlocks083[] = { { 1, -32, 0, 0, 0, 7, 0 }, { 2, -32, -32, 0, 0, 13, 0 }, { 3, -64, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks084[] = { @@ -3086,7 +3088,7 @@ static const rct_preview_track FlatRideTrackBlocks084[] = { { 1, -32, 0, 0, 0, 11, 0 }, { 2, -32, 32, 0, 0, 14, 0 }, { 3, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks085[] = { @@ -3094,7 +3096,7 @@ static const rct_preview_track FlatRideTrackBlocks085[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 0, 2, 0 }, { 3, -32, -32, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks086[] = { @@ -3102,7 +3104,7 @@ static const rct_preview_track FlatRideTrackBlocks086[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 0 }, { 3, -32, 32, 0, 0, 11, 0 }, - { 255, 0, 0, 0, 0, 16, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks087[] = { @@ -3114,7 +3116,7 @@ static const rct_preview_track FlatRideTrackBlocks087[] = { { 5, 0, -64, 8, 0, 4, 1 }, { 6, -32, -96, 8, 4, 1, 0 }, { 7, 0, -96, 8, 4, 11, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks088[] = { @@ -3126,7 +3128,7 @@ static const rct_preview_track FlatRideTrackBlocks088[] = { { 5, 0, 64, 8, 0, 8, 1 }, { 6, -32, 96, 8, 4, 2, 0 }, { 7, 0, 96, 8, 4, 7, 0 }, - { 255, 0, 0, 2048, 0, 4, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks089[] = { @@ -3138,7 +3140,7 @@ static const rct_preview_track FlatRideTrackBlocks089[] = { { 5, 0, -64, 0, 4, 4, 1 }, { 6, -32, -96, 0, 0, 1, 0 }, { 7, 0, -96, 0, 0, 11, 0 }, - { 255, 0, 0, 2048, 0, 4, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks090[] = { @@ -3150,7 +3152,7 @@ static const rct_preview_track FlatRideTrackBlocks090[] = { { 5, 0, 64, 0, 4, 8, 1 }, { 6, -32, 96, 0, 0, 2, 0 }, { 7, 0, 96, 0, 0, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks091[] = { @@ -3168,7 +3170,7 @@ static const rct_preview_track FlatRideTrackBlocks091[] = { { 11, 0, -128, 8, 4, 4, 1 }, { 12, -32, -160, 8, 4, 11, 0 }, { 13, 0, -160, 8, 4, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks092[] = { @@ -3186,7 +3188,7 @@ static const rct_preview_track FlatRideTrackBlocks092[] = { { 11, 0, 128, 8, 4, 8, 1 }, { 12, -32, 160, 8, 4, 7, 0 }, { 13, 0, 160, 8, 4, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks093[] = { @@ -3204,7 +3206,7 @@ static const rct_preview_track FlatRideTrackBlocks093[] = { { 11, 0, -128, 0, 0, 4, 1 }, { 12, -32, -160, 0, 0, 11, 0 }, { 13, 0, -160, 0, 0, 15, 0 }, - { 255, 0, 0, 2048, 0, 4, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks094[] = { @@ -3222,7 +3224,7 @@ static const rct_preview_track FlatRideTrackBlocks094[] = { { 11, 0, 128, 0, 0, 8, 1 }, { 12, -32, 160, 0, 0, 7, 0 }, { 13, 0, 160, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 64, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks095[] = { @@ -3230,37 +3232,37 @@ static const rct_preview_track FlatRideTrackBlocks095[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks096[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks097[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks098[] = { { 0, 0, 0, 0, 64, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks099[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks100[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks101[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks102[] = { @@ -3271,7 +3273,7 @@ static const rct_preview_track FlatRideTrackBlocks102[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks103[] = { @@ -3282,7 +3284,7 @@ static const rct_preview_track FlatRideTrackBlocks103[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks104[] = { @@ -3293,7 +3295,7 @@ static const rct_preview_track FlatRideTrackBlocks104[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks105[] = { @@ -3304,7 +3306,7 @@ static const rct_preview_track FlatRideTrackBlocks105[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks106[] = { @@ -3315,7 +3317,7 @@ static const rct_preview_track FlatRideTrackBlocks106[] = { { 4, -32, -64, 0, 12, 8, 1 }, { 5, -64, -32, 0, 12, 7, 0 }, { 6, -64, -64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks107[] = { @@ -3326,7 +3328,7 @@ static const rct_preview_track FlatRideTrackBlocks107[] = { { 4, -32, 64, 0, 12, 4, 1 }, { 5, -64, 32, 0, 12, 11, 0 }, { 6, -64, 64, 0, 12, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks108[] = { @@ -3337,7 +3339,7 @@ static const rct_preview_track FlatRideTrackBlocks108[] = { { 4, -32, -64, 0, 0, 8, 1 }, { 5, -64, -32, 0, 0, 7, 0 }, { 6, -64, -64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 12, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks109[] = { @@ -3348,7 +3350,7 @@ static const rct_preview_track FlatRideTrackBlocks109[] = { { 4, -32, 64, 0, 0, 4, 1 }, { 5, -64, 32, 0, 0, 11, 0 }, { 6, -64, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks110[] = { @@ -3356,7 +3358,7 @@ static const rct_preview_track FlatRideTrackBlocks110[] = { { 1, 0, 32, 0, 0, 15, 0 }, { 2, 32, 0, 0, 0, 15, 0 }, { 3, 32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks111[] = { @@ -3376,22 +3378,22 @@ static const rct_preview_track FlatRideTrackBlocks111[] = { { 13, 96, 32, 0, 0, 15, 0 }, { 14, 96, 64, 0, 0, 15, 0 }, { 15, 96, 96, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks112[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks113[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks114[] = { { 0, 0, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks115[] = { @@ -3403,7 +3405,7 @@ static const rct_preview_track FlatRideTrackBlocks115[] = { { 5, 32, 32, 0, 0, 15, 0 }, { 6, 32, 64, 0, 0, 15, 0 }, { 7, 32, 96, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks116[] = { @@ -3412,7 +3414,7 @@ static const rct_preview_track FlatRideTrackBlocks116[] = { { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 0 }, { 4, 64, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks117[] = { @@ -3421,12 +3423,12 @@ static const rct_preview_track FlatRideTrackBlocks117[] = { { 2, -64, 0, 0, 16, 15, 0 }, { 3, -96, 0, 0, 16, 15, 0 }, { 4, -128, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks118[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks119[] = { @@ -3434,17 +3436,17 @@ static const rct_preview_track FlatRideTrackBlocks119[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks120[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks121[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks122[] = { @@ -3452,7 +3454,7 @@ static const rct_preview_track FlatRideTrackBlocks122[] = { { 1, -64, 0, 0, 0, 15, 0 }, { 2, -32, 0, 0, 0, 15, 0 }, { 3, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks123[] = { @@ -3465,7 +3467,7 @@ static const rct_preview_track FlatRideTrackBlocks123[] = { { 6, 32, -32, 0, 0, 15, 0 }, { 7, 32, 32, 0, 0, 15, 0 }, { 8, 32, 0, 0, 0, 15, 2 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks124[] = { @@ -3476,52 +3478,52 @@ static const rct_preview_track FlatRideTrackBlocks124[] = { { 4, -128, 0, 0, 160, 15, 0 }, { 5, -192, 0, 0, 208, 15, 0 }, { 6, -160, 0, 0, 208, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks125[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks126[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks127[] = { { 0, 0, 0, 0, 8, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks128[] = { { 0, 0, 0, 0, 32, 207, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 32, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks129[] = { { 0, 0, 0, 0, 32, 63, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks130[] = { { 0, 0, 0, 0, 56, 15, 4 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks131[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks132[] = { { 0, 0, 0, 0, 24, 63, 0 }, - { 255, 0, 0, 0, 0, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks133[] = { @@ -3530,7 +3532,7 @@ static const rct_preview_track FlatRideTrackBlocks133[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks134[] = { @@ -3539,7 +3541,7 @@ static const rct_preview_track FlatRideTrackBlocks134[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks135[] = { @@ -3548,7 +3550,7 @@ static const rct_preview_track FlatRideTrackBlocks135[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks136[] = { @@ -3557,7 +3559,7 @@ static const rct_preview_track FlatRideTrackBlocks136[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks137[] = { @@ -3566,7 +3568,7 @@ static const rct_preview_track FlatRideTrackBlocks137[] = { { 2, -32, -32, 0, 0, 8, 0 }, { 3, -64, 0, 0, 0, 2, 1 }, { 4, -64, -32, 0, 0, 1, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks138[] = { @@ -3575,7 +3577,7 @@ static const rct_preview_track FlatRideTrackBlocks138[] = { { 2, -32, 32, 0, 0, 4, 0 }, { 3, -64, 0, 0, 0, 1, 1 }, { 4, -64, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks139[] = { @@ -3584,7 +3586,7 @@ static const rct_preview_track FlatRideTrackBlocks139[] = { { 2, 0, 32, 0, 0, 4, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -64, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks140[] = { @@ -3593,7 +3595,7 @@ static const rct_preview_track FlatRideTrackBlocks140[] = { { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 15, 0 }, { 4, -32, 64, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks141[] = { @@ -3601,7 +3603,7 @@ static const rct_preview_track FlatRideTrackBlocks141[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks142[] = { @@ -3609,7 +3611,7 @@ static const rct_preview_track FlatRideTrackBlocks142[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks143[] = { @@ -3617,7 +3619,7 @@ static const rct_preview_track FlatRideTrackBlocks143[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks144[] = { @@ -3625,7 +3627,7 @@ static const rct_preview_track FlatRideTrackBlocks144[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks145[] = { @@ -3633,7 +3635,7 @@ static const rct_preview_track FlatRideTrackBlocks145[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks146[] = { @@ -3641,7 +3643,7 @@ static const rct_preview_track FlatRideTrackBlocks146[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks147[] = { @@ -3649,7 +3651,7 @@ static const rct_preview_track FlatRideTrackBlocks147[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks148[] = { @@ -3657,7 +3659,7 @@ static const rct_preview_track FlatRideTrackBlocks148[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 1 }, { 3, -32, 32, 0, 16, 2, 0 }, - { 255, 0, 0, 0, 0, 64, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks149[] = { @@ -3665,7 +3667,7 @@ static const rct_preview_track FlatRideTrackBlocks149[] = { { 1, 0, 32, 0, 64, 4, 1 }, { 2, -32, 0, 0, 64, 1, 1 }, { 3, -32, 32, 0, 64, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks150[] = { @@ -3673,7 +3675,7 @@ static const rct_preview_track FlatRideTrackBlocks150[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks151[] = { @@ -3681,7 +3683,7 @@ static const rct_preview_track FlatRideTrackBlocks151[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks152[] = { @@ -3689,7 +3691,7 @@ static const rct_preview_track FlatRideTrackBlocks152[] = { { 1, 0, 32, 0, 32, 4, 1 }, { 2, -32, 0, 0, 32, 1, 1 }, { 3, -32, 32, 0, 32, 2, 0 }, - { 255, 0, 0, 0, 0, 8, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks153[] = { @@ -3697,7 +3699,7 @@ static const rct_preview_track FlatRideTrackBlocks153[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks154[] = { @@ -3705,7 +3707,7 @@ static const rct_preview_track FlatRideTrackBlocks154[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks155[] = { @@ -3713,7 +3715,7 @@ static const rct_preview_track FlatRideTrackBlocks155[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks156[] = { @@ -3721,7 +3723,7 @@ static const rct_preview_track FlatRideTrackBlocks156[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks157[] = { @@ -3729,7 +3731,7 @@ static const rct_preview_track FlatRideTrackBlocks157[] = { { 1, 0, 32, 0, 24, 4, 1 }, { 2, -32, 0, 0, 24, 1, 1 }, { 3, -32, 32, 0, 24, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks158[] = { @@ -3737,7 +3739,7 @@ static const rct_preview_track FlatRideTrackBlocks158[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks159[] = { @@ -3745,7 +3747,7 @@ static const rct_preview_track FlatRideTrackBlocks159[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks160[] = { @@ -3753,7 +3755,7 @@ static const rct_preview_track FlatRideTrackBlocks160[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks161[] = { @@ -3761,7 +3763,7 @@ static const rct_preview_track FlatRideTrackBlocks161[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks162[] = { @@ -3769,7 +3771,7 @@ static const rct_preview_track FlatRideTrackBlocks162[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks163[] = { @@ -3777,7 +3779,7 @@ static const rct_preview_track FlatRideTrackBlocks163[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks164[] = { @@ -3785,7 +3787,7 @@ static const rct_preview_track FlatRideTrackBlocks164[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks165[] = { @@ -3793,7 +3795,7 @@ static const rct_preview_track FlatRideTrackBlocks165[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 16, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks166[] = { @@ -3801,7 +3803,7 @@ static const rct_preview_track FlatRideTrackBlocks166[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks167[] = { @@ -3809,7 +3811,7 @@ static const rct_preview_track FlatRideTrackBlocks167[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 32, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks168[] = { @@ -3817,7 +3819,7 @@ static const rct_preview_track FlatRideTrackBlocks168[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks169[] = { @@ -3825,7 +3827,7 @@ static const rct_preview_track FlatRideTrackBlocks169[] = { { 1, 0, 32, 0, 8, 4, 1 }, { 2, -32, 0, 0, 8, 1, 1 }, { 3, -32, 32, 0, 8, 2, 0 }, - { 255, 0, 0, 0, 0, 24, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks170[] = { @@ -3833,7 +3835,7 @@ static const rct_preview_track FlatRideTrackBlocks170[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks171[] = { @@ -3841,45 +3843,45 @@ static const rct_preview_track FlatRideTrackBlocks171[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 0, 1, 1 }, { 3, -32, 32, 0, 0, 2, 0 }, - { 255, 0, 0, 0, 0, 0, 13 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks172[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks173[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks174[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks175[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 0, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks176[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks177[] = { { 0, 0, 0, -32, 16, 15, 0 }, { 1, -32, 0, -32, 16, 15, 0 }, { 2, -64, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 71 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks178[] = { @@ -3887,7 +3889,7 @@ static const rct_preview_track FlatRideTrackBlocks178[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks179[] = { @@ -3895,7 +3897,7 @@ static const rct_preview_track FlatRideTrackBlocks179[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks180[] = { @@ -3903,7 +3905,7 @@ static const rct_preview_track FlatRideTrackBlocks180[] = { { 1, 0, -32, 0, 16, 8, 1 }, { 2, -32, 0, 0, 16, 2, 0 }, { 3, -32, -32, 0, 0, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks181[] = { @@ -3911,12 +3913,12 @@ static const rct_preview_track FlatRideTrackBlocks181[] = { { 1, 0, 32, 0, 16, 4, 1 }, { 2, -32, 0, 0, 16, 1, 0 }, { 3, -32, 32, 0, 0, 43, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks182[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks183[] = { @@ -3927,7 +3929,7 @@ static const rct_preview_track FlatRideTrackBlocks183[] = { { 4, -128, -32, 120, 96, 15, 0 }, { 5, -96, -32, 64, 192, 15, 0 }, { 6, -64, -32, 248, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 24, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks184[] = { @@ -3938,7 +3940,7 @@ static const rct_preview_track FlatRideTrackBlocks184[] = { { 4, -128, 32, 120, 96, 15, 0 }, { 5, -96, 32, 64, 192, 15, 0 }, { 6, -64, 32, 248, 16, 15, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks185[] = { @@ -3949,7 +3951,7 @@ static const rct_preview_track FlatRideTrackBlocks185[] = { { 4, 0, -32, -248, 56, 15, 0 }, { 5, 32, -32, -264, 40, 207, 0 }, { 6, 64, -32, -280, 24, 207, 0 }, - { 255, 0, 0, -8192, 255, 24, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks186[] = { @@ -3960,35 +3962,35 @@ static const rct_preview_track FlatRideTrackBlocks186[] = { { 4, 0, 32, -248, 56, 15, 0 }, { 5, 32, 32, -264, 40, 207, 0 }, { 6, 64, 32, -280, 24, 207, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks187[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks188[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, -16, 16, 15, 0 }, { 2, -64, 0, -16, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks189[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks190[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 0, 16, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks191[] = { @@ -3996,7 +3998,7 @@ static const rct_preview_track FlatRideTrackBlocks191[] = { { 1, -32, 0, 16, 16, 207, 0 }, { 2, -64, 0, 32, 96, 3, 0 }, { 3, -32, 0, 120, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks192[] = { @@ -4004,35 +4006,35 @@ static const rct_preview_track FlatRideTrackBlocks192[] = { { 1, -32, 0, -88, 96, 3, 0 }, { 2, 0, 0, -104, 16, 207, 0 }, { 3, 32, 0, -120, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks193[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 7, 0 }, { 2, -32, -32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks194[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, 24, 32, 11, 0 }, { 2, -32, 32, 48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks195[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 7, 0 }, { 2, -32, -32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks196[] = { { 0, 0, 0, 0, 16, 15, 0 }, { 1, -32, 0, -24, 32, 11, 0 }, { 2, -32, 32, -48, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks197[] = { @@ -4040,7 +4042,7 @@ static const rct_preview_track FlatRideTrackBlocks197[] = { { 1, -32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 16, 0, 15, 0 }, { 3, 0, 0, 32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks198[] = { @@ -4048,7 +4050,7 @@ static const rct_preview_track FlatRideTrackBlocks198[] = { { 1, -32, 0, -32, 32, 15, 0 }, { 2, -64, 0, -16, 0, 15, 0 }, { 3, 0, 0, -32, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks199[] = { @@ -4058,7 +4060,7 @@ static const rct_preview_track FlatRideTrackBlocks199[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks200[] = { @@ -4068,39 +4070,39 @@ static const rct_preview_track FlatRideTrackBlocks200[] = { { 3, -96, 0, 0, 0, 15, 0 }, { 4, -128, 0, 0, 0, 15, 0 }, { 5, -160, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks201[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks202[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks203[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks204[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, 32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks205[] = { { 0, 0, 0, 0, 0, 15, 0 }, { 1, -32, 0, 0, 0, 15, 0 }, { 2, -32, -32, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks206[] = { @@ -4108,14 +4110,14 @@ static const rct_preview_track FlatRideTrackBlocks206[] = { { 1, -32, 0, -40, 32, 15, 4 }, { 2, -64, 0, -96, 56, 15, 4 }, { 3, -96, 0, -96, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 0, 0 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks207[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks208[] = { @@ -4123,7 +4125,7 @@ static const rct_preview_track FlatRideTrackBlocks208[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks209[] = { @@ -4131,7 +4133,7 @@ static const rct_preview_track FlatRideTrackBlocks209[] = { { 1, 0, -32, 0, 0, 8, 1 }, { 2, -32, 0, 0, 8, 2, 0 }, { 3, -32, -32, 0, 8, 7, 0 }, - { 255, 0, 0, 0, 0, 0, 11 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks210[] = { @@ -4139,7 +4141,7 @@ static const rct_preview_track FlatRideTrackBlocks210[] = { { 1, 0, 32, 0, 0, 4, 1 }, { 2, -32, 0, 0, 8, 1, 0 }, { 3, -32, 32, 0, 8, 11, 0 }, - { 255, 0, 0, 0, 0, 56, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks211[] = { @@ -4149,7 +4151,7 @@ static const rct_preview_track FlatRideTrackBlocks211[] = { { 3, -64, -32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks212[] = { @@ -4159,7 +4161,7 @@ static const rct_preview_track FlatRideTrackBlocks212[] = { { 3, -64, 32, 0, 0, 15, 0 }, { 4, -32, 0, 0, 0, 15, 0 }, { 5, -64, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 32, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks213[] = { @@ -4167,13 +4169,13 @@ static const rct_preview_track FlatRideTrackBlocks213[] = { { 1, 32, 0, 0, 32, 15, 0 }, { 2, -64, 0, 0, 32, 15, 0 }, { 3, -32, 0, 0, 32, 15, 0 }, - { 255, 0, 0, 0, 0, 48, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks214[] = { { 0, 0, 0, 0, 48, 15, 0 }, { 1, 32, 0, 0, 48, 15, 0 }, - { 255, 0, 0, 0, 0, 208, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks215[] = { @@ -4184,12 +4186,12 @@ static const rct_preview_track FlatRideTrackBlocks215[] = { { 4, -96, 0, 0, 48, 15, 0 }, { 5, -128, 0, 0, 32, 15, 0 }, { 6, -160, 0, 0, 16, 15, 0 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks216[] = { { 0, 0, 0, 0, 0, 15, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks217[] = { @@ -4197,7 +4199,7 @@ static const rct_preview_track FlatRideTrackBlocks217[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 16, 16, 103, 0 }, - { 255, 0, 0, 0, 0, 16, 139 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks218[] = { @@ -4205,7 +4207,7 @@ static const rct_preview_track FlatRideTrackBlocks218[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 16, 16, 155, 0 }, - { 255, 0, 0, 4096, 0, 16, 55 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks219[] = { @@ -4213,7 +4215,7 @@ static const rct_preview_track FlatRideTrackBlocks219[] = { { 1, 0, -32, 16, 0, 8, 1 }, { 2, -32, 0, 16, 0, 2, 0 }, { 3, -32, -32, 0, 16, 23, 0 }, - { 255, 0, 0, 4096, 0, 16, 59 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks220[] = { @@ -4221,7 +4223,7 @@ static const rct_preview_track FlatRideTrackBlocks220[] = { { 1, 0, 32, 16, 0, 4, 1 }, { 2, -32, 0, 16, 0, 1, 0 }, { 3, -32, 32, 0, 16, 43, 0 }, - { 255, 0, 0, 0, 0, 0, 7 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks221[] = { @@ -4232,7 +4234,7 @@ static const rct_preview_track FlatRideTrackBlocks221[] = { { 4, -32, -64, 48, 0, 8, 1 }, { 5, -64, -32, 32, 16, 71, 0 }, { 6, -64, -64, 48, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 16, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks222[] = { @@ -4243,7 +4245,7 @@ static const rct_preview_track FlatRideTrackBlocks222[] = { { 4, -32, 64, 48, 0, 4, 1 }, { 5, -64, 32, 32, 16, 139, 0 }, { 6, -64, 64, 48, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks223[] = { @@ -4254,7 +4256,7 @@ static const rct_preview_track FlatRideTrackBlocks223[] = { { 4, -32, -64, 16, 0, 8, 1 }, { 5, -64, -32, 16, 16, 23, 0 }, { 6, -64, -64, 0, 16, 159, 0 }, - { 255, 0, 0, 12288, 0, 16, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks224[] = { @@ -4265,158 +4267,158 @@ static const rct_preview_track FlatRideTrackBlocks224[] = { { 4, -32, 64, 16, 0, 4, 1 }, { 5, -64, 32, 16, 16, 43, 0 }, { 6, -64, 64, 0, 16, 111, 0 }, - { 255, 0, 0, 0, 0, 0, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks225[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks226[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks227[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks228[] = { { 0, 0, 0, 0, 16, 207, 0 }, - { 255, 0, 0, 0, 0, 64, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks229[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks230[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks231[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks232[] = { { 0, 0, 0, 0, 16, 63, 0 }, - { 255, 0, 0, 0, 0, 64, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks233[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks234[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks235[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks236[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks237[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks238[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks239[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks240[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks241[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks242[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks243[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks244[] = { { 0, 0, 0, 0, 8, 207, 0 }, - { 255, 0, 0, 0, 0, 8, 63 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks245[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks246[] = { { 0, 0, 0, 0, 8, 63, 0 }, - { 255, 0, 0, 0, 0, 32, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks247[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks248[] = { { 0, 0, 0, 0, 8, 15, 0 }, - { 255, 0, 0, 0, 0, 8, 207 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks249[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks250[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks251[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, 32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 72, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks252[] = { { 0, 0, 0, 0, 72, 15, 4 }, { 1, 0, -32, 0, 0, 0, 5 }, - { 255, 0, 0, 0, 0, 8, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks253[] = { { 0, 0, 0, 0, 56, 15, 4 }, { 1, 32, 0, 56, 32, 15, 4 }, { 2, 64, 0, 96, 16, 15, 4 }, - { 255, 0, 0, -8192, 255, 16, 15 } + TRACK_BLOCK_END }; static const rct_preview_track FlatRideTrackBlocks254[] = { @@ -4424,7 +4426,7 @@ static const rct_preview_track FlatRideTrackBlocks254[] = { { 1, -32, 0, -72, 32, 15, 4 }, { 2, -64, 0, -128, 56, 15, 4 }, { 3, -96, 0, -128, 0, 0, 5 }, - { 255, 0, 0, 8192, 0, 56, 15 } + TRACK_BLOCK_END }; // rct2: 0x00994A38 From 63698761fd829e1f10c135fa20b3cc90dd5584fc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 01:57:50 +0100 Subject: [PATCH 14/16] remove some small callprocs --- src/drawing/drawing.h | 1 + src/drawing/string.c | 27 +++++++++++++++++ src/windows/editor_objective_options.c | 30 ++++++++++++++++-- src/windows/game_bottom_toolbar.c | 42 +++++++++++++++----------- 4 files changed, 80 insertions(+), 20 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 55217eff9c..65ccb9267e 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -131,6 +131,7 @@ void draw_string_centred_raw(rct_drawpixelinfo *dpi, int x, int y, int numLines, void gfx_draw_string_right(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); void draw_string_right_underline(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y); int string_get_height_raw(char *buffer); +void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks); // rain void update_rain_animation(); diff --git a/src/drawing/string.c b/src/drawing/string.c index d0c575f963..ebf4c47f23 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -1218,4 +1218,31 @@ int string_get_height_raw(char *buffer) } return height; +} + +/** + * + * rct2: 0x006C1F57 + * + * colour : al + * format : bx + * x : cx + * y : dx + * text : esi + * dpi : edi + * width : bp + * ticks : ebp >> 16 + */ +void sub_6C1F57(rct_drawpixelinfo *dpi, int x, int y, int width, int colour, rct_string_id format, void *args, int ticks) +{ + RCT2_CALLPROC_X( + 0x006C1F57, + colour, + format, + x, + y, + (int)args, + (int)dpi, + (width & 0xFFFF) | (ticks << 16) + ); } \ No newline at end of file diff --git a/src/windows/editor_objective_options.c b/src/windows/editor_objective_options.c index 52071d8287..32bf8d52ab 100644 --- a/src/windows/editor_objective_options.c +++ b/src/windows/editor_objective_options.c @@ -243,6 +243,8 @@ static uint64 window_editor_objective_options_page_hold_down_widgets[] = { #pragma endregion +static void window_editor_objective_options_update_disabled_widgets(rct_window *w); + /** * * rct2: 0x0067137D @@ -271,7 +273,7 @@ void window_editor_objective_options_open() w->selected_tab = WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_MAIN; w->no_list_items = 0; w->selected_list_item = -1; - RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0); + window_editor_objective_options_update_disabled_widgets(w); } static void window_editor_objective_options_set_pressed_tab(rct_window *w) @@ -337,7 +339,7 @@ static void window_editor_objective_options_set_page(rct_window *w, int page) w->event_handlers = window_editor_objective_options_page_events[page]; w->widgets = window_editor_objective_options_widgets[page]; window_invalidate(w); - RCT2_CALLPROC_X(0x00672609, 0, 0, 0, 0, (int)w, 0, 0); + window_editor_objective_options_update_disabled_widgets(w); window_event_resize_call(w); window_event_invalidate_call(w); window_init_scroll_widgets(w); @@ -1284,4 +1286,28 @@ static void window_editor_objective_options_rides_scrollpaint() // Ride name gfx_draw_string_left(dpi, stringId, &ride->name, 0, 15, y); } +} + +/** + * + * rct2: 0x00672609 + */ +static void window_editor_objective_options_update_disabled_widgets(rct_window *w) +{ + rct_ride *ride; + int i, numRides; + + // Check if there are any rides (not shops or facilities) + numRides = 0; + FOR_ALL_RIDES(i, ride) { + if (gRideClassifications[ride->type] == RIDE_CLASS_RIDE) { + numRides++; + } + } + + if (numRides == 0) { + w->disabled_widgets &= ~(1 << WIDX_TAB_2); + } else { + w->disabled_widgets |= (1 << WIDX_TAB_2); + } } \ No newline at end of file diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index b82b44e553..16c01ce4b9 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -120,6 +120,8 @@ static void* window_game_bottom_toolbar_events[] = { window_game_bottom_toolbar_emptysub }; +static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w); + /** * Creates the main game bottom toolbar window. * rct2: 0x0066B52F (part of 0x0066B3E8) @@ -521,34 +523,32 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, */ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rct_window *w) { - int x, y; + int x, y, width; + rct_string_id stringId; rct_news_item *newsItem; + rct_widget *middleOutsetWidget; + middleOutsetWidget = &window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET]; newsItem = &(RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item)[0]); // Current news item gfx_fill_rect_inset( dpi, - w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + 1, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 1, - w->x + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - 1, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].bottom - 1, + w->x + middleOutsetWidget->left + 1, + w->y + middleOutsetWidget->top + 1, + w->x + middleOutsetWidget->right - 1, + w->y + middleOutsetWidget->bottom - 1, w->colours[2], 48 ); // Text + stringId = 1926; + // memcpy((char*)language_get_string(1926), &newsItem->colour, 256); memcpy((void*)0x009B5F2C, &newsItem->colour, 256); - RCT2_CALLPROC_X( - 0x006C1F57, - 14, - 1926, - (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right) / 2 + w->x, - w->y + window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].top + 11, - 0, - (int)dpi, - (newsItem->ticks << 16) | (window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].right - window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].left - 62) - ); + x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; + y = w->y + middleOutsetWidget->top + 11; + sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks); x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left; y = w->y + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].top; @@ -635,10 +635,10 @@ static void window_game_bottom_toolbar_draw_tutorial_text(rct_drawpixelinfo *dpi static void window_game_bottom_toolbar_update(rct_window* w){ w->frame_no++; - if (w->frame_no >= 24)w->frame_no = 0; + if (w->frame_no >= 24) + w->frame_no = 0; - // Due to windows not fully finished use callproc to save on duplicate code. - RCT2_CALLPROC_X((int)window_game_bottom_toolbar_unknown05, 0, 0, 0, 0, (int)w, 0, 0); + window_game_bottom_toolbar_invalidate_dirty_widgets(w); } /* rct2: 0x006C644 */ @@ -664,6 +664,12 @@ static void window_game_bottom_toolbar_unknown05(){ window_get_register(w); + window_game_bottom_toolbar_invalidate_dirty_widgets(w); +} + +/* rct2: 0x0066C6F2 */ +static void window_game_bottom_toolbar_invalidate_dirty_widgets(rct_window *w) +{ if (RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) & BTM_TB_DIRTY_FLAG_MONEY){ RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) &= ~BTM_TB_DIRTY_FLAG_MONEY; widget_invalidate(w, WIDX_LEFT_INSET); From 0a1cd305976062c7d18637b3915efc2376f45119 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 28 Jun 2015 04:00:16 +0100 Subject: [PATCH 15/16] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 12 ++++++------ data/language/english_us.txt | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index bc5d1937eb..f8df060fd2 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -42,7 +42,7 @@ STR_0040 :Bewegingssimulator STR_0041 :3D-bioscoop STR_0042 :Topspin STR_0043 :Ruimteringen -STR_0044 :Omgekeerde vrijevalachtbaan +STR_0044 :Achterwaartsevrijevalachtbaan STR_0045 :Lift STR_0046 :Verticale achtbaan STR_0047 :Geldautomaat @@ -51,7 +51,7 @@ STR_0049 :Spookhuis STR_0050 :Eerste hulp STR_0051 :Circus STR_0052 :Spooktrein -STR_0053 :Hyper-twisterachtbaan +STR_0053 :Twisterachtbaan STR_0054 :Houten achtbaan STR_0055 :Zijfrictie-achtbaan STR_0056 :Wilde muis @@ -522,9 +522,9 @@ STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over STR_0521 :Een intense, snelle en kronkelende achtbaan met scherpe bochten en afdalingen. STR_0522 :Een kleinere achtbaan waar de passagiers boven de baan en op het karretje zitten. STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes. -STR_0524 : +STR_0524 :Een vrijevalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. STR_0525 :Passagiers rijden over een kronkelende baan, waarbij ze enkel worden geleid door de ronding en banking van de halfronde baan. -STR_0526 :Een vrijvalwagen wordt pneumatisch langs een hoge stalen toren gelanceerd en gaat daarna in een vrije val weer naar beneden. +STR_0526 :Bezoekers gaan in een roterende observatiecabine langs een toren omhoog STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken. STR_0528 :Passagiers varen in opblaasboten door een kronkelende halfopen of compleet gesloten glijbaan. STR_0529 :Achtbaantreinen in de vorm van een mijntrein razen over stalen achtbaanrails die er uitziet als een oude spoorbaan. @@ -894,7 +894,7 @@ STR_0892 :Screenshot opgeslagen als '{STRINGID}' STR_0893 :Screenshot maken mislukt! STR_0894 :"Landscape data area" zit vol! STR_0895 :Kan niet gedeeltelijk onder en boven de grond bouwen -STR_0896 :{POP16}{POP16}{STRINGID} Constructie +STR_0896 :{POP16}{POP16}Constructie {STRINGID} STR_0897 :Richting STR_0898 :{SMALLFONT}{BLACK}Bocht naar links STR_0899 :{SMALLFONT}{BLACK}Bocht naar rechts @@ -903,7 +903,7 @@ STR_0901 :{SMALLFONT}{BLACK}Bocht naar rechts (kleine straal) STR_0902 :{SMALLFONT}{BLACK}Bocht naar links (zeer kleine straal) STR_0903 :{SMALLFONT}{BLACK}Bocht naar rechts (zeer kleine straal) STR_0904 :{SMALLFONT}{BLACK}Bocht naar links (grote straal) -STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (straal) +STR_0905 :{SMALLFONT}{BLACK}Bocht naar rechts (grote straal) STR_0906 :{SMALLFONT}{BLACK}Recht stuk STR_0907 :Helling STR_0908 :Roll/Banking diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 8e5b3551cc..c2883e1794 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -525,9 +525,9 @@ STR_0520 :A dock platform where guests can drive/row personal watercraft on a STR_0521 :A fast and twisting roller coaster with tight turns and steep drops. Intensity is bound to be high. STR_0522 :A smaller roller coaster where the riders sit above the track with no car around them STR_0523 :Riders travel slowly in powered vehicles along a track-based route -STR_0524 : +STR_0524 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down STR_0525 :Riders career down a twisting track guided only by the curvature and banking of the semi-circular track -STR_0526 :Freefall car is pneumatically launched up a tall steel tower and then allowed to freefall down +STR_0526 :Passengers travel in an rotating observation cabin which travels up a tall tower STR_0527 :A smooth steel-tracked roller coaster capable of vertical loops STR_0528 :Riders travel in inflatable dinghies down a twisting semi-circular or completely enclosed tube track STR_0529 :Mine train themed roller coaster trains career along steel roller coaster track made to look like old railway track From ae4340520ccf5acbd6ee962d9fdd3ea5150cff7b Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 28 Jun 2015 08:20:05 +0200 Subject: [PATCH 16/16] Add more translators to contributors.md --- contributors.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contributors.md b/contributors.md index 7ef94f24ca..d26dadee44 100644 --- a/contributors.md +++ b/contributors.md @@ -65,9 +65,11 @@ Includes all git commit authors. Aliases are GitHub user names. ## Translation * English (UK) - Ted John (IntelOrca), (Tinytimrob) -* French - (fbourigault) -* German - (atmaxinger), (Yepoleb) +* English (US) - Ted John (IntelOrca), Michael Steenbeek (Gymnasiast) +* French - (fbourigault), Michael Steenbeek (Gymnasiast) +* German - (danidoedel), (atmaxinger), (Yepoleb) * Dutch - Michael Steenbeek (Gymnasiast), (hostbrute), (mrtnptrs), (xzbobzx) +* Portuguese (BR) - (kaudy) * Spanish - (mdtrooper) * Swedish - (Jinxit), (mharrys)