From 18879e48eb50a14c071349009ee29df175d74fd2 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 25 Jun 2015 18:12:21 +0100 Subject: [PATCH 01/42] Start implmenting sub_6847BA. Possibly finds drawing center for vehicle? --- src/ride/ride.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/ride/ride.c b/src/ride/ride.c index ace0989439..f639bdb3c2 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4508,3 +4508,76 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) rideIndexArray[it.element->properties.track.ride_index] = true; } } + + +/* rct2: 0x006847BA */ +void sub_6847BA(int base_image_id, int ecx){ + char bitmap[200][200] = { 0 }; + + rct_drawpixelinfo dpi = { + .bits = (char*)bitmap, + .x = -100, + .y = -100, + .width = 200, + .height = 200, + .pitch = 0, + .zoom_level = 0 + }; + + for (int i = 0; i < ecx; ++i){ + gfx_draw_sprite(&dpi, base_image_id + i, 0, 0, 0); + } + int al = -1; + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[j][100 - i] != 0){ + al = i; + break; + } + } + + if (al != -1) + break; + + for (int j = 0; j < 200; j++){ + if (bitmap[j][100 + i] != 0){ + al = i; + break; + } + } + + if (al != -1) + break; + } + + al++; + int bl = -1; + + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[100 - i][j] != 0){ + bl = i; + break; + } + } + + if (bl != -1) + break; + } + bl++; + + int bh = -1; + + for (int i = 99; i != 0; --i){ + for (int j = 0; j < 200; j++){ + if (bitmap[100 + i][j] != 0){ + bh = i; + break; + } + } + + if (bh != -1) + break; + } + bh++; +} \ No newline at end of file From 4b0c84ed20f396efcd8fcfd078dc04acaf4096ac Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 25 Jun 2015 19:46:48 +0200 Subject: [PATCH 02/42] Change stat usage to GetFileAttributesEx --- src/platform/windows.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/platform/windows.c b/src/platform/windows.c index e478b0ea34..f04b8745cb 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -676,9 +676,13 @@ uint16 platform_get_locale_language(){ } time_t platform_file_get_modified_time(char* path){ - struct _stat stat; - _stat(path, &stat); - return stat.st_mtime; + WIN32_FILE_ATTRIBUTE_DATA data; + if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) + return 0; + ULARGE_INTEGER ull; + ull.LowPart = data.ftLastWriteTime.dwLowDateTime; + ull.HighPart = data.ftLastWriteTime.dwHighDateTime; + return ull.QuadPart / 10000000ULL - 11644473600ULL; } uint8 platform_get_locale_currency(){ From 132236f9c89d1ed57b4ca530014dfb943cf77531 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 25 Jun 2015 21:06:50 +0100 Subject: [PATCH 03/42] Tidied up function and labelled. Unsure when this information is used so not completely convinced this has been done correct. --- src/object.c | 21 +++------------------ src/ride/ride.c | 16 +++++++++++++--- src/ride/ride.h | 1 + 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/object.c b/src/object.c index add50ce5fe..84004d2ac2 100644 --- a/src/object.c +++ b/src/object.c @@ -623,27 +623,12 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp // 0x6DEB0D if (!(rideVehicleEntry->var_12 & 0x400)){ - int ecx = cur_vehicle_images_offset - rideVehicleEntry->base_image_id; + int num_images = cur_vehicle_images_offset - rideVehicleEntry->base_image_id; if (rideVehicleEntry->var_12 & 0x2000){ - ecx *= 2; + num_images *= 2; } - int bl, bh, eax = 0; - { - int ebx = rideVehicleEntry->base_image_id; - int edx = 0, esi = 0, ebp = 0, edi = 0; - RCT2_CALLFUNC_X(0x6847BA, &eax, &ebx, &ecx, &edx, &esi, &ebp, &edi); - bl = ebx & 0xFF; - bh = (ebx >> 8) & 0xFF; - } - - if (rideVehicleEntry->var_12 & 0x2000){ - bl += 16; - } - - rideVehicleEntry->var_0E = eax & 0xFF; - rideVehicleEntry->var_0F = bl; - rideVehicleEntry->var_10 = bh; + set_vehicle_type_image_max_sizes(rideVehicleEntry, num_images); } uint8 no_positions = *peep_loading_positions++; diff --git a/src/ride/ride.c b/src/ride/ride.c index f639bdb3c2..47f5fb312f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4511,7 +4511,7 @@ void ride_all_has_any_track_elements(bool *rideIndexArray) /* rct2: 0x006847BA */ -void sub_6847BA(int base_image_id, int ecx){ +void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images){ char bitmap[200][200] = { 0 }; rct_drawpixelinfo dpi = { @@ -4524,8 +4524,8 @@ void sub_6847BA(int base_image_id, int ecx){ .zoom_level = 0 }; - for (int i = 0; i < ecx; ++i){ - gfx_draw_sprite(&dpi, base_image_id + i, 0, 0, 0); + for (int i = 0; i < num_images; ++i){ + gfx_draw_sprite(&dpi, vehicle_type->base_image_id + i, 0, 0, 0); } int al = -1; for (int i = 99; i != 0; --i){ @@ -4580,4 +4580,14 @@ void sub_6847BA(int base_image_id, int ecx){ break; } bh++; + + // Moved from object paint + + if (vehicle_type->var_12 & 0x2000){ + bl += 16; + } + + vehicle_type->var_0E = al; + vehicle_type->var_0F = bl; + vehicle_type->var_10 = bh; } \ No newline at end of file diff --git a/src/ride/ride.h b/src/ride/ride.h index 923a4e540c..89e4217418 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -826,6 +826,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void ride_clear_for_construction(int rideIndex); +void set_vehicle_type_image_max_sizes(rct_ride_type_vehicle* vehicle_type, int num_images); int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); From a05ad7319e25c8e9edb92fe52be57aed02824fb1 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 16:42:12 -0400 Subject: [PATCH 04/42] Fixed themes features duplicate bug --- src/interface/themes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interface/themes.c b/src/interface/themes.c index 2fe2d20e6e..f10aa752f7 100644 --- a/src/interface/themes.c +++ b/src/interface/themes.c @@ -198,6 +198,7 @@ void theme_create_preset(int duplicate, const char *name) for (int i = 0; i < (int)gNumThemeWindows; i++) { gConfigThemes.presets[preset].windows[i] = gConfigThemes.presets[duplicate].windows[i]; } + gConfigThemes.presets[preset].features = gConfigThemes.presets[duplicate].features; themes_save_preset(preset); theme_change_preset(preset); } From 760f0853ea7098688ce3f8e1bc404f152b65ac40 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Thu, 25 Jun 2015 18:15:25 -0400 Subject: [PATCH 05/42] Fixed incorrect filter data --- src/object_list.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/object_list.c b/src/object_list.c index 0b79db46ba..d2a8dc5304 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -277,6 +277,7 @@ void object_list_load() uint32 fileCount = 0; uint32 objectCount = 0; uint32 current_item_offset = 0; + uint32 next_offset = 0; RCT2_GLOBAL(RCT2_ADDRESS_ORIGINAL_RCT2_OBJECT_COUNT, uint32) = 0; log_verbose("building cache of available objects..."); @@ -318,10 +319,13 @@ void object_list_load() rct_object_entry* installed_entry = (rct_object_entry*)(RCT2_GLOBAL(RCT2_ADDRESS_INSTALLED_OBJECT_LIST, uint8*) + current_item_offset); rct_object_filters filter; - current_item_offset += install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter); - _installedObjectFilters[objectCount] = filter; + next_offset = install_object_entry(&entry, installed_entry, enumFileInfo.path, &filter); + if (next_offset) { + current_item_offset += next_offset; - objectCount++; + _installedObjectFilters[objectCount] = filter; + objectCount++; + } } platform_enumerate_files_end(enumFileHandle); } From 210ba2a04d6923e83a49574d7fb51f7080c9145d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 25 Jun 2015 16:48:32 +0100 Subject: [PATCH 06/42] 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 07/42] 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 7527a74d7db2358467f73c244934ce9df11d3e58 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 26 Jun 2015 04:00:19 +0100 Subject: [PATCH 08/42] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 185 +++++++++++++++++++++++------------ data/language/english_us.txt | 137 +++++++++++++++++++------- data/language/german.txt | 139 +++++++++++++++++++------- 3 files changed, 330 insertions(+), 131 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index a9b0fef910..bc5d1937eb 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -510,31 +510,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : -STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten -STR_0515 : -STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven -STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg -STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan -STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten -STR_0520 : -STR_0521 : -STR_0522 : -STR_0523 :Bezoekers rijden langzaam over een baan in aangedreven karretjes +STR_0512 :Een compacte achtbaan met een spiraalvormige kettingheuvel en soepele, kronkelende afdalingen. +STR_0513 :Een achtbaan met loopings waar de passagiers in de karretjes staan. +STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten. +STR_0515 :Een stalen achtbaan met treinen die onder de baan hangen, met veel complexe en kronkelende baanelementen. +STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven. +STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg. +STR_0518 :Passagiers rijden in elektrische treinen over een monorailbaan. +STR_0519 :Passagiers zitten in kleine karretjes die onder een enkele rail hangen en naar buiten zwaaien in de bochten. +STR_0520 :Een aanlegsteiger waar bezoekers in een bootje kunnen gaan om over het water te varen. +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_0525 : -STR_0526 : -STR_0527 :Een soepele stalen achtbaan die verticale loopings kan maken -STR_0528 : -STR_0529 : -STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug -STR_0531 : +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_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. +STR_0530 :Stoeltjes hangen aan een continu draaiende stalen kabel die van het ene uiteinde van de baan naar het andere loopt, en daarna weer terug. +STR_0531 :Een compacte stalen achtbaan waar de trein door schroeven en loopings gaat. STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Go-karts met benzinemotor die de passagiers zelf besturen +STR_0535 :Boten in de vorm van een boomstam varen door een waterbak, waarbij ze van steile hellingen afdalen om de passagiers te doorweken. +STR_0536 :Ronde boten varen door een brede waterbak, waarbij ze de passagiers opwinden door watervallen en schuimende stroomversnellingen. STR_0537 : STR_0538 : STR_0539 : @@ -552,55 +552,55 @@ STR_0550 : STR_0551 : STR_0552 : STR_0553 : -STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station -STR_0555 : -STR_0556 : +STR_0554 :Het karretje wordt het station uitgelanceerd over een lange rechte baan door middel van lineaire inductiemotoren, om daarna recht omhoog te gaan en weer terug te vallen richting het station. +STR_0555 :Bezoekers gaan in een lift in een toren omhoog of omlaag om naar een ander hoogteniveau te komen. +STR_0556 :Extra brede karretjes gaan door over compleet verticale baan voor een ultimate vrijevalbeleving. STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : -STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels -STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime' -STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht -STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen -STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan +STR_0562 :Aangedreven karretjes rijden langs eng decor en special effects over een baan met hoogteverschillen. +STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels. +STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime'. +STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht. +STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen. +STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan. STR_0568 : -STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen +STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen. STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : -STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen +STR_0571 :Ronde karretjes gaan over een zigzaggende houten baan en draaien daarbij rond. +STR_0572 :Boten met een hoge capaciteit varen door een brede waterbak, worden naar boven vervoerd door een lopende band, en gaan met hoge snelheid steile heuvels af om met een grote plons de passagiers te doorweken. +STR_0573 :Aangedreven karretjes in de vorm van een helicopter rijden over een stalen baan, bestuurd door het trappen van de passagiers. +STR_0574 :Passagiers worden door middel van een speciale beugel in een liggende positie vastgehouden, waarna ze op hun rug of met hun gezicht naar de grond door kronkelende stukken baan en omkeringen heen gaan. +STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen. STR_0576 : -STR_0577 : -STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists +STR_0577 :Karrtjes met draaistellen rijden op een houten baan en kunnen omkeren op speciale stukken baan. +STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists. STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :Een gigantische stalen achtbaan die in staat is tot soepele afdalingen en heuvels die hoger zijn dan 90 meter. +STR_0581 :Een ring van stoelen wordt naar de bovenkant van een hoge toren getrokken terwijl hij rustig ronddraait, waarna hij losgelaten wordt in een vrije val, waarna hij beneden rustig wordt afgeremd door middel van magnetische remmen. STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : -STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen -STR_0587 : -STR_0588 : +STR_0584 :Speciale fietsen rijden over een stalen monorail, voortbewogen door het trappen van de passagiers. +STR_0585 :Passagiers zitten in stoelparen die onder de baan hangen terwijl ze door kronkelende en scherpe omkeringen gaan. +STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen. +STR_0587 :Na een enerverende pneumatische lancering rijdt de trein met hogere snelheid over een verticale baan, over de top, en vervolgens over de andere kant weer naar beneden om terug te keren naar het station. +STR_0588 :Losse karretjes hangen onder een zigzaggende baan met haarspeldbochten en scherpe afdalingen. STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Passagiers rijden over een onderwaterparcours in onderzeeërs. +STR_0591 :Boten in de vorm van een vlot varen rustig door een waterbak. STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : -STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen -STR_0600 : +STR_0598 :Omgekeerde achtbaantrein worden het station uit gelanceerd en gaan een verticale kronkelende baan op, waarna ze terugzakken, door het station heengaan en achteruit een ander stuk verticale baan opgaan. +STR_0599 :Een compacte achtbaan met individuele karretjes en steile, kronkelende afdalingen. +STR_0600 :Aangedreven mijntreinen rijden over een soepele en kronkelende baan. STR_0601 : -STR_0602 : +STR_0602 :Achtbaantreinen worden door lineaire inductiemotoren het station uit gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. STR_0603 :Bezoeker {INT32} STR_0604 :Bezoeker {INT32} STR_0605 :Bezoeker {INT32} @@ -3449,7 +3449,7 @@ STR_3446 :Werkgebied wissen #Start van OpenRCT2-indices STR_5120 :'Financiën'-knop in de werkbalk tonen STR_5121 :'Onderzoek'-knop in de werkbalk tonen -STR_5122 :Alle voertuigen met hetzelfde baan-/attractietype tonen +STR_5122 :Attracties op baantype sorteren STR_5123 :Attr. vernieuwen STR_5124 :Six Flags weg STR_5125 :Afbreekbaar maken @@ -3496,7 +3496,7 @@ STR_5163 :Maand/dag/jaar STR_5164 :Twitch-kanaalnaam STR_5165 :Bezoekers namen van volgers geven STR_5166 :Geeft bezoekers namen van gebruikers die het Twitch-kanaal volgen. -STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengebied +STR_5167 :Bez. met Twitch-volgersnamen volgen in berichtengeb. STR_5168 :Zet het bezoekersvolgsysteem aan voor bezoekers die naar Twitch-volgers zijn genoemd. STR_5169 :Bez. namen van gebruikers in de Twitch-chat geven STR_5170 :Geeft bezoekers namen van gebruikers in de Twitch-chat. @@ -3507,15 +3507,15 @@ STR_5174 :Zal chatberichten op Twitch die beginnen met !news in het berichten STR_5175 :Voer de naam van je Twitch-kanaal in STR_5176 :Twitch-integratie inschakelen STR_5177 :Schermmodus: -STR_5178 :{SMALLFONT}{BLACK}Show financial cheats -STR_5179 :{SMALLFONT}{BLACK}Show guest cheats -STR_5180 :{SMALLFONT}{BLACK}Show park cheats -STR_5181 :{SMALLFONT}{BLACK}Show ride cheats +STR_5178 :{SMALLFONT}{BLACK}Cheats voor financiën +STR_5179 :{SMALLFONT}{BLACK}Cheats voor gasten +STR_5180 :{SMALLFONT}{BLACK}Cheats voor park +STR_5181 :{SMALLFONT}{BLACK}Cheats voor attracties STR_5182 :{INT32} STR_5183 :Basishoogte -STR_5184 :Enter base height between {COMMA16} and {COMMA16} +STR_5184 :Voer een basishoogte tussen {COMMA16} en {COMMA16} in STR_5185 :Waterniveau -STR_5186 :Enter water level between {COMMA16} and {COMMA16} +STR_5186 :Voer een waterniveau tussen {COMMA16} en {COMMA16} in STR_5187 :Financiën STR_5188 :Nieuwe advertentiecampagne STR_5189 :Onderzoek @@ -3706,3 +3706,68 @@ STR_5373 :Naam {STRINGID} STR_5374 :Datum {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Opgeslagen spellen +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Ga naar volgend Wacht-commando +STR_5380 :{SMALLFONT}{BLACK}Start het afspelen van de titelpresentatie +STR_5381 :{SMALLFONT}{BLACK}Stopt het afspelen van de titelpresentatie +STR_5382 :{SMALLFONT}{BLACK}Titelpresentatie herstarten +STR_5383 :{SMALLFONT}{BLACK}Een nieuwe titelpresentatie aanmaken die is gebaseerd op de huidige +STR_5384 :{SMALLFONT}{BLACK}Huidige titelpresentatie verwijderen +STR_5385 :{SMALLFONT}{BLACK}Huidige titelpresentatie hernoemen +STR_5386 :{SMALLFONT}{BLACK}Nieuw commando invoegen +STR_5387 :{SMALLFONT}{BLACK}Geselecteerd commando bewerken +STR_5388 :{SMALLFONT}{BLACK}Geselecteerd commando verwijderen +STR_5389 :{SMALLFONT}{BLACK}Naar geselecteerd commando titelpresentatie springen +STR_5390 :{SMALLFONT}{BLACK}Geselecteerd commando naar beneden verplaatsen +STR_5391 :{SMALLFONT}{BLACK}Geselecteerd commando naar boven verplaatsen +STR_5392 :{SMALLFONT}{BLACK}Opgeslagen spel aan titelpresentatie toevoegen +STR_5393 :{SMALLFONT}{BLACK}Geselecteerd opgeslagen spel uit titelpresentatie verwijderen +STR_5394 :{SMALLFONT}{BLACK}Opgeslagen spel hernoemen +STR_5395 :{SMALLFONT}{BLACK}Opgeslagen spel laden +STR_5396 :{SMALLFONT}{BLACK}Titelpresentatie herladen als ze buiten het spel om is aangepast +STR_5397 :Kan enkel in het titelscherm worden gebruikt +STR_5398 :Kan de titelpresentatie niet aanpassen wanneer deze wordt afgespeeld +STR_5399 :Klik op Stop om verder te gaan met aanpassen +STR_5400 :Kan deze titelpresentatie niet aanpassen +STR_5401 :Een nieuwe titelpresentatie aanmaken om wijzigingen aan te brengen +STR_5402 :Kan titelpresentatie niet laden +STR_5403 :Er is mogelijk geen Laad- or Wacht-commando of één van de opgeslagen spellen is mogelijk beschadigd +STR_5404 :Naam bestaat al +STR_5405 :Voer een naam in voor het opgeslagen spel +STR_5406 :Voer een naam in voor de titelpresentatie +STR_5407 :Toevoegen +STR_5408 :Verwijderen +STR_5409 :Invoegen +STR_5410 :Bewerken +STR_5411 :Herladen +STR_5412 :Spring naar +STR_5413 :Laad +STR_5414 :Laad{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Laad{MOVE_X}{87}{STRING} +STR_5416 :Laad{MOVE_X}{87}Geen opgeslagen spel geselecteerd +STR_5417 :Locatie +STR_5418 :Locatie{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Draai +STR_5420 :Draai{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wacht +STR_5424 :Wacht{MOVE_X}{87}{COMMA16} +STR_5425 :Herstarten +STR_5426 :Einde +STR_5427 :Coördinaten: +STR_5428 :Aant. draaiingen tegen de klok: +STR_5429 :Zoomniveau: +STR_5430 :Te wachten seconden: +STR_5431 :Te laden opgeslagen spel: +STR_5432 :Commando: +STR_5433 :Titlepresentaties +STR_5434 :Commandobewerker +STR_5435 :Opgeslagen spel hernoemen +STR_5436 :Titelpresentaties bewerekn... +STR_5437 :Geen opgeslagen spel geselecteerd +STR_5438 :Kan geen wijzigingen aanbrengen wanneer de commandobewerker open is +STR_5439 :Er is een herstart gebruikt zonder Wacht-commando +STR_5440 :Volledig scherm minimaliseren bij focusverlies +STR_5441 :{SMALLFONT}{BLACK}Sorteert attracties per baantype,{NEWLINE}zodat achteraf wisselen van treintypes mogelijk{NEWLINE}wordt, zoals in RCT1. diff --git a/data/language/english_us.txt b/data/language/english_us.txt index d82fe466aa..8e5b3551cc 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. +STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners -STR_0515 : +STR_0515 :A steel roller coaster with trains that are held beneath the track, with many complex and twisting track elements STR_0516 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_0517 :Passengers ride in miniature trains along a narrow-gauge railway track STR_0518 :Passengers travel in electric trains along a monorail track STR_0519 :Passengers ride in small cars hanging beneath the single-rail track, swinging freely from side to side around corners -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :A dock platform where guests can drive/row personal watercraft on a body of water +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_0525 : -STR_0526 : +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_0527 :A smooth steel-tracked roller coaster capable of vertical loops -STR_0528 : -STR_0529 : +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 STR_0530 :Cars hang from a steel cable which runs continuously from one end of the ride to the other and back again -STR_0531 : +STR_0531 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Self-drive petrol-engined go karts +STR_0535 :Log-shaped boats travel along a water channel, splashing down steep slopes to soak the riders +STR_0536 :Circular boats meander along a wide water channel, splashing through waterfalls and thrilling riders through foaming rapids STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :The car is accelerated out of the station along a long level track using Linear Induction Motors, then heads straight up a vertical spike of track, freefalling back down to return to the station -STR_0555 : -STR_0556 : +STR_0555 :Guests ride in an elevator up or down a vertical tower to get from one level to another +STR_0556 :Extra-wide cars descend completely vertical sloped track for the ultimate freefall roller coaster experience STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Powered cars travel along a multi-level track past spooky scenery and special effects STR_0563 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills STR_0564 :Running on wooden track, this coaster is fast, rough, noisy, and gives an 'out of control' riding experience with plenty of 'air time' STR_0565 :A simple wooden roller coaster capable of only gentle slopes and turns, where the cars are only kept on the track by side friction wheels and gravity @@ -572,38 +572,38 @@ STR_0567 :Sitting in seats suspended either side of the track, riders are pit STR_0568 : STR_0569 :Riding in special harnesses below the track, riders experience the feeling of flight as they swoop through the air STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Circular cars spin around as they travel along the zig-zagging wooden track +STR_0572 :Large capacity boats travel along a wide water channel, propelled up slopes by a conveyer belt, accelerating down steep slopes to soak the riders with a gaint splash +STR_0573 :Powered helicoper shaped cars running on a steel track, controlled by the pedalling of the riders +STR_0574 :Riders are held in special harnesses in a lying-down position, travlling through twisted track and inversions either on their backs or facing the ground STR_0575 :Powered trains hanging from a single rail transport people around the park STR_0576 : -STR_0577 : +STR_0577 :Bogied cars run on wooden tracks, turning around on special reversing sections STR_0578 :Cars run along track enclosed by circular hoops, traversing steep drops and heartline twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :A giant steel roller coaster capable of smooth drops and hills of over 300ft +STR_0581 :A ring of seats is pulled to the top of a tall tower while gently rotating, then allowed to free-fall down, stopping gently at the bottom using magnetic brakes STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Special bicycles run on a steel monorail track, propelled by the pedalling of the riders +STR_0585 :Riders sit in pairs of seats suspended beneath the track as they loop and twist through tight inversions STR_0586 :Boat shaped cars run on roller coaster track to allow twisting curves and steep drops, splashing down into sections of water for gentle river sections -STR_0587 : -STR_0588 : +STR_0587 :After an exhilarating air-powered launch, the train speeds up a vertical track, over the top, and vertically down the other side to return to the station +STR_0588 :Individual cars run beneath a zig-zagging track with hairpin turns and sharp drops STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Riders ride in a submerged submarine through an underwater course +STR_0591 :Raft-shaped boats gently meander around a river track STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Inverted roller coaster trains are accelerated out of the station to travel up a vertical spike of track, then reverse back through the station to travel backwards up another vertical spike of track STR_0599 :A compact roller coaster with individual cars and smooth twisting drops -STR_0600 : +STR_0600 :Powered mine trains career along a smooth and twisted track layout STR_0601 : -STR_0602 : +STR_0602 :Roller coaster trains are accelerated out of the station by linear induction motors to speed through twisting inversions STR_0603 :Guest {INT32} STR_0604 :Guest {INT32} STR_0605 :Guest {INT32} @@ -3458,7 +3458,7 @@ STR_3446 :Cancel Patrol Area # New strings, cleaner STR_5120 :Show finances button on toolbar STR_5121 :Show research button on toolbar -STR_5122 :Show all vehicles sharing a track/ride type +STR_5122 :Select rides by track type (like in RCT1) STR_5123 :Renew rides STR_5124 :No Six Flags STR_5125 :All destructable @@ -3711,3 +3711,72 @@ STR_5369 :Park parameters... STR_5370 :{SMALLFONT}{BLACK}Click this button to modify park{NEWLINE}parameters like restrictions,{NEWLINE}guest generation and money. STR_5371 :Object Selection STR_5372 :Invert right mouse dragging +STR_5373 :Name {STRINGID} +STR_5374 :Date {STRINGID} +STR_5375 :{UP} +STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Saves +STR_5378 :{SMALLFONT}{BLACK}Script +STR_5379 :{SMALLFONT}{BLACK}Skip to next wait command +STR_5380 :{SMALLFONT}{BLACK}Start playing title sequence +STR_5381 :{SMALLFONT}{BLACK}Stop playing title sequence +STR_5382 :{SMALLFONT}{BLACK}Restart title sequence +STR_5383 :{SMALLFONT}{BLACK}Create a new title sequence based on the current one +STR_5384 :{SMALLFONT}{BLACK}Delete the current title sequence +STR_5385 :{SMALLFONT}{BLACK}Rename the current title sequence +STR_5386 :{SMALLFONT}{BLACK}Insert a new command +STR_5387 :{SMALLFONT}{BLACK}Edit the selected command +STR_5388 :{SMALLFONT}{BLACK}Delete the selected command +STR_5389 :{SMALLFONT}{BLACK}Skip to the selected command in the title sequence +STR_5390 :{SMALLFONT}{BLACK}Move the selected command down +STR_5391 :{SMALLFONT}{BLACK}Move the selected command up +STR_5392 :{SMALLFONT}{BLACK}Add a save to the title sequence +STR_5393 :{SMALLFONT}{BLACK}Remove the selected save from the title sequence +STR_5394 :{SMALLFONT}{BLACK}Rename the selected save +STR_5395 :{SMALLFONT}{BLACK}Load the selected save in game +STR_5396 :{SMALLFONT}{BLACK}Reload the title sequence if changes have been made to it outside of the game +STR_5397 :Can only be used on the title screen +STR_5398 :Cannot edit title sequence while it's playing +STR_5399 :Press the stop button to continue editing +STR_5400 :Can't change this title sequence +STR_5401 :Create a new title sequence to make changes to +STR_5402 :Failed to load title sequence +STR_5403 :There may be no Load or Wait command or a save may be invalid +STR_5404 :Name already exists +STR_5405 :Enter a name for the save +STR_5406 :Enter a name for the title sequence +STR_5407 :Add +STR_5408 :Remove +STR_5409 :Insert +STR_5410 :Edit +STR_5411 :Reload +STR_5412 :Skip to +STR_5413 :Load +STR_5414 :Load{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Load{MOVE_X}{87}{STRING} +STR_5416 :Load{MOVE_X}{87}No save selected +STR_5417 :Location +STR_5418 :Location{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Rotate +STR_5420 :Rotate{MOVE_X}{87}{COMMA16} +STR_5421 :Zoom +STR_5422 :Zoom{MOVE_X}{87}{COMMA16} +STR_5423 :Wait +STR_5424 :Wait{MOVE_X}{87}{COMMA16} +STR_5425 :Restart +STR_5426 :End +STR_5427 :Coordinates: +STR_5428 :Counter-clockwise rotations: +STR_5429 :Zoom level: +STR_5430 :Seconds to wait: +STR_5431 :Save to load: +STR_5432 :Command: +STR_5433 :Title Sequences +STR_5434 :Command Editor +STR_5435 :Rename save +STR_5436 :Edit Title Sequences... +STR_5437 :No save selected +STR_5438 :Can't make changes while command editor is open +STR_5439 :A restart is used without a wait command +STR_5440 :Minimize fullscreen on focus loss +STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. diff --git a/data/language/german.txt b/data/language/german.txt index 01864bc2dd..1da26e6c23 100644 --- a/data/language/german.txt +++ b/data/language/german.txt @@ -513,31 +513,31 @@ STR_0508 : STR_0509 : STR_0510 : STR_0511 : -STR_0512 : -STR_0513 : +STR_0512 :Eine kompakte Stahlachterbahn mit einem Spirallifthügel und Wagen mit Sitzen in einer Reihe +STR_0513 :Eine Looping-Achterbahn, bei der sich die Fahrgäste in einer stehenden Position befinden STR_0514 :Die unterhalb der Schiene aufgehängten Züge schwingen in Kurven seitlich aus. -STR_0515 : +STR_0515 :Die Fahrgäste sind in Sitzen, die unter den Schienen hängen und durch riesige Schleifen, Kurven und große Gefälle rasen STR_0516 :Eine gemäßigte Achterbahn für Leute, die noch nicht den Mut für längere Bahnen haben STR_0517 :Die Fahrgäste sitzen in Miniaturzügen, die auf einer schmalen Schienenstrecke fahren STR_0518 :Die Passagiere fahren in elektrischen Zügen auf einer Einschienenstrecke STR_0519 :Die Fahrgäste sitzen in kleinen, an einer Einschienenstrecke aufgehängten Wagen, die in Kurven seitlich frei schwingen -STR_0520 : -STR_0521 : -STR_0522 : +STR_0520 :Die Fahrgäste können ihr persönliches Wasserfahrzeug über das Wasser steuern +STR_0521 :Kleine mausförmige Wagen fahren auf einer Holzstrecke, wobei sich die Wagen in Haarnadelkurven und steilen Senken neigen +STR_0522 :Eine kleinere Achterbahn, auf der die Passagiere über der Strecke sitzen, ohne von einem Wagen umgeben zu sein STR_0523 :Die Passagiere sitzen in langsam angetriebenen Wagen auf einer Schienenstrecke -STR_0524 : -STR_0525 : -STR_0526 : +STR_0524 :Der Freefall-Wagen wird mit Druckluft einen hohen Stahlturm hochgeschossen, von wo er dann im freien Fall nach unten saust +STR_0525 :Die Passagiere fahren, nur von der Krümmung und der seitlichen Neigung der halbkreisförmigen Strecke geführt, auf einer verdrehten Strecke +STR_0526 :Rotierende Aussichtskabine, die sich an einem hohen Turm hinauf bewegt STR_0527 :Eine gemäßigte Stahlachterbahn, bei der vertikale Schleifen möglich sind -STR_0528 : -STR_0529 : +STR_0528 :Die Passagiere fahren in Schlauchbooten eine sich windende, halbkreisförmige oder komplett in sich geschlossene Rohrstrecke herunter +STR_0529 :Minenachterbahnzüge fahren auf Stahlschienen, die so aussehen wie alte Zugschienen STR_0530 :Die Wagen hängen an einem Stahlseil, das durchgängig von einem Streckenende zum anderen und wieder zurück führt -STR_0531 : +STR_0531 :Eine kompakte Stahlachterbahn, bei der der Zug durch Schrauben und Schleifen fährt STR_0532 : STR_0533 : -STR_0534 : -STR_0535 : -STR_0536 : +STR_0534 :Selbstbetriebene Benzin-Go-Karts +STR_0535 :Baumstammförmige Boote fahren in einem Wasserkanal und rutschen steile Gefälle herunter, damit die Fahrgäste unten nass werden +STR_0536 :Runde Boote gleiten durch einen breiten Wasserkanal, zischen durch Wasserfälle und schäumende Stromschnellen STR_0537 : STR_0538 : STR_0539 : @@ -556,14 +556,14 @@ STR_0551 : STR_0552 : STR_0553 : STR_0554 :Der Wagen wird mit Hilfe von linearen Induktionsmotoren aus der Station entlang einer langen, ebenen Bahn beschleunigt und dann vertikal nach oben geschossen, von wo er wieder im freien Fall zur Station zurückzukehrt -STR_0555 : -STR_0556 : +STR_0555 :Die Besucher fahren in einem Aufzug einen Turm hinauf oder hinab, um in ein anderes Stockwerk zu gelangen +STR_0556 :Besonders breite Wagen fallen eine vollständige Vertikale herunter - das ultimative Erlebnis des freien Falls STR_0557 : STR_0558 : STR_0559 : STR_0560 : STR_0561 : -STR_0562 : +STR_0562 :Angetriebene Wagen fahren auf einer mehrstöckigen Strecke mit gruseliger Landschaft und Spezialeffekten STR_0563 :Die Fahrgäste sitzen in komfortablen Wagen mit einfachen Beckenhalterungen, in denen sie gigantische, gemäßigte Gefälle erleben, aber auch viel Zeit oben `in der Luft' verbringen STR_0564 :Diese Holzachterbahn ist schnell, rauh, laut und gibt einem das Gefühl, außer Kontrolle zu sein, wobei man häufig `in der Luft' ist STR_0565 :Eine einfache Holzachterbahn mit nur leichten Gefällen und Kurven, bei der die Wagen nur mit Hilfe von seitlichen Führungsrollen und der Schwerkraft auf der Strecke gehalten werden @@ -572,38 +572,38 @@ STR_0567 :Die Passagiere befinden sich in Sitzen, die an beiden Seiten der Ba STR_0568 : STR_0569 :Die Passagiere, die in speziellen Vorrichtungen unter der Schiene fahren, haben das Gefühl zu fliegen, während sie durch die Lüfte sausen STR_0570 : -STR_0571 : -STR_0572 : -STR_0573 : -STR_0574 : +STR_0571 :Runde Wagen drehen sich auf der Zickzack-Holzstrecke +STR_0572 :Große Boote bewegen sich in einem breiten Wasserkanal, fahren von einem Fließband befördert Anstiege hoch und sausen steile Gefälle hinunter, damit die Fahrgäste mit einem gigantischen Platscher durchnässt werden +STR_0573 :Helikopterförmige Wagen fahren auf einer Stahlstrecke und werden von den Pedaltritten der Fahrer angetrieben +STR_0574 :Die Passagiere befinden sich in speziellen Haltevorrichtungen in liegender Position (entweder auf dem Rücken oder dem Bauch) und fahren auf einer gewundenen Strecke mit Überkopfteilen STR_0575 :Angetriebene Züge, die von einem einzelnen Gleis hängen, befördern die Fahrgäste durch den Park STR_0576 : -STR_0577 : +STR_0577 :Wagen mit Drehgestell fahren auf einer Holzstrecke und rotieren dabei auf speziellen Umkehrabschnitten STR_0578 :Die Wagen fahren auf einer Strecke mit kreisförmigen Reifen, steilen Gefällen und Heartline-Twists STR_0579 : -STR_0580 : -STR_0581 : +STR_0580 :Eine gigantische Stahlachterbahn mit gemäßigten Gefällen und Anstiegen von über 90 Meter +STR_0581 :Ein Ring mit Sitzen, der zur Spitze eines hohen Turms gezogen wird, während er sich leicht dreht, und dann im freien Fall heruntersaust, wobei er unten sanft von Magnetbremsen angehalten wird STR_0582 : STR_0583 : -STR_0584 : -STR_0585 : +STR_0584 :Spezielle Fahrräder fahren auf einer einschienigen Stahlstrecke und werden von den Passagieren angetrieben, indem sie in die Pedale treten +STR_0585 :Die Fahrgäste hängen in Sitzpaaren unter der Strecke und fahren Schleifen und Wendungen durch enge Kurven STR_0586 :Wagen in Bootsform laufen auf einer gewundenen Achterbahn mit steilen Gefällen, wobei sie in Wasserabschnitte klatschen, die in gemäßigtere Flussbereiche führen -STR_0587 : -STR_0588 : +STR_0587 :Nach einem atemberaubenden luftbetriebenen Start schnellt der Zug eine vertikale Strecke hoch, über die Spitze und auf der anderen Seite vertikal nach unten zurück zur Station +STR_0588 :Einzelne Wagen fahren unter einer Zickzack-Strecke mit Haarnadelkurven und steilen Gefällen STR_0589 : -STR_0590 : -STR_0591 : +STR_0590 :Die Fahrgäste fahren in einem U-Boot auf einer Unterwasserstrecke +STR_0591 :Floßförmige Boote winden sich sanft durch eine Flussstrecke STR_0592 : STR_0593 : STR_0594 : STR_0595 : STR_0596 : STR_0597 : -STR_0598 : +STR_0598 :Umgekehrte Achterbahnzüge werden aus der Station beschleunigt und rasen ein vertikales Streckenstück hinauf, sausen wieder hinab durch die Station und fahren einen anderen vertikalen Streckenabschnitt hinauf STR_0599 :Eine kompakte Achterbahn mit unabhängigen Wagen und gemäßigten, sich windenden Gefällen -STR_0600 : +STR_0600 :Angetriebene Minenzüge fahren auf einer gemäßigten und verwundenen Strecke STR_0601 : -STR_0602 : +STR_0602 :Achterbahnzüge werden aus der Station mit Hilfe von linearen Induktionsmotoren beschleunigt und rasen durch gewundene Überkopfteile STR_0603 :Besucher {INT32} STR_0604 :Besucher {INT32} STR_0605 :Besucher {INT32} @@ -3455,7 +3455,7 @@ STR_3446 :Patrouillenbereich verwerfen # New strings, cleaner STR_5120 :Finanzen in der Symbolleiste anzeigen STR_5121 :Forschung in der Symbolleiste anzeigen -STR_5122 :Fahrzeuge gleicher Strecke/Bahnart anzeigen +STR_5122 :Bahnen nach Streckentyp auswählen (wie in RCT1) STR_5123 :Bahnen erneuern STR_5124 :Keine Six Flags STR_5125 :Alles zerstörbar @@ -3508,7 +3508,7 @@ STR_5171 :Überwache Chat-Parkbesucher STR_5172 :{SMALLFONT}{BLACK}Überwachungsinformationen zu Parkbesuchern, die nach Twitch-Chatbenutzern benannt sind, einschalten - (Bei eingeschalteter Überwachung werden Besucheraktivitäten im Nachrichtenbereich angezeigt) STR_5173 :Erhalte Twitch-Chat als Spielnachrichten STR_5174 :{SMALLFONT}{BLACK}Benutzt Twitch-Chatnachrichten, welchen !news vorangestellt ist, für Spielbenachrichtigungen -STR_5175 :Name Ihres Twitch-Kanals eingeben: +STR_5175 :Namen Ihres Twitch-Kanals eingeben: STR_5176 :Twitch-Integration aktivieren STR_5177 :Vollbildmodus: STR_5178 :{SMALLFONT}{BLACK}Cheats für Finanzen anzeigen @@ -3573,7 +3573,7 @@ STR_5236 :Fenster: STR_5237 :Farbpalette: STR_5238 :Aktuelles Thema: STR_5239 :Duplizieren -STR_5240 :Name für Thema eingeben: +STR_5240 :Namen für Thema eingeben: STR_5241 :Dieses Thema kann nicht geändert werden STR_5242 :Dieser Themenname existiert bereits STR_5243 :Unzulässige Zeichen benutzt @@ -3710,3 +3710,68 @@ STR_5373 :Name {STRINGID} STR_5374 :Datum {STRINGID} STR_5375 :{UP} STR_5376 :{DOWN} +STR_5377 :{SMALLFONT}{BLACK}Gespeicherte Spiele +STR_5378 :{SMALLFONT}{BLACK}Skript +STR_5379 :{SMALLFONT}{BLACK}Zum nächsten `Warten'-Befehl springen +STR_5380 :{SMALLFONT}{BLACK}Titelsequenz abspielen +STR_5381 :{SMALLFONT}{BLACK}Titelsequenz stoppen +STR_5382 :{SMALLFONT}{BLACK}Titelsequenz neu starten +STR_5383 :{SMALLFONT}{BLACK}Neue Titelsequenz durch duplizieren der aktuellen Titelsequenz erstellen +STR_5384 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz löschen +STR_5385 :{SMALLFONT}{BLACK}Aktuelle Titelsequenz umbenennen +STR_5386 :{SMALLFONT}{BLACK}Neuen Befehl einfügen +STR_5387 :{SMALLFONT}{BLACK}Ausgewählten Befehl bearbeiten +STR_5388 :{SMALLFONT}{BLACK}Ausgewählten Befehl löschen +STR_5389 :{SMALLFONT}{BLACK}Zum ausgewählten Befehl in{NEWLINE}der Titelsequenz springen +STR_5390 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach oben verschieben +STR_5391 :{SMALLFONT}{BLACK}Ausgewählten Befehl nach unten verschieben +STR_5392 :{SMALLFONT}{BLACK}Einen Spielstand zur Titelsequenz hinzufügen +STR_5393 :{SMALLFONT}{BLACK}Ausgewählten Spielstand von{NEWLINE}Titelsequenz entfernen +STR_5394 :{SMALLFONT}{BLACK}Ausgewählten Spielstand umbenennen +STR_5395 :{SMALLFONT}{BLACK}Ausgewählten Spielstand laden +STR_5396 :{SMALLFONT}{BLACK}Titelsequenz neu laden, falls sie außerhalb des Spiels geändert wurde +STR_5397 :Kann nur im Titelbildschirm verwendet werden +STR_5398 :Titelsequenz kann, während sie läuft, nicht geändert werden +STR_5399 :Titelsequenz stoppen, um das Bearbeiten fortzusetzen +STR_5400 :Diese Titelsequenz kann nicht geändert werden +STR_5401 :Erstellen Sie eine neue Titelsequenz, um sie zu bearbeiten +STR_5402 :Titelsequenz konnte nicht geladen werden +STR_5403 :Möglicherweise kein `Laden'-Befehl, `Warten'-Befehl oder ein ungültiger Spielstand vorhanden +STR_5404 :Dieser Name existiert bereits +STR_5405 :Namen für Spielstand eingeben: +STR_5406 :Namen für Titelsequenz eingeben: +STR_5407 :Hinzufügen +STR_5408 :Entfernen +STR_5409 :Einfügen +STR_5410 :Bearbeiten +STR_5411 :Neu laden +STR_5412 :Springen zu +STR_5413 :Laden +STR_5414 :Laden{MOVE_X}{87}Six Flags Magic Mountain.SC6 +STR_5415 :Laden{MOVE_X}{87}{STRING} +STR_5416 :Laden{MOVE_X}{87}Kein Spielstand ausgewählt +STR_5417 :Position +STR_5418 :Position{MOVE_X}{87}{COMMA16} {COMMA16} +STR_5419 :Drehen +STR_5420 :Drehen{MOVE_X}{87}{COMMA16} +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_5426 :Ende +STR_5427 :Koordinaten: +STR_5428 :Drehungen gegen Uhrzeigersinn: +STR_5429 :Zoomstufe: +STR_5430 :Zu wartende Sekunden: +STR_5431 :Zu ladender Spielstand: +STR_5432 :Befehl: +STR_5433 :Titelsequenzen +STR_5434 :Befehlseditor +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_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 From d74885cc1813442aecd0a7a74d41a579b55fba82 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:01:50 +0200 Subject: [PATCH 09/42] show/hide UI #1402 --- data/language/english_uk.txt | 1 + src/config.c | 1 + src/config.h | 1 + src/interface/keyboard_shortcut.c | 15 +++++++++++++++ src/interface/viewport.h | 2 +- src/localisation/string_ids.h | 1 + 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 0a2e5fd020..9ffd140a65 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,3 +3780,4 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get +STR_5448 :Remove toolbar diff --git a/src/config.c b/src/config.c index 3fdde76f90..06523cf7ff 100644 --- a/src/config.c +++ b/src/config.c @@ -929,6 +929,7 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE SDL_SCANCODE_V, // SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE + SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE SDL_SCANCODE_3, // SHORTCUT_SEE_THROUGH_RIDES_TOGGLE SDL_SCANCODE_4, // SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE SDL_SCANCODE_5, // SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE diff --git a/src/config.h b/src/config.h index 6f5a85b991..8f000f488c 100644 --- a/src/config.h +++ b/src/config.h @@ -44,6 +44,7 @@ enum { SHORTCUT_UNDERGROUND_VIEW_TOGGLE, SHORTCUT_REMOVE_BASE_LAND_TOGGLE, SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, + SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index c2e65483c2..cbb7936d55 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -228,6 +228,20 @@ static void shortcut_remove_vertical_land_toggle() toggle_view_flag(VIEWPORT_FLAG_HIDE_VERTICAL); } +static void shortcut_remove_top_bottom_toolbar_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR); + + if (window_get_main()->viewport->flags & VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR){ + window_close(window_find_by_class(WC_TOP_TOOLBAR)); + window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); + } + else { + window_top_toolbar_open(); + window_game_bottom_toolbar_open(); + } +} + static void shortcut_see_through_rides_toggle() { toggle_view_flag(VIEWPORT_FLAG_SEETHROUGH_RIDES); @@ -463,6 +477,7 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_underground_view_toggle, shortcut_remove_base_land_toggle, shortcut_remove_vertical_land_toggle, + shortcut_remove_top_bottom_toolbar_toggle, shortcut_see_through_rides_toggle, shortcut_see_through_scenery_toggle, shortcut_invisible_supports_toggle, diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 429b91602e..f38f7adc33 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -41,7 +41,7 @@ enum { VIEWPORT_FLAG_HIDE_BASE = (1 << 12), VIEWPORT_FLAG_HIDE_VERTICAL = (1 << 13), VIEWPORT_FLAG_INVISIBLE_SPRITES = (1 << 14), - VIEWPORT_FLAG_15 = (1 << 15) + VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR = (1 << 15), }; enum { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index a1029e0da5..7190889aff 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -129,6 +129,7 @@ enum { STR_UNDERGROUND_VIEW = 939, STR_REMOVE_BASE_LAND = 940, STR_REMOVE_VERTICAL_FACES = 941, + STR_REMOVE_TOP_BOTTOM_BAR = 5448, STR_SEE_THROUGH_RIDES = 942, STR_SEE_THROUGH_SCENERY = 943, From 1f5fd4fe67a1f1c92c55af27a23c9d1c6ee4e672 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:26:29 +0200 Subject: [PATCH 10/42] Reorder shortcut --- src/config.c | 4 ++-- src/config.h | 2 +- src/interface/keyboard_shortcut.c | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 06523cf7ff..75e9c1dde0 100644 --- a/src/config.c +++ b/src/config.c @@ -929,7 +929,6 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE SDL_SCANCODE_V, // SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE - SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE SDL_SCANCODE_3, // SHORTCUT_SEE_THROUGH_RIDES_TOGGLE SDL_SCANCODE_4, // SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE SDL_SCANCODE_5, // SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE @@ -955,7 +954,8 @@ static const uint16 _defaultShortcutKeys[SHORTCUT_COUNT] = { // New SDL_SCANCODE_MINUS, // SHORTCUT_REDUCE_GAME_SPEED, SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, - 0x0200 | 0x0400 | SDL_SCANCODE_C // SHORTCUT_OPEN_CHEAT_WINDOW, + 0x0200 | 0x0400 | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, + SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, }; /** diff --git a/src/config.h b/src/config.h index 8f000f488c..8c70b4b64b 100644 --- a/src/config.h +++ b/src/config.h @@ -44,7 +44,6 @@ enum { SHORTCUT_UNDERGROUND_VIEW_TOGGLE, SHORTCUT_REMOVE_BASE_LAND_TOGGLE, SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, - SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, @@ -71,6 +70,7 @@ enum { SHORTCUT_REDUCE_GAME_SPEED, SHORTCUT_INCREASE_GAME_SPEED, SHORTCUT_OPEN_CHEAT_WINDOW, + SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, SHORTCUT_COUNT }; diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index cbb7936d55..6aa94b916a 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -477,7 +477,6 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_underground_view_toggle, shortcut_remove_base_land_toggle, shortcut_remove_vertical_land_toggle, - shortcut_remove_top_bottom_toolbar_toggle, shortcut_see_through_rides_toggle, shortcut_see_through_scenery_toggle, shortcut_invisible_supports_toggle, @@ -499,9 +498,12 @@ static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { shortcut_show_recent_messages, shortcut_show_map, shortcut_screenshot, + + //new shortcut_reduce_game_speed, shortcut_increase_game_speed, - shortcut_open_cheat_window + shortcut_open_cheat_window, + shortcut_remove_top_bottom_toolbar_toggle, }; #pragma endregion From 9ad21599a3dd54e5af4d40d84e9c822330d6ff70 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:40:37 -0400 Subject: [PATCH 11/42] 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 18008c2cc690ac4d66184216229ddb31dc530069 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Fri, 26 Jun 2015 17:44:17 +0200 Subject: [PATCH 12/42] remove unneeded string --- data/language/english_uk.txt | 1 - src/localisation/string_ids.h | 1 - 2 files changed, 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 9ffd140a65..0a2e5fd020 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3780,4 +3780,3 @@ STR_5443 :Speed{MOVE_X}{87}{STRINGID} STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get -STR_5448 :Remove toolbar diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 7190889aff..a1029e0da5 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -129,7 +129,6 @@ enum { STR_UNDERGROUND_VIEW = 939, STR_REMOVE_BASE_LAND = 940, STR_REMOVE_VERTICAL_FACES = 941, - STR_REMOVE_TOP_BOTTOM_BAR = 5448, STR_SEE_THROUGH_RIDES = 942, STR_SEE_THROUGH_SCENERY = 943, From c20b60652c3cc5fbbf43c46d9bbb50d9166e3ec0 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Fri, 26 Jun 2015 11:47:03 -0400 Subject: [PATCH 13/42] 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 14/42] 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 15/42] 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 16/42] 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 17/42] 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 18/42] 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 19/42] 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 a4322cb8559848036dd641aa7dd97b957b8df5bd Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sat, 27 Jun 2015 16:25:42 +0200 Subject: [PATCH 20/42] Fix observation tower and launched freefall descriptions --- data/language/english_uk.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 24f2a80331..1bc1d8a163 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.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 457e7862b388c9e6dd8650a4831365292b217c1b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sat, 27 Jun 2015 17:53:28 +0100 Subject: [PATCH 21/42] 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 22/42] 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 23/42] 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 24/42] 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 25/42] 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 26/42] 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) From fb9fe6615b2bb3664d6707f471ae2db1d57f72dc Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 28 Jun 2015 11:11:07 +0200 Subject: [PATCH 27/42] Fix typo --- data/language/english_uk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1bc1d8a163..a9c503b1c6 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -527,7 +527,7 @@ STR_0522 :A smaller roller coaster where the riders sit above the track with STR_0523 :Riders travel slowly in powered vehicles along a track-based route 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 :Passengers travel in an rotating observation cabin which travels up a tall tower +STR_0526 :Passengers travel in a 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 b8fa25bcb6c7ce65894f45d311fadc78e67591ed Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 11:12:43 +0100 Subject: [PATCH 28/42] fix brakes speed not being set when building track --- src/windows/ride_construction.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 1149e47c0a..713891cd89 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -458,7 +458,7 @@ static void window_ride_construction_draw_track_piece( ); 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 bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties); static void sub_6CBCE2( int rideIndex, int trackType, int trackDirection, int edx, int originX, int originY, int originZ @@ -1561,13 +1561,13 @@ static void window_ride_construction_dropdown() */ static void window_ride_construction_construct(rct_window *w) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation; + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties; 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)) { + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &properties)) { sub_6C84CE(); return; } @@ -1579,7 +1579,7 @@ static void window_ride_construction_construct(rct_window *w) y, rideIndex | (trackType << 8) | (edxRS16 << 16), GAME_COMMAND_PLACE_TRACK, - z | (seatRotation << 28), + z | (properties << 16), 0 ); if (RCT2_GLOBAL(0x00F44074, money32) == MONEY32_UNDEFINED) { @@ -2310,7 +2310,7 @@ void sub_6C84CE() * 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) +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties) { int eax, ebx, ecx, edx, esi, edi, ebp; if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) @@ -2323,7 +2323,7 @@ static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int 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; + if (properties != NULL) *properties = (edi >> 16) & 0xFFFF; return false; } @@ -3367,13 +3367,13 @@ static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY) */ static void ride_construction_tooldown_construct(int screenX, int screenY) { - int trackType, trackDirection, rideIndex, edxRS16, x, y, z, seatRotation, highestZ; + int trackType, trackDirection, rideIndex, edxRS16, x, y, z, properties, highestZ; rct_window *w; map_invalidate_map_selection_tiles(); sub_6C9627(); - if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &seatRotation)) + if (sub_6CA2DF(&trackType, &trackDirection, &rideIndex, &edxRS16, &x, &y, &z, &properties)) return; _currentTrackPieceType = trackType; From 36d6ea7a6e6cd18de62ecae7ff9182bb58fd3f09 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 11:44:34 +0100 Subject: [PATCH 29/42] fix setting brakes speed on current track and implement game command --- src/game.c | 4 +-- src/game.h | 2 +- src/ride/track.c | 44 +++++++++++++++++++++++++++++++ src/ride/track.h | 1 + src/windows/game_bottom_toolbar.c | 1 + src/windows/ride_construction.c | 38 +++++++++++++------------- 6 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/game.c b/src/game.c index cfd8ba82b1..9e6139775e 100644 --- a/src/game.c +++ b/src/game.c @@ -934,7 +934,7 @@ static uint32 game_do_command_table[58] = { 0x0068BC01, 0, 0, - 0x006C5AE9, + 0, 0, // use new_game_command_table, original: 0x006BEFA1, 29 0, // 30 0, @@ -997,7 +997,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_raise_water, game_command_lower_water, - game_command_emptysub, + game_command_set_brakes_speed, game_command_hire_new_staff_member, //game_command_emptysub, game_command_set_staff_patrol, // 30 game_command_fire_staff_member, diff --git a/src/game.h b/src/game.h index 91c3212236..3b00c7ea43 100644 --- a/src/game.h +++ b/src/game.h @@ -52,7 +52,7 @@ enum GAME_COMMAND { GAME_COMMAND_EDIT_LAND_SMOOTH, GAME_COMMAND_RAISE_WATER, GAME_COMMAND_LOWER_WATER, - GAME_COMMAND_28, + GAME_COMMAND_SET_BRAKES_SPEED, GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, // 29 GAME_COMMAND_SET_STAFF_PATROL, //30 GAME_COMMAND_FIRE_STAFF_MEMBER, // 31 diff --git a/src/ride/track.c b/src/ride/track.c index ae0de4c416..8ff1fd2e03 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -3458,4 +3458,48 @@ void game_command_place_track(int *eax, int *ebx, int *ecx, int *edx, int *esi, 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); +} + +/** + * + * rct2: 0x006C5AE9 + */ +void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + rct_map_element *mapElement; + int x, y, z, trackType, brakesSpeed; + + x = (*eax & 0xFFFF); + y = (*ecx & 0xFFFF); + z = (*edi & 0xFFFF); + trackType = (*edx & 0xFF); + brakesSpeed = ((*ebx >> 8) & 0xFF); + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; + RCT2_GLOBAL(0x009DEA5E, uint8) = x + 16; + RCT2_GLOBAL(0x009DEA60, uint8) = y + 16; + RCT2_GLOBAL(0x009DEA62, uint8) = z; + + if (*ebx & GAME_COMMAND_FLAG_APPLY) { + *ebx = 0; + return; + } + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height * 8 != z) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + if (mapElement->properties.track.type != trackType) + continue; + + mapElement->properties.track.sequence = + (mapElement->properties.track.sequence & 0x0F) | + ((brakesSpeed >> 1) << 4); + + break; + } while (!map_element_is_last_for_tile(mapElement++)); + + *ebx = 0; } \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index 197a516d59..39c05890c7 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -496,5 +496,6 @@ const rct_preview_track *get_track_def_from_ride_index(int rideIndex, int trackT 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); +void game_command_set_brakes_speed(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); #endif diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 16c01ce4b9..d86e41ff3c 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -548,6 +548,7 @@ static void window_game_bottom_toolbar_draw_news_item(rct_drawpixelinfo *dpi, rc memcpy((void*)0x009B5F2C, &newsItem->colour, 256); x = w->x + (middleOutsetWidget->left + middleOutsetWidget->right) / 2; y = w->y + middleOutsetWidget->top + 11; + width = middleOutsetWidget->right - middleOutsetWidget->left - 62; sub_6C1F57(dpi, x, y, width, 14, stringId, NULL, newsItem->ticks); x = w->x + window_game_bottom_toolbar_widgets[WIDX_NEWS_SUBJECT].left; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 713891cd89..ac1c424f12 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -471,7 +471,7 @@ money32 sub_6CA162(int rideIndex, int trackType, int trackDirection, int edxRS16 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_set_brakes_speed(int brakesSpeed); static void ride_construction_toolupdate_construct(int screenX, int screenY); static void ride_construction_toolupdate_entrance_exit(int screenX, int screenY); @@ -1442,18 +1442,18 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r _currentTrackPrice = MONEY32_UNDEFINED; sub_6C84CE(); } else { - uint8 *ebp = (uint8*)0x00F440CD; - uint8 bl = 30; + uint8 *brakesSpeedPtr = (uint8*)0x00F440CD; + uint8 maxBrakesSpeed = 30; if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { - ebp = (uint8*)0x00F440CE; - bl = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); + brakesSpeedPtr = (uint8*)0x00F440CE; + maxBrakesSpeed = RCT2_GLOBAL(0x0097CF40 + 6 + (ride->type * 8), uint8); } - uint8 bh = *ebp + 2; - if (bh <= bl) { + uint8 brakesSpeed = *brakesSpeedPtr + 2; + if (brakesSpeed <= maxBrakesSpeed) { if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { - loc_6C76E9(); + ride_construction_set_brakes_speed(brakesSpeed); } else { - *ebp = bh; + *brakesSpeedPtr = brakesSpeed; sub_6C84CE(); } } @@ -1466,16 +1466,16 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r _currentTrackPrice = MONEY32_UNDEFINED; sub_6C84CE(); } else { - uint8 *ebp = (uint8*)0x00F440CD; + uint8 *brakesSpeedPtr = (uint8*)0x00F440CD; if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { - ebp = (uint8*)0x00F440CE; + brakesSpeedPtr = (uint8*)0x00F440CE; } - uint8 bh = *ebp - 2; - if (bh >= 2) { + uint8 brakesSpeed = *brakesSpeedPtr - 2; + if (brakesSpeed >= 2) { if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_SELECTED) { - loc_6C76E9(); + ride_construction_set_brakes_speed(brakesSpeed); } else { - *ebp = bh; + *brakesSpeedPtr = brakesSpeed; sub_6C84CE(); } } @@ -3172,7 +3172,7 @@ static void loc_6C7502(int al) * * rct2: 0x006C76E9 */ -static void loc_6C76E9() +static void ride_construction_set_brakes_speed(int brakesSpeed) { rct_map_element *mapElement; int x, y, z; @@ -3180,13 +3180,13 @@ static void loc_6C76E9() x = _currentTrackBeginX; y = _currentTrackBeginY; z = _currentTrackBeginZ; - if (sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { + if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) { game_do_command( _currentTrackBeginX, - GAME_COMMAND_FLAG_APPLY | ((_currentTrackPieceDirection & 3) << 8), + GAME_COMMAND_FLAG_APPLY | ((brakesSpeed) << 8), _currentTrackBeginY, mapElement->properties.track.type, - GAME_COMMAND_28, + GAME_COMMAND_SET_BRAKES_SPEED, _currentTrackBeginZ, 0 ); From 9feff63c6d6086e6b3653bb42ab80a3a021b83b3 Mon Sep 17 00:00:00 2001 From: Maikel Stuivenberg Date: Sun, 28 Jun 2015 13:36:46 +0200 Subject: [PATCH 30/42] Remove viewport flag --- src/interface/keyboard_shortcut.c | 8 ++++---- src/interface/viewport.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index 6aa94b916a..be2e210dcc 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -230,13 +230,13 @@ static void shortcut_remove_vertical_land_toggle() static void shortcut_remove_top_bottom_toolbar_toggle() { - toggle_view_flag(VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR); - - if (window_get_main()->viewport->flags & VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR){ + if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) + { window_close(window_find_by_class(WC_TOP_TOOLBAR)); window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); } - else { + else + { window_top_toolbar_open(); window_game_bottom_toolbar_open(); } diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 5836314b0a..62cfa47c7f 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -41,7 +41,7 @@ enum { VIEWPORT_FLAG_HIDE_BASE = (1 << 12), VIEWPORT_FLAG_HIDE_VERTICAL = (1 << 13), VIEWPORT_FLAG_INVISIBLE_SPRITES = (1 << 14), - VIEWPORT_FLAG_HIDE_TOP_BOTTOM_TOOLBAR = (1 << 15), + VIEWPORT_FLAG_15 = (1 << 15) }; enum { From e72739dbd69f28598380105870a1d9993d92d40a Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 25 Jun 2015 15:14:36 +0200 Subject: [PATCH 31/42] Add cheat to force park rating --- data/language/english_uk.txt | 4 +-- src/localisation/string_ids.h | 2 ++ src/windows/cheats.c | 56 ++++++++++++++++++++++++++++++++++- src/world/park.c | 18 +++++++++++ src/world/park.h | 3 ++ 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 24f2a80331..9dfebb576a 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3775,10 +3775,10 @@ STR_5438 :Can't make changes while command editor is open STR_5439 :A wait command with at least 4 seconds is required with a restart command STR_5440 :Minimise fullscreen on focus loss STR_5441 :{SMALLFONT}{BLACK}Identifies rides by track type,{NEWLINE}so vehicles can be changed{NEWLINE}afterwards, like in RCT1. -STR_5442 :reserved +STR_5442 :Force park rating: 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} +STR_5448 :Ride / Vehicle {STRINGID} \ No newline at end of file diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 464d3f454d..910ee249d1 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1719,6 +1719,8 @@ enum { STR_UP = 5375, STR_DOWN = 5376, + STR_FORCE_PARK_RATING = 5442, + STR_OBJECTS_SORT_TYPE = 5447, STR_OBJECTS_SORT_RIDE = 5448, diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 2d00ef2203..577e3fb52e 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -40,6 +40,8 @@ #define CHEATS_MONEY_INCREMENT MONEY(5000,00) #define CHEATS_TRAM_INCREMENT 250 +#define CHEATS_PARK_RATING_SPINNER_PAUSE 20 + enum { WINDOW_CHEATS_PAGE_MONEY, WINDOW_CHEATS_PAGE_GUESTS, @@ -96,6 +98,10 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_FAST_STAFF, WIDX_NORMAL_STAFF, WIDX_PARK_PARAMETERS, + WIDX_FORCE_PARK_RATING, + WIDX_PARK_RATING_SPINNER, + WIDX_INCREASE_PARK_RATING, + WIDX_DECREASE_PARK_RATING, WIDX_RENEW_RIDES = 8, WIDX_REMOVE_SIX_FLAGS, WIDX_MAKE_DESTRUCTIBLE, @@ -214,6 +220,10 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(6), HPL(6), STR_FAST, STR_NONE }, // fast staff { WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(6), HPL(6), STR_NORMAL, STR_NONE }, // normal staff { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_TIP_PARK_PARAMETERS}, // Park parameters + { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_FORCE_PARK_RATING, STR_NONE}, // Force park rating + { WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(8) + 2, HPL(8) - 3, STR_NONE, STR_NONE }, // park rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 3, YPL(8) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating + { WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(8) + 8, YPL(8) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating { WIDGETS_END }, }; static rct_widget window_cheats_rides_widgets[] = { @@ -384,7 +394,7 @@ static void* window_cheats_page_events[] = { static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_CLEAR_LOAN), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_GUEST_HAPPINESS_MAX) | (1 << WIDX_GUEST_HAPPINESS_MIN) | (1 << WIDX_GUEST_ENERGY_MAX) | (1 << WIDX_GUEST_ENERGY_MIN) | (1 << WIDX_GUEST_HUNGER_MAX) | (1 << WIDX_GUEST_HUNGER_MIN) | (1 << WIDX_GUEST_THIRST_MAX) | (1 << WIDX_GUEST_THIRST_MIN) | (1 << WIDX_GUEST_NAUSEA_MAX) | (1 << WIDX_GUEST_NAUSEA_MIN) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MAX) | (1 << WIDX_GUEST_NAUSEA_TOLERANCE_MIN) | (1 << WIDX_GUEST_BATHROOM_MAX) | (1 << WIDX_GUEST_BATHROOM_MIN) | (1 << WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1) | (1 << WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15) | (1 << WIDX_TRAM_GUESTS) | (1 << WIDX_REMOVE_ALL_GUESTS) | (1 << WIDX_EXPLODE_GUESTS) | (1 << WIDX_GIVE_GUESTS_PARK_MAPS) | (1 << WIDX_GIVE_GUESTS_BALLOONS) | (1 << WIDX_GIVE_GUESTS_UMBRELLAS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_UNLOCK_ALL_PRICES) | (1 << WIDX_SANDBOX_MODE) | (1 << WIDX_FAST_STAFF) | (1 << WIDX_NORMAL_STAFF) | (1 << WIDX_PARK_PARAMETERS) | (1 << WIDX_FORCE_PARK_RATING) | (1 << WIDX_INCREASE_PARK_RATING) | (1 << WIDX_DECREASE_PARK_RATING), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_TAB_4) | (1 << WIDX_RENEW_RIDES) | (1 << WIDX_REMOVE_SIX_FLAGS) | (1 << WIDX_MAKE_DESTRUCTIBLE) | (1 << WIDX_FIX_ALL) | (1 << WIDX_FAST_LIFT_HILL) | (1 << WIDX_DISABLE_BRAKES_FAILURE) | (1 << WIDX_DISABLE_ALL_BREAKDOWNS) | (1 << WIDX_BUILD_IN_PAUSE_MODE) | (1 << WIDX_RESET_CRASH_STATUS) }; @@ -397,6 +407,9 @@ static rct_string_id window_cheats_page_titles[] = { static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); +int park_rating_spinner_value; +int park_rating_spinner_pressed_for = 0; + #pragma region Cheat functions static void cheat_set_grass_length(int length) @@ -730,6 +743,7 @@ void window_cheats_open() window->enabled_widgets = window_cheats_page_enabled_widgets[0]; window_init_scroll_widgets(window); window_cheats_set_page(window, WINDOW_CHEATS_PAGE_MONEY); + park_rating_spinner_value = get_forced_park_rating() >= 0 ? get_forced_park_rating() : 999; } static void window_cheats_money_mouseup() @@ -921,6 +935,25 @@ static void window_cheats_misc_mouseup() case WIDX_PARK_PARAMETERS: window_editor_scenario_options_open(); break; + case WIDX_FORCE_PARK_RATING: + if (get_forced_park_rating() >= 0){ + set_forced_park_rating(-1); + } else { + set_forced_park_rating(park_rating_spinner_value); + } + break; + case WIDX_INCREASE_PARK_RATING: + park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + break; + case WIDX_DECREASE_PARK_RATING: + park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + break; } } @@ -983,6 +1016,25 @@ static void window_cheats_update(rct_window *w) { w->frame_no++; widget_invalidate(w, WIDX_TAB_1 + w->page); + + if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING) || widget_is_pressed(w, WIDX_DECREASE_PARK_RATING)) + park_rating_spinner_pressed_for++; + else + park_rating_spinner_pressed_for = 0; + if (park_rating_spinner_pressed_for >= CHEATS_PARK_RATING_SPINNER_PAUSE) + if (!(w->frame_no % 3)){ + if (widget_is_pressed(w, WIDX_INCREASE_PARK_RATING)){ + park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + } else if (widget_is_pressed(w, WIDX_DECREASE_PARK_RATING)){ + park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1)); + widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); + if (get_forced_park_rating() >= 0) + set_forced_park_rating(park_rating_spinner_value); + } + } } static void window_cheats_invalidate() @@ -1006,6 +1058,7 @@ static void window_cheats_invalidate() w->widgets[WIDX_OPEN_CLOSE_PARK].image = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_PARK_OPEN ? STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK; widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gConfigCheat.unlock_all_prices); + widget_set_checkbox_value(w, WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0); break; case WINDOW_CHEATS_PAGE_RIDES: RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255; @@ -1041,6 +1094,7 @@ static void window_cheats_paint() } else if(w->page == WINDOW_CHEATS_PAGE_MISC){ gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(6) + TXTO); + gfx_draw_string_right(dpi, 5182, &park_rating_spinner_value, w->colours[2], w->x + WPL(1) - 10 - TXTO, w->y + YPL(8) + TXTO); } else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){ gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, 0, w->x + XPL(0) + TXTO, w->y + YPL(0) + TXTO); diff --git a/src/world/park.c b/src/world/park.c index 73230f230d..b732b8f895 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -38,6 +38,9 @@ uint8 *gParkRatingHistory = RCT2_ADDRESS(RCT2_ADDRESS_PARK_RATING_HISTORY, uint8); uint8 *gGuestsInParkHistory = RCT2_ADDRESS(RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY, uint8); +// If this value is more than or equal to 0, the park rating is forced to this value. Used for cheat +int gForcedParkRating = -1; + /** * In a difficult guest generation scenario, no guests will be generated if over this value. */ @@ -161,6 +164,9 @@ int park_calculate_size() */ int calculate_park_rating() { + if (gForcedParkRating >= 0) + return gForcedParkRating; + int result; result = 1150; @@ -1402,3 +1408,15 @@ void game_command_buy_land_rights(int *eax, int *ebx, int *ecx, int *edx, int *e *ebx = RCT2_GLOBAL(RCT2_ADDRESS_LAND_COST, uint16); }*/ } + + +void set_forced_park_rating(int rating){ + gForcedParkRating = rating; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_PARK_RATING, uint16) = calculate_park_rating(); + RCT2_GLOBAL(RCT2_ADDRESS_BTM_TOOLBAR_DIRTY_FLAGS, uint16) |= BTM_TB_DIRTY_FLAG_PARK_RATING; + window_invalidate_by_class(WC_PARK_INFORMATION); +} + +int get_forced_park_rating(){ + return gForcedParkRating; +} \ No newline at end of file diff --git a/src/world/park.h b/src/world/park.h index aa19444e04..556757cdc8 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -48,6 +48,9 @@ enum { extern uint8 *gParkRatingHistory; extern uint8 *gGuestsInParkHistory; +void set_forced_park_rating(); +int get_forced_park_rating(); + int park_is_open(); void park_init(); void park_reset_history(); From 5e3df2241423109ac637dc6c13f5be4e84bc6e87 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 13:31:46 +0100 Subject: [PATCH 32/42] Implemented map element remove. Small tidy of functions in game.c. --- src/game.c | 4 ++-- src/world/map.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index cfd8ba82b1..d5b3ddfe3d 100644 --- a/src/game.c +++ b/src/game.c @@ -870,7 +870,7 @@ void rct2_exit_reason(rct_string_id title, rct_string_id body){ */ void rct2_exit() { - RCT2_CALLPROC_EBPSAFE(0x006E3879); + audio_close(); //Post quit message does not work in 0x6e3879 as its windows only. openrct2_finish(); } @@ -892,7 +892,7 @@ void game_load_or_quit_no_save_prompt() game_do_command(0, 1, 0, 1, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); tool_cancel(); if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_5) { - RCT2_CALLPROC_EBPSAFE(0x0040705E); + // RCT2_CALLPROC_EBPSAFE(0x0040705E); Function not required resets cursor position. RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) &= ~INPUT_FLAG_5; } gGameSpeed = 1; diff --git a/src/world/map.c b/src/world/map.c index 602be3f4ee..4fa4596e64 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2637,7 +2637,17 @@ int map_get_station(rct_map_element *mapElement) */ void map_element_remove(rct_map_element *mapElement) { - RCT2_CALLPROC_X(0x0068B280, 0, 0, 0, 0, (int)mapElement, 0, 0); + if (!map_element_is_last_for_tile(mapElement)){ + do{ + *mapElement = *(mapElement + 1); + } while (!map_element_is_last_for_tile(++mapElement)); + } + (mapElement - 1)->flags |= MAP_ELEMENT_FLAG_LAST_TILE; + mapElement->base_height = 0xFF; + + if ((mapElement + 1) == RCT2_GLOBAL(0x00140E9A4, rct_map_element*)){ + RCT2_GLOBAL(0x00140E9A4, rct_map_element*)--; + } } /** From 48268d50ccdbdaf00ce6db422423014d07f8c03b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:13:42 +0100 Subject: [PATCH 33/42] implement a couple of ride subroutines and refactor --- src/game.h | 2 +- src/peep/peep.c | 2 +- src/peep/peep.h | 2 + src/ride/ride.c | 89 ++++++++++++++++++++++++++---- src/ride/track.c | 4 +- src/windows/demolish_ride_prompt.c | 2 +- src/windows/maze_construction.c | 2 +- src/windows/ride_construction.c | 2 +- src/world/footpath.h | 1 + 9 files changed, 89 insertions(+), 17 deletions(-) diff --git a/src/game.h b/src/game.h index 3b00c7ea43..b5df70cc6b 100644 --- a/src/game.h +++ b/src/game.h @@ -31,7 +31,7 @@ enum GAME_COMMAND { GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_LOAD_OR_QUIT, // 5 GAME_COMMAND_6, - GAME_COMMAND_7, + GAME_COMMAND_DEMOLISH_RIDE, GAME_COMMAND_SET_RIDE_STATUS, // 8 GAME_COMMAND_9, GAME_COMMAND_SET_RIDE_NAME, diff --git a/src/peep/peep.c b/src/peep/peep.c index adb41accf4..64eb9fc49e 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -163,7 +163,7 @@ void sub_693B58(rct_peep* peep){ } /* 0x00693BE5 */ -static void sub_693BE5(rct_peep* peep, uint8 al){ +void sub_693BE5(rct_peep* peep, uint8 al){ if (al == peep->var_6D)return; peep->var_6D = al; diff --git a/src/peep/peep.h b/src/peep/peep.h index 704914342e..28875d2bfd 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -591,4 +591,6 @@ void sub_693B58(rct_peep* peep); void remove_peep_from_ride(rct_peep* peep); void remove_peep_from_queue(rct_peep* peep); +void sub_693BE5(rct_peep* peep, uint8 al); + #endif diff --git a/src/ride/ride.c b/src/ride/ride.c index 6d557a5082..e2f68f63e7 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -37,6 +37,7 @@ #include "../util/util.h" #include "../windows/error.h" #include "../world/banner.h" +#include "../world/footpath.h" #include "../world/map.h" #include "../world/sprite.h" #include "ride.h" @@ -138,6 +139,7 @@ void ride_prepare_breakdown(int rideIndex, int breakdownReason); static void ride_shop_connected(rct_ride* ride, int ride_idx); static void ride_spiral_slide_update(rct_ride *ride); static void ride_update(int rideIndex); +static void sub_6B59C6(int rideIndex); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -784,7 +786,7 @@ void ride_remove_peeps(int rideIndex) invalidate_sprite((rct_sprite*)peep); peep->state = PEEP_STATE_FALLING; - RCT2_CALLPROC_X(0x00693BE5, 0, 0, 0, 0, (int)peep, 0, 0); + sub_693BE5(peep, 0); peep->happiness = min(peep->happiness, peep->happiness_growth_rate) / 2; peep->happiness_growth_rate = peep->happiness; @@ -998,8 +1000,6 @@ bool sub_6C63D6(int inX, int inY, int inZ, int inDirection, track_begin_end *out */ void sub_6C96C0() { - // 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; @@ -3334,7 +3334,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * switch (setting){ case 0: - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); ride_clear_for_construction(ride_id); ride_remove_peeps(ride_id); @@ -3376,7 +3376,7 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * ride->min_waiting_time = min(new_value, ride->min_waiting_time); break; case 4: - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); ride->time_limit = new_value; break; case 5: @@ -3397,13 +3397,13 @@ void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int * case 8: if (new_value != ride->lift_hill_speed){ ride->lift_hill_speed = new_value; - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); } break; case 9: if (new_value != ride->num_circuits){ ride->num_circuits = new_value; - RCT2_CALLPROC_X(0x006B59C6, 0, 0, 0, ride_id, 0, 0, 0); + sub_6B59C6(ride_id); } break; } @@ -3526,7 +3526,28 @@ int ride_check_for_entrance_exit(int rideIndex) */ void sub_6B5952(int rideIndex) { - RCT2_CALLPROC_X(0x006B5952, 0, 0, 0, rideIndex, 0, 0, 0); + rct_ride *ride = GET_RIDE(rideIndex); + + for (int i = 0; i < 4; i++) { + uint16 xy = ride->entrances[i]; + if (xy == 0xFFFF) + continue; + + int x = xy & 0xFF; + int y = xy >> 8; + int z = ride->station_heights[i]; + + rct_map_element *mapElement = map_get_first_element_at(x, y); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + if (mapElement->base_height != z) + continue; + + int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK; + sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2); + } while (map_element_is_last_for_tile(mapElement++)); + } } /** @@ -4308,6 +4329,30 @@ int ride_get_refund_price(int ride_id) return RCT2_GLOBAL(0x00F4413A, int); } +/** + * + * rct2: 0x00696707 + */ +static void ride_stop_peeps_queuing(int rideIndex) +{ + uint16 spriteIndex; + rct_peep *peep; + + FOR_ALL_PEEPS(spriteIndex, peep) { + if (peep->state != PEEP_STATE_QUEUING) + continue; + if (peep->current_ride != rideIndex) + continue; + + remove_peep_from_queue(peep); + peep_decrement_num_riders(peep); + + peep->state = PEEP_STATE_FALLING; + + peep_window_state_update(peep); + } +} + /** * * rct2: 0x006B49D9 @@ -4349,7 +4394,7 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi } ride_clear_for_construction(ride_id); ride_remove_peeps(ride_id); - RCT2_CALLPROC_X(0x00696707, 0, 0, 0, ride_id, 0, 0, 0); + ride_stop_peeps_queuing(ride_id); *ebx = ride_get_refund_price(ride_id); RCT2_CALLPROC_X(0x006CB945, 0, 0, 0, ride_id, 0, 0, 0); @@ -4904,4 +4949,28 @@ bool ride_are_all_possible_entrances_and_exits_built(rct_ride *ride) } } return true; -} \ No newline at end of file +} + +/** + * + * rct2: 0x006B59C6 + */ +static void sub_6B59C6(int rideIndex) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + ride_measurement_clear(ride); + ride->excitement = 0xFFFF; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TESTED; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS; + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) { + for (int i = 0; i < ride->num_vehicles; i++) { + uint16 spriteIndex = ride->vehicles[i]; + if (spriteIndex != SPRITE_INDEX_NULL) { + rct_vehicle *vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle->var_48 &= ~(1 << 5); + } + } + } + window_invalidate_by_number(WC_RIDE, rideIndex); +} diff --git a/src/ride/track.c b/src/ride/track.c index 8ff1fd2e03..2129d4b0dc 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1491,7 +1491,7 @@ int track_place_maze(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint8** trac } if (RCT2_GLOBAL(0x00F440D4, uint8) == 6){ - game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); } RCT2_GLOBAL(0x00F44142, sint16) = x; @@ -3242,7 +3242,7 @@ void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int if (cost == MONEY32_UNDEFINED || !(flags & GAME_COMMAND_FLAG_APPLY)){ rct_string_id error_reason = RCT2_GLOBAL(0x00141E9AC, rct_string_id); - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_7, 0, 0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); *ebx = cost; RCT2_GLOBAL(0x00141E9AC, rct_string_id) = error_reason; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 0; diff --git a/src/windows/demolish_ride_prompt.c b/src/windows/demolish_ride_prompt.c index ba62515caf..3ad481bc28 100644 --- a/src/windows/demolish_ride_prompt.c +++ b/src/windows/demolish_ride_prompt.c @@ -116,7 +116,7 @@ static void window_ride_demolish_mouseup(){ switch (widgetIndex){ case WIDX_DEMOLISH: RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID, rct_string_id) = STR_CANT_DEMOLISH_RIDE; - game_do_command(0, 1, 0, w->number, GAME_COMMAND_7, 0, 0); + game_do_command(0, 1, 0, w->number, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); break; case WIDX_CANCEL: case WIDX_CLOSE: diff --git a/src/windows/maze_construction.c b/src/windows/maze_construction.c index ee801a53bc..0a659f63b2 100644 --- a/src/windows/maze_construction.c +++ b/src/windows/maze_construction.c @@ -176,7 +176,7 @@ static void window_maze_construction_close() 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); + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = savedPausedState; } else { window_ride_main_open(rideIndex); diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index ac1c424f12..c06a25e1df 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -586,7 +586,7 @@ static void window_ride_construction_close() 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); + game_do_command(0, 9, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) = eax; } diff --git a/src/world/footpath.h b/src/world/footpath.h index 047773a653..2f943e8084 100644 --- a/src/world/footpath.h +++ b/src/world/footpath.h @@ -51,5 +51,6 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, void footpath_remove_litter(int x, int y, int z); void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags); void sub_6A759F(); +void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction); #endif From f452b4d39aecd6bd24d28d41c5fd8e10392465a3 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:36:34 +0100 Subject: [PATCH 34/42] fix #1506 --- src/windows/ride_construction.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index c06a25e1df..f5adfefdb2 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1094,7 +1094,11 @@ static void window_ride_construction_resize() } else if ( ( is_track_enabled(TRACK_HELIX_SMALL) || - (_currentTrackCurve != TRACK_CURVE_LEFT_SMALL && _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL && !is_track_enabled(TRACK_HELIX_LARGE)) + ( + is_track_enabled(TRACK_HELIX_LARGE) && + _currentTrackCurve != TRACK_CURVE_LEFT_SMALL && + _currentTrackCurve != TRACK_CURVE_RIGHT_SMALL + ) ) && ( _currentTrackCurve == TRACK_CURVE_LEFT || @@ -2580,11 +2584,11 @@ static void window_ride_construction_update_possible_ride_configurations() 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 + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_SMALL || + RCT2_GLOBAL(0x00997C9D + (trackType * 8), uint8) == TRACK_HELIX_LARGE ) { if (bank != _previousTrackBankEnd) { - if (_previousTrackBankEnd != 0) + if (_previousTrackBankEnd != TRACK_BANK_NONE) continue; if (bank != TRACK_BANK_LEFT) @@ -2602,7 +2606,7 @@ static void window_ride_construction_update_possible_ride_configurations() _currentTrackPieceDirection < 4 && slope == _previousTrackSlopeEnd && bank == _previousTrackBankEnd && - (trackType != 66 || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) + (trackType != TRACK_ELEM_TOWER_BASE || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_29)) ) { RCT2_GLOBAL(0x00F4409C, uint32) &= ~(1 << currentPossibleRideConfigurationIndex); _numCurrentPossibleSpecialTrackPieces++; From 06ee0342b75ba29e559fc73df54d1b7d587bd8ba Mon Sep 17 00:00:00 2001 From: danidoedel Date: Sun, 28 Jun 2015 14:52:05 +0200 Subject: [PATCH 35/42] Fix window titles (cheats) --- data/language/english_uk.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 9dfebb576a..197a1d02d5 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3680,8 +3680,8 @@ STR_5343 :Automatically place staff STR_5344 :Changelog STR_5345 :Financial cheats STR_5346 :Guest cheats -STR_5347 :Ride cheats -STR_5348 :Park cheats +STR_5347 :Park cheats +STR_5348 :Ride cheats STR_5349 :{SMALLFONT}{BLACK}All Rides STR_5350 :Max STR_5351 :Min @@ -3781,4 +3781,4 @@ STR_5444 :Speed: STR_5445 :Speed STR_5446 :Get STR_5447 :Type {STRINGID} -STR_5448 :Ride / Vehicle {STRINGID} \ No newline at end of file +STR_5448 :Ride / Vehicle {STRINGID} From 8167c24526b1d357fb621c5dce66b49a5ec9101d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 13:53:24 +0100 Subject: [PATCH 36/42] Implemented sub_68B044 some sort of check to make sure there is space for new element. If there isn't then it will try reorganise the elements to make room. --- src/addresses.h | 1 + src/world/map.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/addresses.h b/src/addresses.h index 224a5966f4..c9311354d7 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -354,6 +354,7 @@ #define RCT2_ADDRESS_SCENARIO_SRAND_0 0x00F663B0 #define RCT2_ADDRESS_SCENARIO_SRAND_1 0x00F663B4 #define RCT2_ADDRESS_MAP_ELEMENTS 0x00F663B8 +#define RCT2_ADDRESS_MAP_ELEMENTS_END 0x010E53B8 #define RCT2_ADDRESS_SPRITE_LIST 0x010E63BC #define RCT2_ADDRESS_SPRITES_NEXT_INDEX 0x013573BC diff --git a/src/world/map.c b/src/world/map.c index 4fa4596e64..1f6fe730d6 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2744,7 +2744,23 @@ void map_reorganise_elements() */ int sub_68B044() { - return (RCT2_CALLPROC_X(0x0068B044, 0, 0, 0, 0, 0, 0, 0) & 0x100) == 0; + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + + for (int i = 1000; i != 0; --i) + sub_68B089(); + + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + + map_reorganise_elements(); + + if (RCT2_GLOBAL(0x00140E9A4, rct_map_element*) <= RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS_END, rct_map_element)) + return 1; + else{ + RCT2_GLOBAL(0x00141E9AC, rct_string_id) = 894; + return 0; + } } /** From b4f8d3b7530710b65304c2d0fa7b0a00f635e0cd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 13:57:50 +0100 Subject: [PATCH 37/42] add new shortcuts to shortcut window and fix bottom toolbar hiding in editor --- data/language/english_uk.txt | 4 +++ src/interface/keyboard_shortcut.c | 19 ++++++++----- src/localisation/string_ids.h | 39 +++++++++++++++++++++++++-- src/windows/shortcut_keys.c | 45 ++++++++++++++++++++++++++++--- 4 files changed, 95 insertions(+), 12 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 1c737b38e7..d15853dbb3 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3782,3 +3782,7 @@ STR_5445 :Speed STR_5446 :Get STR_5447 :Type {STRINGID} STR_5448 :Ride / Vehicle {STRINGID} +STR_5449 :Reduce game speed +STR_5450 :Increase game speed +STR_5451 :Open cheats window +STR_5452 :Toggle visibility of toolbars diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index be2e210dcc..d0382709c7 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -230,15 +230,20 @@ static void shortcut_remove_vertical_land_toggle() static void shortcut_remove_top_bottom_toolbar_toggle() { - if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) - { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO) + return; + + if (window_find_by_class(WC_TOP_TOOLBAR) != NULL) { window_close(window_find_by_class(WC_TOP_TOOLBAR)); window_close(window_find_by_class(WC_BOTTOM_TOOLBAR)); - } - else - { - window_top_toolbar_open(); - window_game_bottom_toolbar_open(); + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) == 0) { + window_top_toolbar_open(); + window_game_bottom_toolbar_open(); + } else { + window_top_toolbar_open(); + window_editor_bottom_toolbar_open(); + } } } diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 910ee249d1..0621ba8706 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1145,9 +1145,39 @@ enum { STR_REAL_NAME_TIP = 2488, STR_HOTKEY = 2489, - STR_SHORTCUT_DESCRIPTION_0 = 2493, + STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW = 2493, + STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS = 2494, + STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE = 2495, + STR_SHORTCUT_PAUSE_GAME = 2496, + STR_SHORTCUT_ZOOM_VIEW_OUT = 2497, + STR_SHORTCUT_ZOOM_VIEW_IN = 2498, + STR_SHORTCUT_ROTATE_VIEW = 2499, + STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT = 2500, + STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE = 2501, + STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE = 2502, + STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE = 2503, + STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE = 2504, + STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE = 2505, + STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE = 2506, + STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE = 2507, + STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE = 2508, + STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE = 2509, + STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE = 2510, + STR_SHORTCUT_ADJUST_LAND = 2511, + STR_SHORTCUT_ADJUST_WATER = 2512, + STR_SHORTCUT_BUILD_SCENERY = 2513, + STR_SHORTCUT_BUILD_PATHS = 2514, + STR_SHORTCUT_BUILD_NEW_RIDE = 2515, + STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION = 2516, + STR_SHORTCUT_SHOW_RESEARCH_INFORMATION = 2517, + STR_SHORTCUT_SHOW_RIDES_LIST = 2518, + STR_SHORTCUT_SHOW_PARK_INFORMATION = 2519, + STR_SHORTCUT_SHOW_GUEST_LIST = 2520, + STR_SHORTCUT_SHOW_STAFF_LIST = 2521, + STR_SHORTCUT_SHOW_RECENT_MESSAGES = 2522, + STR_SHORTCUT_SHOW_MAP = 2523, + STR_SHORTCUT_SCREENSHOT = 2524, - STR_SHORTCUT_DESCRIPTION_31 = 2524, STR_INDIVIDUAL_KEYS_BASE = 2525, STR_GOLF_HOLE_A = 3049, @@ -1724,6 +1754,11 @@ enum { STR_OBJECTS_SORT_TYPE = 5447, STR_OBJECTS_SORT_RIDE = 5448, + STR_SHORTCUT_REDUCE_GAME_SPEED = 5449, + STR_SHORTCUT_INCREASE_GAME_SPEED = 5450, + STR_SHORTCUT_OPEN_CHEATS_WINDOW = 5451, + STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS = 5452, + // 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/shortcut_keys.c b/src/windows/shortcut_keys.c index 24e6db0dd9..1accbd0c51 100644 --- a/src/windows/shortcut_keys.c +++ b/src/windows/shortcut_keys.c @@ -88,6 +88,45 @@ static void* window_shortcut_events[] = { window_shortcut_scrollpaint }; +const rct_string_id ShortcutStringIds[] = { + STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW, + STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS, + STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE, + STR_SHORTCUT_PAUSE_GAME, + STR_SHORTCUT_ZOOM_VIEW_OUT, + STR_SHORTCUT_ZOOM_VIEW_IN, + STR_SHORTCUT_ROTATE_VIEW, + STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, + STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE, + STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE, + STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, + STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, + STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, + STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, + STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE, + STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE, + STR_SHORTCUT_ADJUST_LAND, + STR_SHORTCUT_ADJUST_WATER, + STR_SHORTCUT_BUILD_SCENERY, + STR_SHORTCUT_BUILD_PATHS, + STR_SHORTCUT_BUILD_NEW_RIDE, + STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION, + STR_SHORTCUT_SHOW_RESEARCH_INFORMATION, + STR_SHORTCUT_SHOW_RIDES_LIST, + STR_SHORTCUT_SHOW_PARK_INFORMATION, + STR_SHORTCUT_SHOW_GUEST_LIST, + STR_SHORTCUT_SHOW_STAFF_LIST, + STR_SHORTCUT_SHOW_RECENT_MESSAGES, + STR_SHORTCUT_SHOW_MAP, + STR_SHORTCUT_SCREENSHOT, + STR_SHORTCUT_REDUCE_GAME_SPEED, + STR_SHORTCUT_INCREASE_GAME_SPEED, + STR_SHORTCUT_OPEN_CHEATS_WINDOW, + STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS, +}; + /** * * rct2: 0x006E3884 @@ -106,7 +145,7 @@ void window_shortcut_keys_open() w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RESET); window_init_scroll_widgets(w); - w->no_list_items = 32; + w->no_list_items = SHORTCUT_COUNT; w->selected_list_item = -1; } @@ -176,7 +215,7 @@ static void window_shortcut_scrollgetsize() window_get_register(w); width = 0; - height = 32 * 10; + height = w->no_list_items * 10; window_scrollsize_set_registers(width, height); } @@ -244,7 +283,7 @@ static void window_shortcut_scrollpaint() gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x2000031); } - RCT2_GLOBAL(0x13CE954, uint16) = i + STR_SHORTCUT_DESCRIPTION_0; + RCT2_GLOBAL(0x13CE954, uint16) = ShortcutStringIds[i]; RCT2_GLOBAL(0x13CE956, uint16) = 0; RCT2_GLOBAL(0x13CE958, uint16) = 0; From 33c4698e0642d9ec7f3961356a86c58f452e9c12 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 16:50:21 +0100 Subject: [PATCH 38/42] Implemented map_reorganise_elements. Fixed a potential issue that would cause cursors to become stuck. --- src/platform/shared.c | 1 + src/world/map.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/platform/shared.c b/src/platform/shared.c index a0a929c8b4..77418e2137 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -646,6 +646,7 @@ void platform_set_fullscreen_mode(int mode) */ void platform_set_cursor(char cursor) { + RCT2_GLOBAL(RCT2_ADDRESS_CURENT_CURSOR, uint8) = cursor; SDL_SetCursor(_cursors[cursor]); } /** diff --git a/src/world/map.c b/src/world/map.c index 1f6fe730d6..46e4a2f95f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -35,6 +35,7 @@ #include "scenery.h" #include "../cheats.h" #include "../config.h" +#include "../cursors.h" const rct_xy16 TileDirectionDelta[] = { { -32, 0 }, @@ -2735,7 +2736,36 @@ void map_invalidate_selection_rect() */ void map_reorganise_elements() { - RCT2_CALLPROC_EBPSAFE(0x0068B111); + platform_set_cursor(CURSOR_ZZZ); + + rct_map_element* new_map_elements = rct2_malloc(0x30000 * sizeof(rct_map_element)); + rct_map_element* new_elements_pointer = new_map_elements; + + if (new_map_elements == NULL || new_map_elements == (rct_map_element*)-1){ + error_string_quit(4370, 0xFFFF); + return; + } + + rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); + for (int i = 0; i < 0x10000;){ + for (int j = 0; j < 256; ++j, ++i){ + rct_map_element* startElement = tile[i]; + rct_map_element* endElement = startElement; + while (!map_element_is_last_for_tile(endElement++)); + + uint8 num_bytes = endElement - startElement; + memcpy(new_elements_pointer, startElement, num_bytes); + new_elements_pointer += num_bytes / sizeof(rct_map_element); + } + } + + uint32 num_elements = (new_elements_pointer - new_map_elements) / sizeof(rct_map_element); + memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element)); + memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element)); + + rct2_free(new_map_elements); + + map_update_tile_pointers(); } /** From e2a694b96ec41aec485c8b04cfbc90afbc9b676a Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 17:45:19 +0100 Subject: [PATCH 39/42] implement format_string_toupper and litter_create --- src/addresses.h | 5 +++ src/localisation/localisation.c | 18 ++++++++ src/localisation/localisation.h | 1 + src/peep/peep.c | 13 +++--- src/scenario.h | 7 ++-- src/windows/ride_list.c | 11 ++--- src/world/map.c | 10 +++++ src/world/map.h | 2 + src/world/park.c | 4 +- src/world/sprite.c | 74 +++++++++++++++++++++++++++++++++ src/world/sprite.h | 11 +++-- 11 files changed, 136 insertions(+), 20 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 224a5966f4..f18fc89455 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -362,6 +362,11 @@ #define RCT2_ADDRESS_SPRITES_START_MISC 0x013573C2 #define RCT2_ADDRESS_SPRITES_START_LITTER 0x013573C4 +#define RCT2_ADDRESS_SPRITES_COUNT_VEHICLE 0x013573CA +#define RCT2_ADDRESS_SPRITES_COUNT_PEEP 0x013573CC +#define RCT2_ADDRESS_SPRITES_COUNT_MISC 0x013573CE +#define RCT2_ADDRESS_SPRITES_COUNT_LITTER 0x013573D0 + #define RCT2_ADDRESS_PARK_NAME 0x013573D4 #define RCT2_ADDRESS_PARK_NAME_ARGS 0x013573D8 #define RCT2_ADDRESS_INITIAL_CASH 0x013573DC diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c index 2a950495bf..db22c239fd 100644 --- a/src/localisation/localisation.c +++ b/src/localisation/localisation.c @@ -664,6 +664,24 @@ void format_string_raw(char *dest, char *src, void *args) format_string_part_from_raw(&dest, src, (char**)&args); } +/** + * Writes a formatted string to a buffer and converts it to upper case. + * rct2: 0x006C2538 + * dest (edi) + * format (ax) + * args (ecx) + */ +void format_string_to_upper(char *dest, rct_string_id format, void *args) +{ + format_string(dest, format, args); + + char *ch = dest; + while (*ch != 0) { + *ch = toupper(*ch); + ch++; + } +} + /** * rct2: 0x006E37F7 * error (eax) diff --git a/src/localisation/localisation.h b/src/localisation/localisation.h index c7bee7a75c..9d7a8e7f42 100644 --- a/src/localisation/localisation.h +++ b/src/localisation/localisation.h @@ -28,6 +28,7 @@ void format_string(char *dest, rct_string_id format, void *args); void format_string_raw(char *dest, char *src, void *args); +void format_string_to_upper(char *dest, rct_string_id format, void *args); void generate_string_file(); void error_string_quit(int error, rct_string_id format); int get_string_length(char* buffer); diff --git a/src/peep/peep.c b/src/peep/peep.c index 64eb9fc49e..745f851825 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -344,10 +344,9 @@ int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_peep* peep peep->var_45 |= (1 << 2); // Create sick at location - RCT2_CALLPROC_X(0x67375D, peep->x, peep->sprite_direction, peep->y, peep->z, 0, 0, peep->sprite_index & 1); - - int sound_id = (scenario_rand() & 3) + 24; + litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); + int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z); invalidate_sprite((rct_sprite*)peep); @@ -3485,7 +3484,7 @@ static void peep_update_using_bin(rct_peep* peep){ x = peep->x + (scenario_rand() & 7) - 3; y = peep->y + (scenario_rand() & 7) - 3; - RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_standard_flags &= ~(1 << cur_container); peep->var_45 |= 8; @@ -3516,7 +3515,7 @@ static void peep_update_using_bin(rct_peep* peep){ x = peep->x + (scenario_rand() & 7) - 3; y = peep->y + (scenario_rand() & 7) - 3; - RCT2_CALLPROC_X(0x67375D, x, scenario_rand() & 3, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, scenario_rand() & 3, bp); peep->item_extra_flags &= ~(1 << cur_container); peep->var_45 |= 8; @@ -4021,7 +4020,7 @@ static void peep_update_walking(rct_peep* peep){ int y = peep->y + (scenario_rand() & 0x7) - 3; int direction = (scenario_rand() & 0x3); - RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, ebp); + litter_create(x, y, peep->z, direction, ebp); } } } @@ -4053,7 +4052,7 @@ static void peep_update_walking(rct_peep* peep){ int y = peep->y + (scenario_rand() & 0x7) - 3; int direction = (scenario_rand() & 0x3); - RCT2_CALLPROC_X(0x67375D, x, direction, y, peep->z, 0, 0, bp); + litter_create(x, y, peep->z, direction, bp); } } diff --git a/src/scenario.h b/src/scenario.h index 9f5aa3f5a8..7fc1878d1a 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -134,9 +134,10 @@ typedef struct { uint16 sprites_start_litter; uint8 pad_013573C6[2]; uint16 word_013573C8; - uint8 pad_013573CA[4]; - uint16 word_013573CE; - uint16 word_013573D0; + uint16 sprites_count_vehicle; + uint16 sprites_count_peep; + uint16 sprites_count_misc; + uint16 sprites_count_litter; uint8 pad_013573D2[2]; rct_string_id park_name; uint8 pad_013573D6[2]; diff --git a/src/windows/ride_list.c b/src/windows/ride_list.c index c70fb45ac0..704946e326 100644 --- a/src/windows/ride_list.c +++ b/src/windows/ride_list.c @@ -615,6 +615,7 @@ static void window_ride_list_refresh_list(rct_window *w) { int i, countA, countB; rct_ride *ride, *otherRide; + char *bufferA, *bufferB; countA = countB = 0; FOR_ALL_RIDES(i, ride) { @@ -644,13 +645,13 @@ static void window_ride_list_refresh_list(rct_window *w) int current_list_position = list_index; switch (w->list_information_type) { case INFORMATION_TYPE_STATUS: - RCT2_GLOBAL(0x013CE952, uint32) = ride->name_arguments; - RCT2_CALLPROC_X(0x006C2538, ride->name, 0, 0x013CE952, 0, 0, RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, 0); + bufferA = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; + bufferB = (char*)0x0141EF68; + format_string_to_upper(bufferA, ride->name, &ride->name_arguments); while (--current_list_position >= 0) { otherRide = &g_ride_list[w->list_item_positions[current_list_position]]; - RCT2_GLOBAL(0x013CE952, uint32) = otherRide->name_arguments; - RCT2_CALLPROC_X(0x006C2538, otherRide->name, 0, 0x013CE952, 0, 0, 0x0141EF68, 0); - if (strcmp((char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, (char*)0x0141EF68) >= 0) + format_string_to_upper(bufferB, otherRide->name, &otherRide->name_arguments); + if (strcmp(bufferA, bufferB) >= 0) break; window_bubble_list_item(w, current_list_position); diff --git a/src/world/map.c b/src/world/map.c index 602be3f4ee..bcbd88c07a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -3095,3 +3095,13 @@ int map_get_highest_z(int tileX, int tileY) z = max(z, (mapElement->properties.surface.terrain & 0x1F) * 16); return z; } + +bool map_element_is_underground(rct_map_element *mapElement) +{ + do { + mapElement++; + if (map_element_is_last_for_tile(mapElement - 1)) + return false; + } while (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SURFACE); + return true; +} diff --git a/src/world/map.h b/src/world/map.h index 0c2882bb0c..46dcc6fa71 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -334,4 +334,6 @@ void sub_6A7594(); int map_element_get_banner_index(rct_map_element *mapElement); void map_element_remove_banner_entry(rct_map_element *mapElement); +bool map_element_is_underground(rct_map_element *mapElement); + #endif diff --git a/src/world/park.c b/src/world/park.c index b732b8f895..7b52393d88 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -267,8 +267,8 @@ int calculate_park_rating() for (sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = litter->next) { litter = &(g_sprite_list[sprite_idx].litter); - // Guessing this eliminates recently dropped litter - if (litter->var_24 - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680) + // Ignore recently dropped litter + if (litter->creationTick - RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) >= 7680) num_litter++; } result -= 600 - (4 * (150 - min(150, num_litter))); diff --git a/src/world/sprite.c b/src/world/sprite.c index ede41f10d8..1127ec59da 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -901,4 +901,78 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite){ void sprite_remove(rct_sprite *sprite) { RCT2_CALLPROC_X(0x0069EDB6, 0, 0, 0, 0, (int)sprite, 0, 0); +} + +static bool litter_can_be_at(int x, int y, int z) +{ + rct_map_element *mapElement; + + if (!map_is_location_owned(x & 0xFFE0, y & 0xFFE0, z)) + return false; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + + int pathZ = mapElement->base_height * 8; + if (pathZ < z || pathZ >= z + 32) + continue; + + if (map_element_is_underground(mapElement)) + return false; + + return true; + } while (!map_element_is_last_for_tile(mapElement++)); + return false; +} + +/** + * + * rct2: 0x0067375D + */ +void litter_create(int x, int y, int z, int direction, int type) +{ + rct_litter *litter, *newestLitter; + uint16 spriteIndex, nextSpriteIndex; + uint32 newestLitterCreationTick; + + x += TileDirectionDelta[direction].x / 8; + y += TileDirectionDelta[direction].y / 8; + + if (!litter_can_be_at(x, y, z)) + return; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_COUNT_LITTER, uint16) >= 500) { + newestLitter = NULL; + newestLitterCreationTick = 0; + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + litter = &(g_sprite_list[spriteIndex].litter); + nextSpriteIndex = litter->next; + if (newestLitterCreationTick <= litter->creationTick) { + newestLitterCreationTick = litter->creationTick; + newestLitter = litter; + } + } + + if (newestLitter != NULL) { + sub_6EC60B((rct_sprite*)newestLitter); + sprite_remove((rct_sprite*)newestLitter); + } + } + + litter = (rct_litter*)create_sprite(1); + if (litter == NULL) + return; + + move_sprite_to_list((rct_sprite*)litter, SPRITE_LINKEDLIST_OFFSET_LITTER); + litter->sprite_direction = direction; + litter->sprite_width = 6; + litter->sprite_height_negative = 6; + litter->sprite_height_positive = 3; + litter->sprite_identifier = SPRITE_IDENTIFIER_LITTER; + litter->type = type; + sprite_move(x, y, z, (rct_sprite*)litter); + sub_6EC60B((rct_sprite*)litter); + litter->creationTick = RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32); } \ No newline at end of file diff --git a/src/world/sprite.h b/src/world/sprite.h index 7a93a7c1c8..4dbdebae6a 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -84,14 +84,18 @@ typedef struct { uint16 next; // 0x04 uint16 previous; // 0x06 uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... - uint8 pad_09; + uint8 sprite_height_negative; // 0x09 uint16 sprite_index; // 0x0A uint16 pad_0C; sint16 x; // 0x0E sint16 y; // 0x10 sint16 z; // 0x12 - uint8 pad_14[0x10]; - uint32 var_24; + uint8 sprite_width; // 0x14 + uint8 sprite_height_positive; // 0x15 + uint8 pad_16[8]; + uint8 sprite_direction; // 0x1E + uint8 pad_1F[5]; + uint32 creationTick; // 0x24 } rct_litter; typedef struct { @@ -252,5 +256,6 @@ void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite); void invalidate_sprite(rct_sprite *sprite); void sub_6EC60B(rct_sprite* sprite); void sprite_remove(rct_sprite *sprite); +void litter_create(int x, int y, int z, int direction, int type); #endif From 3e200d0bd2813a59e79f127d3245c090096fc259 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 18:36:46 +0100 Subject: [PATCH 40/42] implement ride_fix_breakdown --- src/peep/peep.c | 26 ++++++++++++++++++++++++-- src/ride/ride.c | 33 +++++++++++++++++++++++++++++++++ src/ride/ride.h | 1 + src/ride/track.c | 1 - src/windows/cheats.c | 2 +- 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/peep/peep.c b/src/peep/peep.c index 745f851825..67551e3d4d 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -23,6 +23,7 @@ #include "../audio/mixer.h" #include "../interface/window.h" #include "../localisation/localisation.h" +#include "../management/finance.h" #include "../management/news_item.h" #include "../ride/ride.h" #include "../scenario.h" @@ -42,6 +43,7 @@ static int peep_empty_container_extra_flag(rct_peep* peep); static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); +static void peep_spend_money(rct_peep *peep, money32 amount); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -1368,8 +1370,7 @@ static void peep_update_ride_sub_state_2_enter_ride(rct_peep* peep, rct_ride* ri ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_INCOME; RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = 20; RCT2_GLOBAL(0xF1AEC0, uint32) = 230; - - RCT2_CALLPROC_X(0x0069926C, 0, ride->price, 0, 0, (int)peep, 0, 0); + peep_spend_money(peep, ride->price); } } @@ -5310,3 +5311,24 @@ void sub_693BAB(rct_peep* peep) { } } +/** + * + * rct2: 0x0069926C + */ +static void peep_spend_money(rct_peep *peep, money32 amount) +{ + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + return; + + peep->cash_in_pocket = max(0, peep->cash_in_pocket - amount); + peep->cash_spent += amount; + if (RCT2_GLOBAL(0x00F1AEC0, uint32) == 0xFFFFFFFF) { + RCT2_GLOBAL(peep + RCT2_GLOBAL(0x00F1AEC0, uint32), money16) += (money16)amount; + } + window_invalidate_by_number(WC_PEEP, peep->sprite_index); + + RCT2_GLOBAL(0x00141F568, uint8) = RCT2_GLOBAL(0x0013CA740, uint8); + finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32)); + + sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); +} \ No newline at end of file diff --git a/src/ride/ride.c b/src/ride/ride.c index e2f68f63e7..f5a3338891 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -4974,3 +4974,36 @@ static void sub_6B59C6(int rideIndex) } window_invalidate_by_number(WC_RIDE, rideIndex); } + +/** + * + * rct2: 0x006B7481 + */ +void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) +{ + rct_ride *ride = GET_RIDE(rideIndex); + + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BREAKDOWN_PENDING; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_BROKEN_DOWN; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_DUE_INSPECTION; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_CUSTOMER; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) { + rct_vehicle *vehicle; + uint16 spriteIndex; + + for (int i = 0; i < ride->num_vehicles; i++) { + spriteIndex = ride->vehicles[i]; + while (spriteIndex != SPRITE_INDEX_NULL) { + vehicle = &(g_sprite_list[spriteIndex].vehicle); + vehicle->var_48 &= ~(1 << 7); + vehicle->var_48 &= ~(1 << 8); + vehicle->var_48 &= ~(1 << 9); + spriteIndex = vehicle->next_vehicle_on_train; + } + } + } + + uint8 unreliability = 100 - ((ride->reliability >> 8) & 0xFF); + ride->reliability += reliabilityIncreaseFactor * (unreliability / 2); +} diff --git a/src/ride/ride.h b/src/ride/ride.h index c367858517..143e654899 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -935,5 +935,6 @@ 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); +void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); #endif diff --git a/src/ride/track.c b/src/ride/track.c index 2129d4b0dc..06ca30f6ee 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2225,7 +2225,6 @@ rct_track_design *track_get_info(int index, uint8** preview) memcpy(&trackDesign->track_td6, loaded_track, sizeof(rct_track_td6)); // Load in a new preview image, calculate cost variable, calculate var_06 draw_track_preview((uint8**)trackDesign->preview); - //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0); trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32); trackDesign->track_td6.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 577e3fb52e..52f1a38702 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -515,7 +515,7 @@ static void cheat_fix_rides() remove_peep_from_ride(mechanic); } - RCT2_CALLPROC_X(0x006B7481, 0, 0, 0, rideIndex, 0, 0, 0); + ride_fix_breakdown(rideIndex, 0); ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; } } From ed41c2b9956e0342a8f9705fe80e0116809ce66d Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 28 Jun 2015 18:59:55 +0100 Subject: [PATCH 41/42] fix map_reorganise_elements --- src/world/map.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 035eff919f..d581cbbe59 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2747,13 +2747,13 @@ void map_reorganise_elements() } rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); - for (int i = 0; i < 0x10000;){ - for (int j = 0; j < 256; ++j, ++i){ - rct_map_element* startElement = tile[i]; - rct_map_element* endElement = startElement; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + rct_map_element *startElement = map_get_first_element_at(x, y); + rct_map_element *endElement = startElement; while (!map_element_is_last_for_tile(endElement++)); - uint8 num_bytes = endElement - startElement; + uint8 num_bytes = (endElement - startElement) * sizeof(rct_map_element); memcpy(new_elements_pointer, startElement, num_bytes); new_elements_pointer += num_bytes / sizeof(rct_map_element); } From 2c3c8dc1880a6aa4eeb0241bff529802968de396 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 28 Jun 2015 19:46:08 +0100 Subject: [PATCH 42/42] Fix incorrect pointer maths. Fixes #1511. --- src/world/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index d581cbbe59..17412bae0c 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -2759,7 +2759,7 @@ void map_reorganise_elements() } } - uint32 num_elements = (new_elements_pointer - new_map_elements) / sizeof(rct_map_element); + uint32 num_elements = (new_elements_pointer - new_map_elements); memcpy(RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element), new_map_elements, num_elements * sizeof(rct_map_element)); memset(new_map_elements + num_elements, 0, (0x30000 - num_elements) * sizeof(rct_map_element));