diff --git a/CMakeLists.txt b/CMakeLists.txt index 405abc5e32..2bb0da725b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,7 @@ if (FORCE64) set(TARGET_M "-m64") set(OBJ_FORMAT "elf64-x86-64") set(LINKER_SCRIPT "ld_script_x86_64.xc") - list(APPEND CMAKE_C_FLAGS "-Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast") else () set(TARGET_M "-m32") set(OBJ_FORMAT "elf32-i386") diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 2d371cad0a..9e57d3a475 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -144,7 +144,7 @@ void load_palette(){ uint32 palette = 0x5FC; - if ((sint32)water_type != -1){ + if ((intptr_t)water_type != -1){ palette = water_type->image_id; } diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index d47520ba47..dd85d6e27d 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -37,8 +37,8 @@ assert_struct_size(rct_draw_scroll_text, 0xA12); rct_draw_scroll_text *gDrawScrollTextList = RCT2_ADDRESS(RCT2_ADDRESS_DRAW_SCROLL_LIST, rct_draw_scroll_text); uint8 *gCharacterBitmaps = RCT2_ADDRESS(RCT2_ADDRESS_CHARACTER_BITMAP, uint8); -void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets); -void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets); +void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, const sint16 *scrollPositionOffsets); +void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, const sint16 *scrollPositionOffsets); void scrolling_text_initialise_bitmaps() { @@ -130,6 +130,1268 @@ static void scrolling_text_format(utf8 *dst, rct_draw_scroll_text *scrollText) extern bool TempForScrollText; +#define SCROLL_POS(x, y) ((y * 64) + x) + +static const sint16 _scrollpos0[] = { + SCROLL_POS( 35, 12 ), + SCROLL_POS( 36, 12 ), + SCROLL_POS( 37, 11 ), + SCROLL_POS( 38, 11 ), + SCROLL_POS( 39, 10 ), + SCROLL_POS( 40, 10 ), + SCROLL_POS( 41, 9 ), + SCROLL_POS( 42, 9 ), + SCROLL_POS( 43, 8 ), + SCROLL_POS( 44, 8 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 7 ), + SCROLL_POS( 47, 6 ), + SCROLL_POS( 48, 6 ), + SCROLL_POS( 49, 5 ), + SCROLL_POS( 50, 5 ), + SCROLL_POS( 51, 4 ), + SCROLL_POS( 52, 4 ), + SCROLL_POS( 53, 3 ), + SCROLL_POS( 54, 3 ), + SCROLL_POS( 55, 2 ), + SCROLL_POS( 56, 2 ), + SCROLL_POS( 57, 1 ), + SCROLL_POS( 58, 1 ), + -1, +}; +static const sint16 _scrollpos1[] = { + SCROLL_POS( 5, 1 ), + SCROLL_POS( 6, 1 ), + SCROLL_POS( 7, 2 ), + SCROLL_POS( 8, 2 ), + SCROLL_POS( 9, 3 ), + SCROLL_POS( 10, 3 ), + SCROLL_POS( 11, 4 ), + SCROLL_POS( 12, 4 ), + SCROLL_POS( 13, 5 ), + SCROLL_POS( 14, 5 ), + SCROLL_POS( 15, 6 ), + SCROLL_POS( 16, 6 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 7 ), + SCROLL_POS( 19, 8 ), + SCROLL_POS( 20, 8 ), + SCROLL_POS( 21, 9 ), + SCROLL_POS( 22, 9 ), + SCROLL_POS( 23, 10 ), + SCROLL_POS( 24, 10 ), + SCROLL_POS( 25, 11 ), + SCROLL_POS( 26, 11 ), + SCROLL_POS( 27, 12 ), + SCROLL_POS( 28, 12 ), + -1, +}; +static const sint16 _scrollpos2[] = { + SCROLL_POS( 12, 1 ), + SCROLL_POS( 13, 1 ), + SCROLL_POS( 14, 2 ), + SCROLL_POS( 15, 2 ), + SCROLL_POS( 16, 3 ), + SCROLL_POS( 17, 3 ), + SCROLL_POS( 18, 4 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 6 ), + SCROLL_POS( 23, 6 ), + SCROLL_POS( 24, 7 ), + SCROLL_POS( 25, 7 ), + SCROLL_POS( 26, 8 ), + SCROLL_POS( 27, 8 ), + SCROLL_POS( 28, 9 ), + SCROLL_POS( 29, 9 ), + SCROLL_POS( 30, 10 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 9 ), + SCROLL_POS( 34, 9 ), + SCROLL_POS( 35, 8 ), + SCROLL_POS( 36, 8 ), + SCROLL_POS( 37, 7 ), + SCROLL_POS( 38, 7 ), + SCROLL_POS( 39, 6 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 4 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 3 ), + SCROLL_POS( 46, 3 ), + SCROLL_POS( 47, 2 ), + SCROLL_POS( 48, 2 ), + SCROLL_POS( 49, 1 ), + SCROLL_POS( 50, 1 ), + -1, +}; +static const sint16 _scrollpos3[] = { + SCROLL_POS( 16, 0 ), + SCROLL_POS( 17, 1 ), + SCROLL_POS( 18, 1 ), + SCROLL_POS( 19, 2 ), + SCROLL_POS( 20, 3 ), + SCROLL_POS( 21, 3 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 5 ), + SCROLL_POS( 24, 5 ), + SCROLL_POS( 25, 6 ), + SCROLL_POS( 26, 6 ), + SCROLL_POS( 27, 7 ), + SCROLL_POS( 28, 7 ), + SCROLL_POS( 29, 8 ), + SCROLL_POS( 30, 8 ), + SCROLL_POS( 31, 9 ), + SCROLL_POS( 32, 9 ), + SCROLL_POS( 33, 10 ), + SCROLL_POS( 34, 10 ), + SCROLL_POS( 35, 11 ), + SCROLL_POS( 36, 11 ), + SCROLL_POS( 37, 12 ), + SCROLL_POS( 38, 12 ), + SCROLL_POS( 39, 13 ), + SCROLL_POS( 40, 13 ), + SCROLL_POS( 41, 14 ), + SCROLL_POS( 42, 14 ), + SCROLL_POS( 43, 14 ), + SCROLL_POS( 44, 15 ), + SCROLL_POS( 45, 15 ), + SCROLL_POS( 46, 15 ), + SCROLL_POS( 47, 16 ), + SCROLL_POS( 48, 16 ), + -1, +}; +static const sint16 _scrollpos4[] = { + SCROLL_POS( 15, 17 ), + SCROLL_POS( 16, 17 ), + SCROLL_POS( 17, 16 ), + SCROLL_POS( 18, 16 ), + SCROLL_POS( 19, 16 ), + SCROLL_POS( 20, 15 ), + SCROLL_POS( 21, 15 ), + SCROLL_POS( 22, 15 ), + SCROLL_POS( 23, 14 ), + SCROLL_POS( 24, 14 ), + SCROLL_POS( 25, 13 ), + SCROLL_POS( 26, 13 ), + SCROLL_POS( 27, 12 ), + SCROLL_POS( 28, 12 ), + SCROLL_POS( 29, 11 ), + SCROLL_POS( 30, 11 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 9 ), + SCROLL_POS( 34, 9 ), + SCROLL_POS( 35, 8 ), + SCROLL_POS( 36, 8 ), + SCROLL_POS( 37, 7 ), + SCROLL_POS( 38, 7 ), + SCROLL_POS( 39, 6 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 4 ), + SCROLL_POS( 44, 3 ), + SCROLL_POS( 45, 2 ), + SCROLL_POS( 46, 2 ), + SCROLL_POS( 47, 1 ), + SCROLL_POS( 48, 0 ), + -1, +}; +static const sint16 _scrollpos5[] = { + SCROLL_POS( 4, 12 ), + SCROLL_POS( 5, 12 ), + SCROLL_POS( 6, 11 ), + SCROLL_POS( 7, 11 ), + SCROLL_POS( 8, 10 ), + SCROLL_POS( 9, 10 ), + SCROLL_POS( 10, 9 ), + SCROLL_POS( 11, 9 ), + SCROLL_POS( 12, 8 ), + SCROLL_POS( 13, 8 ), + SCROLL_POS( 14, 7 ), + SCROLL_POS( 15, 7 ), + SCROLL_POS( 16, 6 ), + SCROLL_POS( 17, 6 ), + SCROLL_POS( 18, 5 ), + SCROLL_POS( 19, 5 ), + SCROLL_POS( 20, 4 ), + SCROLL_POS( 21, 4 ), + SCROLL_POS( 22, 3 ), + SCROLL_POS( 23, 3 ), + SCROLL_POS( 24, 2 ), + SCROLL_POS( 25, 2 ), + SCROLL_POS( 26, 1 ), + SCROLL_POS( 27, 1 ), + -1, +}; +static const sint16 _scrollpos6[] = { + SCROLL_POS( 36, 1 ), + SCROLL_POS( 37, 1 ), + SCROLL_POS( 38, 2 ), + SCROLL_POS( 39, 2 ), + SCROLL_POS( 40, 3 ), + SCROLL_POS( 41, 3 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 4 ), + SCROLL_POS( 44, 5 ), + SCROLL_POS( 45, 5 ), + SCROLL_POS( 46, 6 ), + SCROLL_POS( 47, 6 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 7 ), + SCROLL_POS( 50, 8 ), + SCROLL_POS( 51, 8 ), + SCROLL_POS( 52, 9 ), + SCROLL_POS( 53, 9 ), + SCROLL_POS( 54, 10 ), + SCROLL_POS( 55, 10 ), + SCROLL_POS( 56, 11 ), + SCROLL_POS( 57, 11 ), + SCROLL_POS( 58, 12 ), + SCROLL_POS( 59, 12 ), + -1, +}; +static const sint16 _scrollpos7[] = { + SCROLL_POS( 8, 11 ), + SCROLL_POS( 9, 11 ), + SCROLL_POS( 10, 10 ), + SCROLL_POS( 11, 10 ), + SCROLL_POS( 12, 9 ), + SCROLL_POS( 13, 9 ), + SCROLL_POS( 14, 8 ), + SCROLL_POS( 15, 8 ), + SCROLL_POS( 16, 7 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 6 ), + SCROLL_POS( 19, 6 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 4 ), + SCROLL_POS( 24, 3 ), + SCROLL_POS( 25, 3 ), + SCROLL_POS( 26, 2 ), + SCROLL_POS( 27, 2 ), + SCROLL_POS( 28, 1 ), + SCROLL_POS( 29, 1 ), + -1, +}; +static const sint16 _scrollpos8[] = { + SCROLL_POS( 36, 2 ), + SCROLL_POS( 37, 2 ), + SCROLL_POS( 38, 3 ), + SCROLL_POS( 39, 3 ), + SCROLL_POS( 40, 4 ), + SCROLL_POS( 41, 4 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 6 ), + SCROLL_POS( 45, 6 ), + SCROLL_POS( 46, 7 ), + SCROLL_POS( 47, 7 ), + SCROLL_POS( 48, 8 ), + SCROLL_POS( 49, 8 ), + SCROLL_POS( 50, 9 ), + SCROLL_POS( 51, 9 ), + SCROLL_POS( 52, 10 ), + SCROLL_POS( 53, 10 ), + SCROLL_POS( 54, 11 ), + SCROLL_POS( 55, 11 ), + -1, +}; +static const sint16 _scrollpos9[] = { + SCROLL_POS( 11, 9 ), + SCROLL_POS( 12, 9 ), + SCROLL_POS( 13, 9 ), + SCROLL_POS( 14, 9 ), + SCROLL_POS( 15, 9 ), + SCROLL_POS( 16, 8 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 7 ), + SCROLL_POS( 19, 7 ), + SCROLL_POS( 20, 7 ), + SCROLL_POS( 21, 6 ), + SCROLL_POS( 22, 6 ), + SCROLL_POS( 23, 5 ), + SCROLL_POS( 24, 4 ), + SCROLL_POS( 25, 4 ), + SCROLL_POS( 26, 3 ), + SCROLL_POS( 27, 3 ), + SCROLL_POS( 28, 2 ), + SCROLL_POS( 29, 1 ), + -1, +}; +static const sint16 _scrollpos10[] = { + SCROLL_POS( 34, 1 ), + SCROLL_POS( 35, 2 ), + SCROLL_POS( 36, 3 ), + SCROLL_POS( 37, 3 ), + SCROLL_POS( 38, 4 ), + SCROLL_POS( 39, 4 ), + SCROLL_POS( 40, 5 ), + SCROLL_POS( 41, 6 ), + SCROLL_POS( 42, 6 ), + SCROLL_POS( 43, 7 ), + SCROLL_POS( 44, 7 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 8 ), + SCROLL_POS( 48, 9 ), + SCROLL_POS( 49, 9 ), + SCROLL_POS( 50, 9 ), + SCROLL_POS( 51, 9 ), + SCROLL_POS( 52, 9 ), + -1, +}; +static const sint16 _scrollpos11[] = { + SCROLL_POS( 14, 10 ), + SCROLL_POS( 15, 9 ), + SCROLL_POS( 16, 9 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 8 ), + SCROLL_POS( 19, 7 ), + SCROLL_POS( 20, 7 ), + SCROLL_POS( 21, 6 ), + SCROLL_POS( 22, 6 ), + SCROLL_POS( 23, 5 ), + SCROLL_POS( 24, 5 ), + SCROLL_POS( 25, 4 ), + SCROLL_POS( 26, 4 ), + SCROLL_POS( 27, 3 ), + SCROLL_POS( 28, 3 ), + SCROLL_POS( 29, 2 ), + SCROLL_POS( 30, 2 ), + SCROLL_POS( 31, 1 ), + SCROLL_POS( 32, 1 ), + SCROLL_POS( 33, 0 ), + SCROLL_POS( 34, 0 ), + -1, +}; +static const sint16 _scrollpos12[] = { + SCROLL_POS( 33, 1 ), + SCROLL_POS( 34, 2 ), + SCROLL_POS( 35, 2 ), + SCROLL_POS( 36, 3 ), + SCROLL_POS( 37, 3 ), + SCROLL_POS( 38, 4 ), + SCROLL_POS( 39, 4 ), + SCROLL_POS( 40, 5 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 6 ), + SCROLL_POS( 43, 6 ), + SCROLL_POS( 44, 7 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 8 ), + SCROLL_POS( 48, 9 ), + SCROLL_POS( 49, 9 ), + SCROLL_POS( 50, 10 ), + SCROLL_POS( 51, 10 ), + SCROLL_POS( 52, 11 ), + SCROLL_POS( 53, 11 ), + -1, +}; +static const sint16 _scrollpos13[] = { + SCROLL_POS( 12, 11 ), + SCROLL_POS( 13, 10 ), + SCROLL_POS( 14, 10 ), + SCROLL_POS( 15, 9 ), + SCROLL_POS( 16, 9 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 8 ), + SCROLL_POS( 19, 7 ), + SCROLL_POS( 20, 7 ), + SCROLL_POS( 21, 6 ), + SCROLL_POS( 22, 6 ), + SCROLL_POS( 23, 5 ), + SCROLL_POS( 24, 5 ), + SCROLL_POS( 25, 4 ), + SCROLL_POS( 26, 4 ), + SCROLL_POS( 27, 3 ), + SCROLL_POS( 28, 3 ), + SCROLL_POS( 29, 2 ), + SCROLL_POS( 30, 2 ), + SCROLL_POS( 31, 1 ), + -1, +}; +static const sint16 _scrollpos14[] = { + SCROLL_POS( 33, 1 ), + SCROLL_POS( 34, 2 ), + SCROLL_POS( 35, 2 ), + SCROLL_POS( 36, 3 ), + SCROLL_POS( 37, 3 ), + SCROLL_POS( 38, 4 ), + SCROLL_POS( 39, 4 ), + SCROLL_POS( 40, 5 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 6 ), + SCROLL_POS( 43, 6 ), + SCROLL_POS( 44, 7 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 8 ), + SCROLL_POS( 48, 9 ), + SCROLL_POS( 49, 9 ), + SCROLL_POS( 50, 10 ), + SCROLL_POS( 51, 10 ), + SCROLL_POS( 52, 11 ), + SCROLL_POS( 53, 11 ), + -1, +}; +static const sint16 _scrollpos15[] = { + SCROLL_POS( 10, 10 ), + SCROLL_POS( 11, 10 ), + SCROLL_POS( 12, 9 ), + SCROLL_POS( 13, 9 ), + SCROLL_POS( 14, 8 ), + SCROLL_POS( 15, 8 ), + SCROLL_POS( 16, 7 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 6 ), + SCROLL_POS( 19, 6 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 4 ), + SCROLL_POS( 24, 3 ), + SCROLL_POS( 25, 3 ), + SCROLL_POS( 26, 2 ), + SCROLL_POS( 27, 2 ), + SCROLL_POS( 28, 1 ), + SCROLL_POS( 29, 1 ), + SCROLL_POS( 30, 0 ), + SCROLL_POS( 31, 0 ), + -1, +}; +static const sint16 _scrollpos16[] = { + SCROLL_POS( 33, 0 ), + SCROLL_POS( 34, 0 ), + SCROLL_POS( 35, 1 ), + SCROLL_POS( 36, 1 ), + SCROLL_POS( 37, 2 ), + SCROLL_POS( 38, 2 ), + SCROLL_POS( 39, 3 ), + SCROLL_POS( 40, 3 ), + SCROLL_POS( 41, 4 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 5 ), + SCROLL_POS( 45, 6 ), + SCROLL_POS( 46, 6 ), + SCROLL_POS( 47, 7 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 8 ), + SCROLL_POS( 50, 8 ), + SCROLL_POS( 51, 9 ), + SCROLL_POS( 52, 9 ), + SCROLL_POS( 53, 10 ), + SCROLL_POS( 54, 10 ), + -1, +}; +static const sint16 _scrollpos17[] = { + SCROLL_POS( 6, 11 ), + SCROLL_POS( 7, 11 ), + SCROLL_POS( 8, 10 ), + SCROLL_POS( 9, 10 ), + SCROLL_POS( 10, 9 ), + SCROLL_POS( 11, 9 ), + SCROLL_POS( 12, 8 ), + SCROLL_POS( 13, 8 ), + SCROLL_POS( 14, 7 ), + SCROLL_POS( 15, 7 ), + SCROLL_POS( 16, 6 ), + SCROLL_POS( 17, 6 ), + SCROLL_POS( 18, 5 ), + SCROLL_POS( 19, 5 ), + SCROLL_POS( 20, 4 ), + SCROLL_POS( 21, 4 ), + SCROLL_POS( 22, 3 ), + SCROLL_POS( 23, 3 ), + SCROLL_POS( 24, 2 ), + SCROLL_POS( 25, 2 ), + SCROLL_POS( 26, 1 ), + SCROLL_POS( 27, 1 ), + SCROLL_POS( 28, 0 ), + SCROLL_POS( 29, 0 ), + -1, +}; +static const sint16 _scrollpos18[] = { + SCROLL_POS( 34, 0 ), + SCROLL_POS( 35, 0 ), + SCROLL_POS( 36, 1 ), + SCROLL_POS( 37, 1 ), + SCROLL_POS( 38, 2 ), + SCROLL_POS( 39, 2 ), + SCROLL_POS( 40, 3 ), + SCROLL_POS( 41, 3 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 4 ), + SCROLL_POS( 44, 5 ), + SCROLL_POS( 45, 5 ), + SCROLL_POS( 46, 6 ), + SCROLL_POS( 47, 6 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 7 ), + SCROLL_POS( 50, 8 ), + SCROLL_POS( 51, 8 ), + SCROLL_POS( 52, 9 ), + SCROLL_POS( 53, 9 ), + SCROLL_POS( 54, 10 ), + SCROLL_POS( 55, 10 ), + SCROLL_POS( 56, 11 ), + SCROLL_POS( 57, 11 ), + -1, +}; +static const sint16 _scrollpos19[] = { + SCROLL_POS( 13, 1 ), + SCROLL_POS( 14, 1 ), + SCROLL_POS( 15, 2 ), + SCROLL_POS( 16, 2 ), + SCROLL_POS( 17, 3 ), + SCROLL_POS( 18, 3 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 4 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 5 ), + SCROLL_POS( 23, 6 ), + SCROLL_POS( 24, 6 ), + SCROLL_POS( 25, 7 ), + SCROLL_POS( 26, 7 ), + SCROLL_POS( 27, 8 ), + SCROLL_POS( 28, 8 ), + SCROLL_POS( 29, 9 ), + SCROLL_POS( 30, 9 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 10 ), + SCROLL_POS( 34, 9 ), + SCROLL_POS( 35, 9 ), + SCROLL_POS( 36, 8 ), + SCROLL_POS( 37, 8 ), + SCROLL_POS( 38, 7 ), + SCROLL_POS( 39, 7 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 6 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 4 ), + SCROLL_POS( 46, 3 ), + SCROLL_POS( 47, 3 ), + SCROLL_POS( 48, 2 ), + SCROLL_POS( 49, 2 ), + SCROLL_POS( 50, 1 ), + SCROLL_POS( 51, 1 ), + -1, +}; +static const sint16 _scrollpos20[] = { + SCROLL_POS( 12, 1 ), + SCROLL_POS( 13, 3 ), + SCROLL_POS( 14, 4 ), + SCROLL_POS( 15, 5 ), + SCROLL_POS( 16, 6 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 7 ), + SCROLL_POS( 19, 8 ), + SCROLL_POS( 20, 8 ), + SCROLL_POS( 21, 9 ), + SCROLL_POS( 22, 9 ), + SCROLL_POS( 23, 9 ), + SCROLL_POS( 24, 10 ), + SCROLL_POS( 25, 10 ), + SCROLL_POS( 26, 10 ), + SCROLL_POS( 27, 10 ), + SCROLL_POS( 28, 10 ), + SCROLL_POS( 29, 10 ), + SCROLL_POS( 30, 10 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 10 ), + SCROLL_POS( 34, 10 ), + SCROLL_POS( 35, 10 ), + SCROLL_POS( 36, 10 ), + SCROLL_POS( 37, 10 ), + SCROLL_POS( 38, 10 ), + SCROLL_POS( 39, 9 ), + SCROLL_POS( 40, 9 ), + SCROLL_POS( 41, 9 ), + SCROLL_POS( 42, 8 ), + SCROLL_POS( 43, 8 ), + SCROLL_POS( 44, 7 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 6 ), + SCROLL_POS( 47, 5 ), + SCROLL_POS( 48, 4 ), + SCROLL_POS( 49, 3 ), + -1, +}; +static const sint16 _scrollpos21[] = { + SCROLL_POS( 12, 1 ), + SCROLL_POS( 13, 1 ), + SCROLL_POS( 14, 2 ), + SCROLL_POS( 15, 2 ), + SCROLL_POS( 16, 3 ), + SCROLL_POS( 17, 3 ), + SCROLL_POS( 18, 4 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 6 ), + SCROLL_POS( 23, 6 ), + SCROLL_POS( 24, 7 ), + SCROLL_POS( 25, 7 ), + SCROLL_POS( 26, 8 ), + SCROLL_POS( 27, 8 ), + SCROLL_POS( 28, 9 ), + SCROLL_POS( 29, 9 ), + SCROLL_POS( 30, 10 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 9 ), + SCROLL_POS( 34, 9 ), + SCROLL_POS( 35, 8 ), + SCROLL_POS( 36, 8 ), + SCROLL_POS( 37, 7 ), + SCROLL_POS( 38, 7 ), + SCROLL_POS( 39, 6 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 4 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 3 ), + SCROLL_POS( 46, 3 ), + SCROLL_POS( 47, 2 ), + SCROLL_POS( 48, 2 ), + SCROLL_POS( 49, 1 ), + -1, +}; +static const sint16 _scrollpos22[] = { + SCROLL_POS( 16, 1 ), + SCROLL_POS( 17, 1 ), + SCROLL_POS( 18, 2 ), + SCROLL_POS( 19, 2 ), + SCROLL_POS( 20, 3 ), + SCROLL_POS( 21, 3 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 4 ), + SCROLL_POS( 24, 5 ), + SCROLL_POS( 25, 5 ), + SCROLL_POS( 26, 6 ), + SCROLL_POS( 27, 6 ), + SCROLL_POS( 28, 6 ), + SCROLL_POS( 29, 6 ), + SCROLL_POS( 30, 6 ), + SCROLL_POS( 31, 6 ), + SCROLL_POS( 32, 6 ), + SCROLL_POS( 33, 6 ), + SCROLL_POS( 34, 6 ), + SCROLL_POS( 35, 6 ), + SCROLL_POS( 36, 6 ), + SCROLL_POS( 37, 6 ), + SCROLL_POS( 38, 6 ), + SCROLL_POS( 39, 5 ), + SCROLL_POS( 40, 5 ), + SCROLL_POS( 41, 4 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 3 ), + SCROLL_POS( 44, 3 ), + SCROLL_POS( 45, 2 ), + SCROLL_POS( 46, 2 ), + SCROLL_POS( 47, 1 ), + SCROLL_POS( 48, 1 ), + -1, +}; +static const sint16 _scrollpos23[] = { + SCROLL_POS( 15, 1 ), + SCROLL_POS( 16, 2 ), + SCROLL_POS( 17, 2 ), + SCROLL_POS( 18, 3 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 5 ), + SCROLL_POS( 23, 6 ), + SCROLL_POS( 24, 6 ), + SCROLL_POS( 25, 6 ), + SCROLL_POS( 26, 6 ), + SCROLL_POS( 27, 7 ), + SCROLL_POS( 28, 7 ), + SCROLL_POS( 29, 7 ), + SCROLL_POS( 30, 7 ), + SCROLL_POS( 31, 7 ), + SCROLL_POS( 32, 7 ), + SCROLL_POS( 33, 7 ), + SCROLL_POS( 34, 7 ), + SCROLL_POS( 35, 7 ), + SCROLL_POS( 36, 7 ), + SCROLL_POS( 37, 6 ), + SCROLL_POS( 38, 6 ), + SCROLL_POS( 39, 6 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 3 ), + SCROLL_POS( 46, 3 ), + SCROLL_POS( 47, 2 ), + SCROLL_POS( 48, 1 ), + -1, +}; +static const sint16 _scrollpos24[] = { + SCROLL_POS( 8, 9 ), + SCROLL_POS( 9, 9 ), + SCROLL_POS( 10, 8 ), + SCROLL_POS( 11, 8 ), + SCROLL_POS( 12, 7 ), + SCROLL_POS( 13, 7 ), + SCROLL_POS( 14, 6 ), + SCROLL_POS( 15, 6 ), + SCROLL_POS( 16, 5 ), + SCROLL_POS( 17, 5 ), + SCROLL_POS( 18, 4 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 3 ), + SCROLL_POS( 21, 3 ), + SCROLL_POS( 22, 2 ), + SCROLL_POS( 23, 2 ), + SCROLL_POS( 24, 1 ), + SCROLL_POS( 25, 1 ), + SCROLL_POS( 26, 0 ), + SCROLL_POS( 27, 0 ), + -1, +}; +static const sint16 _scrollpos25[] = { + SCROLL_POS( 36, 0 ), + SCROLL_POS( 37, 0 ), + SCROLL_POS( 38, 1 ), + SCROLL_POS( 39, 1 ), + SCROLL_POS( 40, 2 ), + SCROLL_POS( 41, 2 ), + SCROLL_POS( 42, 3 ), + SCROLL_POS( 43, 3 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 4 ), + SCROLL_POS( 46, 5 ), + SCROLL_POS( 47, 5 ), + SCROLL_POS( 48, 6 ), + SCROLL_POS( 49, 6 ), + SCROLL_POS( 50, 7 ), + SCROLL_POS( 51, 7 ), + SCROLL_POS( 52, 8 ), + SCROLL_POS( 53, 8 ), + SCROLL_POS( 54, 9 ), + SCROLL_POS( 55, 9 ), + -1, +}; +static const sint16 _scrollpos26[] = { + SCROLL_POS( 4, 13 ), + SCROLL_POS( 5, 13 ), + SCROLL_POS( 6, 12 ), + SCROLL_POS( 7, 12 ), + SCROLL_POS( 8, 11 ), + SCROLL_POS( 9, 11 ), + SCROLL_POS( 10, 10 ), + SCROLL_POS( 11, 10 ), + SCROLL_POS( 12, 9 ), + SCROLL_POS( 13, 9 ), + SCROLL_POS( 14, 8 ), + SCROLL_POS( 15, 8 ), + SCROLL_POS( 16, 7 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 6 ), + SCROLL_POS( 19, 6 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 4 ), + SCROLL_POS( 24, 3 ), + SCROLL_POS( 25, 3 ), + SCROLL_POS( 26, 2 ), + SCROLL_POS( 27, 2 ), + SCROLL_POS( 28, 1 ), + SCROLL_POS( 29, 1 ), + SCROLL_POS( 30, 0 ), + SCROLL_POS( 31, 0 ), + -1, +}; +static const sint16 _scrollpos27[] = { + SCROLL_POS( 32, 0 ), + SCROLL_POS( 33, 0 ), + SCROLL_POS( 34, 1 ), + SCROLL_POS( 35, 1 ), + SCROLL_POS( 36, 2 ), + SCROLL_POS( 37, 2 ), + SCROLL_POS( 38, 3 ), + SCROLL_POS( 39, 3 ), + SCROLL_POS( 40, 4 ), + SCROLL_POS( 41, 4 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 6 ), + SCROLL_POS( 45, 6 ), + SCROLL_POS( 46, 7 ), + SCROLL_POS( 47, 7 ), + SCROLL_POS( 48, 8 ), + SCROLL_POS( 49, 8 ), + SCROLL_POS( 50, 9 ), + SCROLL_POS( 51, 9 ), + SCROLL_POS( 52, 10 ), + SCROLL_POS( 53, 10 ), + SCROLL_POS( 54, 11 ), + SCROLL_POS( 55, 11 ), + SCROLL_POS( 56, 12 ), + SCROLL_POS( 57, 12 ), + SCROLL_POS( 58, 13 ), + SCROLL_POS( 59, 13 ), + -1, +}; +static const sint16 _scrollpos28[] = { + SCROLL_POS( 6, 13 ), + SCROLL_POS( 7, 13 ), + SCROLL_POS( 8, 12 ), + SCROLL_POS( 9, 12 ), + SCROLL_POS( 10, 11 ), + SCROLL_POS( 11, 11 ), + SCROLL_POS( 12, 10 ), + SCROLL_POS( 13, 10 ), + SCROLL_POS( 14, 9 ), + SCROLL_POS( 15, 9 ), + SCROLL_POS( 16, 8 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 7 ), + SCROLL_POS( 19, 7 ), + SCROLL_POS( 20, 6 ), + SCROLL_POS( 21, 6 ), + SCROLL_POS( 22, 5 ), + SCROLL_POS( 23, 5 ), + SCROLL_POS( 24, 4 ), + SCROLL_POS( 25, 4 ), + SCROLL_POS( 26, 3 ), + SCROLL_POS( 27, 3 ), + SCROLL_POS( 28, 2 ), + SCROLL_POS( 29, 2 ), + SCROLL_POS( 30, 1 ), + SCROLL_POS( 31, 1 ), + SCROLL_POS( 32, 0 ), + SCROLL_POS( 33, 0 ), + -1, +}; +static const sint16 _scrollpos29[] = { + SCROLL_POS( 30, 0 ), + SCROLL_POS( 31, 0 ), + SCROLL_POS( 32, 1 ), + SCROLL_POS( 33, 1 ), + SCROLL_POS( 34, 2 ), + SCROLL_POS( 35, 2 ), + SCROLL_POS( 36, 3 ), + SCROLL_POS( 37, 3 ), + SCROLL_POS( 38, 4 ), + SCROLL_POS( 39, 4 ), + SCROLL_POS( 40, 5 ), + SCROLL_POS( 41, 5 ), + SCROLL_POS( 42, 6 ), + SCROLL_POS( 43, 6 ), + SCROLL_POS( 44, 7 ), + SCROLL_POS( 45, 7 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 8 ), + SCROLL_POS( 48, 9 ), + SCROLL_POS( 49, 9 ), + SCROLL_POS( 50, 10 ), + SCROLL_POS( 51, 10 ), + SCROLL_POS( 52, 11 ), + SCROLL_POS( 53, 11 ), + SCROLL_POS( 54, 12 ), + SCROLL_POS( 55, 12 ), + SCROLL_POS( 56, 13 ), + SCROLL_POS( 57, 13 ), + -1, +}; +static const sint16 _scrollpos30[] = { + SCROLL_POS( 2, 30 ), + SCROLL_POS( 3, 30 ), + SCROLL_POS( 4, 29 ), + SCROLL_POS( 5, 29 ), + SCROLL_POS( 6, 28 ), + SCROLL_POS( 7, 28 ), + SCROLL_POS( 8, 27 ), + SCROLL_POS( 9, 27 ), + SCROLL_POS( 10, 26 ), + SCROLL_POS( 11, 26 ), + SCROLL_POS( 12, 25 ), + SCROLL_POS( 13, 25 ), + SCROLL_POS( 14, 24 ), + SCROLL_POS( 15, 24 ), + SCROLL_POS( 16, 23 ), + SCROLL_POS( 17, 23 ), + SCROLL_POS( 18, 22 ), + SCROLL_POS( 19, 22 ), + SCROLL_POS( 20, 21 ), + SCROLL_POS( 21, 21 ), + SCROLL_POS( 22, 20 ), + SCROLL_POS( 23, 20 ), + SCROLL_POS( 24, 19 ), + SCROLL_POS( 25, 19 ), + SCROLL_POS( 26, 18 ), + SCROLL_POS( 27, 18 ), + SCROLL_POS( 28, 17 ), + SCROLL_POS( 29, 17 ), + SCROLL_POS( 30, 16 ), + SCROLL_POS( 31, 16 ), + SCROLL_POS( 32, 15 ), + SCROLL_POS( 33, 15 ), + SCROLL_POS( 34, 14 ), + SCROLL_POS( 35, 14 ), + SCROLL_POS( 36, 13 ), + SCROLL_POS( 37, 13 ), + SCROLL_POS( 38, 12 ), + SCROLL_POS( 39, 12 ), + SCROLL_POS( 40, 11 ), + SCROLL_POS( 41, 11 ), + SCROLL_POS( 42, 10 ), + SCROLL_POS( 43, 10 ), + SCROLL_POS( 44, 9 ), + SCROLL_POS( 45, 9 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 8 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 7 ), + SCROLL_POS( 50, 6 ), + SCROLL_POS( 51, 6 ), + SCROLL_POS( 52, 5 ), + SCROLL_POS( 53, 5 ), + SCROLL_POS( 54, 4 ), + SCROLL_POS( 55, 4 ), + SCROLL_POS( 56, 3 ), + SCROLL_POS( 57, 3 ), + SCROLL_POS( 58, 2 ), + SCROLL_POS( 59, 2 ), + SCROLL_POS( 60, 1 ), + SCROLL_POS( 61, 1 ), + SCROLL_POS( 62, 0 ), + -1, +}; +static const sint16 _scrollpos31[] = { + SCROLL_POS( 1, 0 ), + SCROLL_POS( 2, 1 ), + SCROLL_POS( 3, 1 ), + SCROLL_POS( 4, 2 ), + SCROLL_POS( 5, 2 ), + SCROLL_POS( 6, 3 ), + SCROLL_POS( 7, 3 ), + SCROLL_POS( 8, 4 ), + SCROLL_POS( 9, 4 ), + SCROLL_POS( 10, 5 ), + SCROLL_POS( 11, 5 ), + SCROLL_POS( 12, 6 ), + SCROLL_POS( 13, 6 ), + SCROLL_POS( 14, 7 ), + SCROLL_POS( 15, 7 ), + SCROLL_POS( 16, 8 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 9 ), + SCROLL_POS( 19, 9 ), + SCROLL_POS( 20, 10 ), + SCROLL_POS( 21, 10 ), + SCROLL_POS( 22, 11 ), + SCROLL_POS( 23, 11 ), + SCROLL_POS( 24, 12 ), + SCROLL_POS( 25, 12 ), + SCROLL_POS( 26, 13 ), + SCROLL_POS( 27, 13 ), + SCROLL_POS( 28, 14 ), + SCROLL_POS( 29, 14 ), + SCROLL_POS( 30, 15 ), + SCROLL_POS( 31, 15 ), + SCROLL_POS( 32, 16 ), + SCROLL_POS( 33, 16 ), + SCROLL_POS( 34, 17 ), + SCROLL_POS( 35, 17 ), + SCROLL_POS( 36, 18 ), + SCROLL_POS( 37, 18 ), + SCROLL_POS( 38, 19 ), + SCROLL_POS( 39, 19 ), + SCROLL_POS( 40, 20 ), + SCROLL_POS( 41, 20 ), + SCROLL_POS( 42, 21 ), + SCROLL_POS( 43, 21 ), + SCROLL_POS( 44, 22 ), + SCROLL_POS( 45, 22 ), + SCROLL_POS( 46, 23 ), + SCROLL_POS( 47, 23 ), + SCROLL_POS( 48, 24 ), + SCROLL_POS( 49, 24 ), + SCROLL_POS( 50, 25 ), + SCROLL_POS( 51, 25 ), + SCROLL_POS( 52, 26 ), + SCROLL_POS( 53, 26 ), + SCROLL_POS( 54, 27 ), + SCROLL_POS( 55, 27 ), + SCROLL_POS( 56, 28 ), + SCROLL_POS( 57, 28 ), + SCROLL_POS( 58, 29 ), + SCROLL_POS( 59, 29 ), + SCROLL_POS( 60, 30 ), + SCROLL_POS( 61, 30 ), + -1, +}; +static const sint16 _scrollpos32[] = { + SCROLL_POS( 12, 0 ), + SCROLL_POS( 13, 1 ), + SCROLL_POS( 14, 1 ), + SCROLL_POS( 15, 2 ), + SCROLL_POS( 16, 2 ), + SCROLL_POS( 17, 3 ), + SCROLL_POS( 18, 3 ), + SCROLL_POS( 19, 4 ), + SCROLL_POS( 20, 4 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 5 ), + SCROLL_POS( 23, 6 ), + SCROLL_POS( 24, 6 ), + SCROLL_POS( 25, 7 ), + SCROLL_POS( 26, 7 ), + SCROLL_POS( 27, 8 ), + SCROLL_POS( 28, 8 ), + SCROLL_POS( 29, 9 ), + SCROLL_POS( 30, 9 ), + SCROLL_POS( 31, 10 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 11 ), + SCROLL_POS( 34, 11 ), + SCROLL_POS( 35, 12 ), + SCROLL_POS( 36, 12 ), + SCROLL_POS( 37, 13 ), + SCROLL_POS( 38, 13 ), + SCROLL_POS( 39, 14 ), + SCROLL_POS( 40, 14 ), + SCROLL_POS( 41, 15 ), + SCROLL_POS( 42, 15 ), + SCROLL_POS( 43, 16 ), + SCROLL_POS( 44, 16 ), + SCROLL_POS( 45, 17 ), + SCROLL_POS( 46, 17 ), + SCROLL_POS( 47, 18 ), + SCROLL_POS( 48, 18 ), + SCROLL_POS( 49, 19 ), + SCROLL_POS( 50, 19 ), + -1, +}; +static const sint16 _scrollpos33[] = { + SCROLL_POS( 12, 20 ), + SCROLL_POS( 13, 20 ), + SCROLL_POS( 14, 19 ), + SCROLL_POS( 15, 19 ), + SCROLL_POS( 16, 18 ), + SCROLL_POS( 17, 18 ), + SCROLL_POS( 18, 17 ), + SCROLL_POS( 19, 17 ), + SCROLL_POS( 20, 16 ), + SCROLL_POS( 21, 16 ), + SCROLL_POS( 22, 15 ), + SCROLL_POS( 23, 15 ), + SCROLL_POS( 24, 14 ), + SCROLL_POS( 25, 14 ), + SCROLL_POS( 26, 13 ), + SCROLL_POS( 27, 13 ), + SCROLL_POS( 28, 12 ), + SCROLL_POS( 29, 12 ), + SCROLL_POS( 30, 11 ), + SCROLL_POS( 31, 11 ), + SCROLL_POS( 32, 10 ), + SCROLL_POS( 33, 10 ), + SCROLL_POS( 34, 9 ), + SCROLL_POS( 35, 9 ), + SCROLL_POS( 36, 8 ), + SCROLL_POS( 37, 8 ), + SCROLL_POS( 38, 7 ), + SCROLL_POS( 39, 7 ), + SCROLL_POS( 40, 6 ), + SCROLL_POS( 41, 6 ), + SCROLL_POS( 42, 5 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 4 ), + SCROLL_POS( 45, 4 ), + SCROLL_POS( 46, 3 ), + SCROLL_POS( 47, 3 ), + SCROLL_POS( 48, 2 ), + SCROLL_POS( 49, 2 ), + SCROLL_POS( 50, 1 ), + SCROLL_POS( 51, 1 ), + -1, +}; +static const sint16 _scrollpos34[] = { + SCROLL_POS( 2, 14 ), + SCROLL_POS( 3, 14 ), + SCROLL_POS( 4, 13 ), + SCROLL_POS( 5, 13 ), + SCROLL_POS( 6, 12 ), + SCROLL_POS( 7, 12 ), + SCROLL_POS( 8, 11 ), + SCROLL_POS( 9, 11 ), + SCROLL_POS( 10, 10 ), + SCROLL_POS( 11, 10 ), + SCROLL_POS( 12, 9 ), + SCROLL_POS( 13, 9 ), + SCROLL_POS( 14, 8 ), + SCROLL_POS( 15, 8 ), + SCROLL_POS( 16, 7 ), + SCROLL_POS( 17, 7 ), + SCROLL_POS( 18, 6 ), + SCROLL_POS( 19, 6 ), + SCROLL_POS( 20, 5 ), + SCROLL_POS( 21, 5 ), + SCROLL_POS( 22, 4 ), + SCROLL_POS( 23, 4 ), + SCROLL_POS( 24, 3 ), + SCROLL_POS( 25, 3 ), + SCROLL_POS( 26, 2 ), + SCROLL_POS( 27, 2 ), + SCROLL_POS( 28, 1 ), + SCROLL_POS( 29, 1 ), + SCROLL_POS( 30, 0 ), + -1, +}; +static const sint16 _scrollpos35[] = { + SCROLL_POS( 33, 0 ), + SCROLL_POS( 34, 0 ), + SCROLL_POS( 35, 1 ), + SCROLL_POS( 36, 1 ), + SCROLL_POS( 37, 2 ), + SCROLL_POS( 38, 2 ), + SCROLL_POS( 39, 3 ), + SCROLL_POS( 40, 3 ), + SCROLL_POS( 41, 4 ), + SCROLL_POS( 42, 4 ), + SCROLL_POS( 43, 5 ), + SCROLL_POS( 44, 5 ), + SCROLL_POS( 45, 6 ), + SCROLL_POS( 46, 6 ), + SCROLL_POS( 47, 7 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 8 ), + SCROLL_POS( 50, 8 ), + SCROLL_POS( 51, 9 ), + SCROLL_POS( 52, 9 ), + SCROLL_POS( 53, 10 ), + SCROLL_POS( 54, 10 ), + SCROLL_POS( 55, 11 ), + SCROLL_POS( 56, 11 ), + SCROLL_POS( 57, 12 ), + SCROLL_POS( 58, 12 ), + SCROLL_POS( 59, 13 ), + SCROLL_POS( 60, 13 ), + SCROLL_POS( 61, 14 ), + -1, +}; +static const sint16 _scrollpos36[] = { + SCROLL_POS( 4, 0 ), + SCROLL_POS( 5, 1 ), + SCROLL_POS( 6, 2 ), + SCROLL_POS( 7, 3 ), + SCROLL_POS( 8, 3 ), + SCROLL_POS( 9, 4 ), + SCROLL_POS( 10, 5 ), + SCROLL_POS( 11, 5 ), + SCROLL_POS( 12, 6 ), + SCROLL_POS( 13, 6 ), + SCROLL_POS( 14, 7 ), + SCROLL_POS( 15, 7 ), + SCROLL_POS( 16, 8 ), + SCROLL_POS( 17, 8 ), + SCROLL_POS( 18, 9 ), + SCROLL_POS( 19, 9 ), + SCROLL_POS( 20, 10 ), + SCROLL_POS( 21, 10 ), + SCROLL_POS( 22, 10 ), + SCROLL_POS( 23, 11 ), + SCROLL_POS( 24, 11 ), + SCROLL_POS( 25, 11 ), + SCROLL_POS( 26, 12 ), + SCROLL_POS( 27, 12 ), + SCROLL_POS( 28, 12 ), + SCROLL_POS( 29, 12 ), + SCROLL_POS( 30, 12 ), + -1, +}; +static const sint16 _scrollpos37[] = { + SCROLL_POS( 32, 13 ), + SCROLL_POS( 33, 12 ), + SCROLL_POS( 34, 12 ), + SCROLL_POS( 35, 12 ), + SCROLL_POS( 36, 12 ), + SCROLL_POS( 37, 11 ), + SCROLL_POS( 38, 11 ), + SCROLL_POS( 39, 11 ), + SCROLL_POS( 40, 10 ), + SCROLL_POS( 41, 10 ), + SCROLL_POS( 42, 10 ), + SCROLL_POS( 43, 9 ), + SCROLL_POS( 44, 9 ), + SCROLL_POS( 45, 8 ), + SCROLL_POS( 46, 8 ), + SCROLL_POS( 47, 7 ), + SCROLL_POS( 48, 7 ), + SCROLL_POS( 49, 6 ), + SCROLL_POS( 50, 6 ), + SCROLL_POS( 51, 5 ), + SCROLL_POS( 52, 5 ), + SCROLL_POS( 53, 4 ), + SCROLL_POS( 54, 3 ), + SCROLL_POS( 55, 3 ), + SCROLL_POS( 56, 2 ), + SCROLL_POS( 57, 1 ), + SCROLL_POS( 58, 0 ), + -1, +}; + +static const sint16* _scrollPositions[38] = { + _scrollpos0, + _scrollpos1, + _scrollpos2, + _scrollpos3, + _scrollpos4, + _scrollpos5, + _scrollpos6, + _scrollpos7, + _scrollpos8, + _scrollpos9, + _scrollpos10, + _scrollpos11, + _scrollpos12, + _scrollpos13, + _scrollpos14, + _scrollpos15, + _scrollpos16, + _scrollpos17, + _scrollpos18, + _scrollpos19, + _scrollpos20, + _scrollpos21, + _scrollpos22, + _scrollpos23, + _scrollpos24, + _scrollpos25, + _scrollpos26, + _scrollpos27, + _scrollpos28, + _scrollpos29, + _scrollpos30, + _scrollpos31, + _scrollpos32, + _scrollpos33, + _scrollpos34, + _scrollpos35, + _scrollpos36, + _scrollpos37, +}; + /** * * rct2: 0x006C42D9 @@ -170,7 +1432,7 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling utf8 scrollString[256]; scrolling_text_format(scrollString, scrollText); - sint16* scrollingModePositions = RCT2_ADDRESS(RCT2_ADDRESS_SCROLLING_MODE_POSITIONS, sint16*)[scrollingMode]; + const sint16* scrollingModePositions = _scrollPositions[scrollingMode]; memset(scrollText->bitmap, 0, 320 * 8); if (gUseTrueTypeFont) { @@ -184,7 +1446,7 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling return imageId; } -void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) +void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, const sint16 *scrollPositionOffsets) { uint8 characterColour = scrolling_text_get_colour(gCommonFormatArgs[7]); @@ -233,7 +1495,7 @@ void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, } } -void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets) +void scrolling_text_set_bitmap_for_ttf(utf8 *text, int scroll, uint8 *bitmap, const sint16 *scrollPositionOffsets) { TTFFontDescriptor *fontDesc = ttf_get_font_from_sprite_base(FONT_SPRITE_BASE_TINY); if (fontDesc->font == NULL) { diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 6400f91ecd..65c002f3a6 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -160,7 +160,7 @@ int gfx_load_g2() // Fix entry data offsets for (i = 0; i < g2.header.num_entries; i++) - g2.elements[i].offset += (int)g2.data; + g2.elements[i].offset += (uintptr_t)g2.data; // Successful return 1; @@ -563,7 +563,7 @@ void FASTCALL gfx_draw_sprite_palette_set_software(rct_drawpixelinfo *dpi, int i source_pointer = g1_source->offset; uint8* new_source_pointer_start = malloc(total_no_pixels); uint8* new_source_pointer = new_source_pointer_start;// 0x9E3D28; - int ebx, ecx; + intptr_t ebx, ecx; while (total_no_pixels>0){ sint8 no_pixels = *source_pointer; if (no_pixels >= 0){ @@ -582,8 +582,8 @@ void FASTCALL gfx_draw_sprite_palette_set_software(rct_drawpixelinfo *dpi, int i eax = (eax & 0xFF00) + *(source_pointer+1); total_no_pixels -= ecx; source_pointer += 2; - ebx = (uint32)new_source_pointer - eax; - eax = (uint32)source_pointer; + ebx = (uintptr_t)new_source_pointer - eax; + eax = (uintptr_t)source_pointer; source_pointer = (uint8*)ebx; ebx = eax; eax = 0; diff --git a/src/game.c b/src/game.c index 81afd664ea..c942d398cd 100644 --- a/src/game.c +++ b/src/game.c @@ -142,7 +142,7 @@ void update_palette_effects() // change palette to lighter colour during lightning int palette = 1532; - if ((sint32)water_type != -1) { + if ((intptr_t)water_type != -1) { palette = water_type->image_id; } rct_g1_element g1_element = g1Elements[palette]; @@ -161,7 +161,7 @@ void update_palette_effects() // change palette back to normal after lightning int palette = 1532; - if ((sint32)water_type != -1) { + if ((intptr_t)water_type != -1) { palette = water_type->image_id; } @@ -188,7 +188,7 @@ void update_palette_effects() uint32 j = gPaletteEffectFrame; j = (((uint16)((~j / 2) * 128) * 15) >> 16); int p = 1533; - if ((sint32)water_type != -1) { + if ((intptr_t)water_type != -1) { p = water_type->var_06; } rct_g1_element g1_element = g1Elements[q + p]; @@ -207,7 +207,7 @@ void update_palette_effects() } p = 1536; - if ((sint32)water_type != -1) { + if ((intptr_t)water_type != -1) { p = water_type->var_0A; } g1_element = g1Elements[q + p]; diff --git a/src/input.c b/src/input.c index a9c9df6451..a68afe5d7e 100644 --- a/src/input.c +++ b/src/input.c @@ -1062,7 +1062,7 @@ void process_mouse_over(int x, int y) int widgetId; int cursorId; - int ebx, esi, edi, ebp; + int ebx, edi; cursorId = CURSOR_ARROW; set_map_tooltip_format_arg(0, rct_string_id, STR_NONE); @@ -1087,13 +1087,11 @@ void process_mouse_over(int x, int y) gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number ); - ebp = (int)subWindow; if (subWindow == NULL) break; ebx = 0; edi = cursorId; - esi = (int)subWindow; // Window event WE_UNKNOWN_0E was called here, but no windows actually implemented a handler and // its not known what it was for cursorId = edi; diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 249e4ac758..ed8b54b427 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1244,7 +1244,8 @@ static bool sub_679074(rct_drawpixelinfo *dpi, int imageId, sint16 x, sint16 y) uint8 *source_pointer = image->offset; uint8 *new_source_pointer_start = malloc(total_no_pixels); uint8 *new_source_pointer = (*&new_source_pointer_start);// 0x9E3D28; - int ebx1, ecx; + intptr_t ebx1; + int ecx; while (total_no_pixels > 0) { sint8 no_pixels = *source_pointer; if (no_pixels >= 0) { @@ -1263,8 +1264,8 @@ static bool sub_679074(rct_drawpixelinfo *dpi, int imageId, sint16 x, sint16 y) eax = (eax & 0xFF00) + *(source_pointer + 1); total_no_pixels -= ecx; source_pointer += 2; - ebx1 = (uint32) new_source_pointer - eax; - eax = (uint32) source_pointer; + ebx1 = (uintptr_t) new_source_pointer - eax; + eax = (uintptr_t) source_pointer; source_pointer = (uint8 *) ebx1; ebx1 = eax; eax = 0; @@ -1273,7 +1274,7 @@ static bool sub_679074(rct_drawpixelinfo *dpi, int imageId, sint16 x, sint16 y) source_pointer = (uint8 *) ebx1; } - bool output = sub_679236_679662_679B0D_679FF1(ebx, image, new_source_pointer_start + (uint32) offset); + bool output = sub_679236_679662_679B0D_679FF1(ebx, image, new_source_pointer_start + (uintptr_t) offset); free(new_source_pointer_start); return output; diff --git a/src/interface/window.c b/src/interface/window.c index 2fc1a323f7..e5dfb0cb6f 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -2508,7 +2508,7 @@ void textinput_cancel() } } -void window_start_textbox(rct_window *call_w, int call_widget, rct_string_id existing_text, uint32 existing_args, int maxLength) +void window_start_textbox(rct_window *call_w, int call_widget, rct_string_id existing_text, char * existing_args, int maxLength) { if (gUsingWidgetTextBox) window_cancel_textbox(); diff --git a/src/interface/window.h b/src/interface/window.h index 1802060697..1372267d61 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -686,7 +686,7 @@ void window_themes_open(); void window_title_editor_open(int tab); void window_title_command_editor_open(int command, bool insert); void window_tile_inspector_open(); -void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uint32 existing_args, int maxLength); +void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uintptr_t existing_args, int maxLength); void window_text_input_raw_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, utf8string existing_text, int maxLength); rct_window *window_mapgen_open(); rct_window *window_loadsave_open(int type, char *defaultName); @@ -748,7 +748,7 @@ void textinput_cancel(); void window_move_and_snap(rct_window *w, int newWindowX, int newWindowY, int snapProximity); int window_can_resize(rct_window *w); -void window_start_textbox(rct_window *call_w, int call_widget, rct_string_id existing_text, uint32 existing_args, int maxLength); +void window_start_textbox(rct_window *call_w, int call_widget, rct_string_id existing_text, char *existing_args, int maxLength); void window_cancel_textbox(); void window_update_textbox_caret(); void window_update_textbox(); diff --git a/src/peep/peep.c b/src/peep/peep.c index c18494d462..8b824c1579 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -350,6 +350,168 @@ static const ride_rating NauseaMaximumThresholds[] = { 300, 600, 800, 1000 }; +// Has to use signed types +static const rct_xy16 _97e1bc_21[64] = { + { 56, 8 }, + { 8, 8 }, + { 8, 32 }, + { 32, 32 }, + { 8, 8 }, + { 8, 8 }, + { 8, 32 }, + { 32, 32 }, + { 8, 32 }, + { 8, 32 }, + { 8, 32 }, + { 32, 32 }, + { 8, 56 }, + { 8, 32 }, + { 8, 32 }, + { 32, 32 }, + { 56, 24 }, + { 32, 24 }, + { 32, 24 }, + { 32, 0 }, + { 56, -24 }, + { 56, 24 }, + { 32, 24 }, + { 32, 0 }, + { 8, 24 }, + { 32, 24 }, + { 32, 24 }, + { 32, 0 }, + { 32, 24 }, + { 32, 24 }, + { 32, 24 }, + { 32, 0 }, + { 24, 0 }, + { 24, 0 }, + { 24, 0 }, + { 0, 0 }, + { 24, -24 }, + { 24, 0 }, + { 24, 0 }, + { 0, 0 }, + { -24, -24 }, + { 24, -24 }, + { 24, 0 }, + { 0, 0 }, + { 24, 24 }, + { 24, 0 }, + { 24, 0 }, + { 0, 0 }, + { 24, 8 }, + { 0, 8 }, + { 0, 8 }, + { 0, 32 }, + { 0, 8 }, + { 0, 8 }, + { 0, 8 }, + { 0, 32 }, + { -24, 8 }, + { 0, 8 }, + { 0, 8 }, + { 0, 32 }, + { -24, 56 }, + { -24, 8 }, + { 0, 8 }, + { 0, 32 }, +}; + +static const rct_xy16 * _97e1bc[91] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + _97e1bc_21, // RIDE_TYPE_SPIRAL_SLIDE + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + int peep_get_staff_count() { uint16 spriteIndex; @@ -2163,10 +2325,10 @@ static void peep_update_ride_sub_state_1(rct_peep* peep){ x *= 32; y *= 32; - sint8* edx = peep->var_37 * 2 + RCT2_ADDRESS(0x97E1BC, sint8*)[ride->type]; + const rct_xy16 edx = _97e1bc[ride->type][peep->var_37]; - x += edx[0]; - y += edx[1]; + x += edx.x; + y += edx.y; peep->destination_x = x; peep->destination_y = y; @@ -3071,10 +3233,10 @@ static void peep_update_ride_sub_state_14(rct_peep* peep){ x *= 32; y *= 32; - sint8* edx = peep->var_37 * 2 + RCT2_ADDRESS(0x97E1BC, sint8*)[ride->type]; - x += edx[0]; - y += edx[1]; + const rct_xy16 edx = _97e1bc[ride->type][peep->var_37]; + x += edx.x; + y += edx.y; peep->destination_x = x; peep->destination_y = y; @@ -3089,10 +3251,10 @@ static void peep_update_ride_sub_state_14(rct_peep* peep){ x *= 32; y *= 32; - sint8* edx = peep->var_37 * 2 + RCT2_ADDRESS(0x97E1BC, sint8*)[ride->type]; - x += edx[0]; - y += edx[1]; + const rct_xy16 edx = _97e1bc[ride->type][peep->var_37]; + x += edx.x; + y += edx.y; peep->destination_x = x; peep->destination_y = y; @@ -3175,10 +3337,10 @@ static void peep_update_ride_sub_state_15(rct_peep* peep){ x *= 32; y *= 32; - sint8* edx = peep->var_37 * 2 + RCT2_ADDRESS(0x97E1BC, sint8*)[ride->type]; - x += edx[0]; - y += edx[1]; + const rct_xy16 edx = _97e1bc[ride->type][peep->var_37]; + x += edx.x; + y += edx.y; peep->destination_x = x; peep->destination_y = y; @@ -3213,10 +3375,10 @@ static void peep_update_ride_sub_state_16(rct_peep* peep){ x *= 32; y *= 32; - sint8* edx = peep->var_37 * 2 + RCT2_ADDRESS(0x97E1BC, sint8*)[ride->type]; - x += edx[0]; - y += edx[1]; + const rct_xy16 edx = _97e1bc[ride->type][peep->var_37]; + x += edx.x; + y += edx.y; peep->destination_x = x; peep->destination_y = y; diff --git a/src/ride/ride.h b/src/ride/ride.h index 8f069fc633..6269ce9b6b 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -883,6 +883,16 @@ enum { RIDE_SETTING_RIDE_TYPE, }; +typedef struct rct_ride_properties { + uint32 flags; + uint8 min_value; + uint8 max_value; + uint8 max_brakes_speed; + uint8 acceleration; +} rct_ride_properties; + +extern const rct_ride_properties RideProperties[91]; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index f9a86ff0c7..8cf2d94d5f 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -1729,3 +1729,508 @@ const rating_tuple RideRatings[91] = { { 50, 30, 30 }, // RIDE_TYPE_59 { 50, 30, 10 }, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER }; + +// rct2: 0x0097CF40 +const rct_ride_properties RideProperties[91] = { + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 17}, // RIDE_TYPE_SPIRAL_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 7, 27, 0, 0}, // RIDE_TYPE_STAND_UP_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 7, 27, 0, 0}, // RIDE_TYPE_INVERTED_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINIATURE_RAILWAY + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MONORAIL + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | + RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINI_SUSPENDED_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_6 | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_BOAT_RIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | + RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_WOODEN_WILD_MOUSE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_STEEPLECHASE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_CAR_RIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_20 | + RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 40, 0, 0}, // RIDE_TYPE_LAUNCHED_FREEFALL + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_BOBSLEIGH_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_OBSERVATION_TOWER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 26, 18}, // RIDE_TYPE_LOOPING_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_DINGHY_SLIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINE_TRAIN_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 1, 4, 0, 0}, // RIDE_TYPE_CHAIRLIFT + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 12, 30, 25}, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_IN_RIDE | RIDE_TYPE_FLAG_HAS_TRACK, + 1, 16, 0, 0}, // RIDE_TYPE_MAZE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_18 | + RIDE_TYPE_FLAG_FLAT_RIDE, + 1, 5, 0, 0}, // RIDE_TYPE_SPIRAL_SLIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_NO_TEST_MODE | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 1, 10, 0, 0}, // RIDE_TYPE_GO_KARTS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_LOG_FLUME + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | + RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_RIVER_RAPIDS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_26, + 20, 180, 0, 0}, // RIDE_TYPE_DODGEMS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | + RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_HAS_NO_TRACK | + RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 7, 25, 0, 0}, // RIDE_TYPE_PIRATE_SHIP + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | + RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 7, 15, 0, 0}, // RIDE_TYPE_SWINGING_INVERTER_SHIP + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_FOOD, + 0, 0, 0, 0}, // RIDE_TYPE_FOOD_STALL + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_FOOD, + 0, 0, 0, 0}, // RIDE_TYPE_1D + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_DRINKS, + 0, 0, 0, 0}, // RIDE_TYPE_DRINK_STALL + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_DRINKS, + 0, 0, 0, 0}, // RIDE_TYPE_1F + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_SHOP + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_26, + 4, 25, 0, 0}, // RIDE_TYPE_MERRY_GO_ROUND + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_22 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_INFORMATION_KIOSK + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY | RIDE_TYPE_FLAG_IN_RIDE | RIDE_TYPE_FLAG_IS_BATHROOM, + 4, 4, 0, 0}, // RIDE_TYPE_TOILETS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_26, + 1, 3, 0, 0}, // RIDE_TYPE_FERRIS_WHEEL + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_26, + 0, 0, 0, 0}, // RIDE_TYPE_MOTION_SIMULATOR + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_IN_RIDE | RIDE_TYPE_FLAG_26, + 0, 0, 0, 0}, // RIDE_TYPE_3D_CINEMA + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | + RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 0, 0, 0, 0}, // RIDE_TYPE_TOP_SPIN + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 0, 0, 0, 0}, // RIDE_TYPE_SPACE_RINGS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_G_FORCES | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 7, 30, 30, 40}, // RIDE_TYPE_REVERSE_FREEFALL_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | + RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_29 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_LIFT + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 26, 18}, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_CASH_MACHINE + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_26, + 3, 6, 0, 0}, // RIDE_TYPE_TWIST + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_IN_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_HAUNTED_HOUSE + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_PEEP_SHOULD_GO_INSIDE_FACILITY | RIDE_TYPE_FLAG_IN_RIDE, + 8, 8, 0, 0}, // RIDE_TYPE_FIRST_AID + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_IN_RIDE | RIDE_TYPE_FLAG_26, + 0, 0, 0, 0}, // RIDE_TYPE_CIRCUS_SHOW + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_G_FORCES | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_GHOST_TRAIN + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 17}, // RIDE_TYPE_TWISTER_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_WOODEN_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_WILD_MOUSE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_38 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_FLYING_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_3A + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_VIRGINIA_REEL + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_SPLASH_BOATS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINI_HELICOPTERS + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_SUSPENDED_MONORAIL + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_40 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_REVERSER_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINI_GOLF + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 17}, // RIDE_TYPE_GIGA_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_20 | + RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_ROTO_DROP + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | RIDE_TYPE_FLAG_3 | + RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_HAS_NO_TRACK | + RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 20, 180, 0, 0}, // RIDE_TYPE_FLYING_SAUCERS + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_IN_RIDE, + 0, 0, 0, 0}, // RIDE_TYPE_CROOKED_HOUSE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MONORAIL_CYCLES + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 7, 27, 0, 0}, // RIDE_TYPE_COMPACT_INVERTED_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_WATER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_G_FORCES | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 30, 50, 30, 40}, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | + RIDE_TYPE_FLAG_FLAT_RIDE | RIDE_TYPE_FLAG_26, + 7, 15, 0, 0}, // RIDE_TYPE_MAGIC_CARPET + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_6 | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | + RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_SUBMARINE_RIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_DATA_LOGGING | + RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_RIVER_RAFTS + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_FOOD, + 0, 0, 0, 0}, // RIDE_TYPE_50 + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_16 | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26, + 10, 20, 0, 0}, // RIDE_TYPE_ENTERPRISE + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_DRINKS, + 0, 0, 0, 0}, // RIDE_TYPE_52 + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_FOOD, + 0, 0, 0, 0}, // RIDE_TYPE_53 + {RIDE_TYPE_FLAG_3 | RIDE_TYPE_FLAG_CANNOT_HAVE_GAPS | RIDE_TYPE_FLAG_NO_TEST_MODE | RIDE_TYPE_FLAG_13 | + RIDE_TYPE_FLAG_HAS_NO_TRACK | RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_18 | RIDE_TYPE_FLAG_FLAT_RIDE | + RIDE_TYPE_FLAG_SELLS_DRINKS, + 0, 0, 0, 0}, // RIDE_TYPE_54 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 27, 30, 25}, // RIDE_TYPE_55 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 33, 30, 25}, // RIDE_TYPE_INVERTED_IMPULSE_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINI_ROLLER_COASTER + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_MINE_RIDE + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 0, 0, 0, 0}, // RIDE_TYPE_59 + {RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_MAIN | RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_ADDITIONAL | + RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | RIDE_TYPE_FLAG_HAS_G_FORCES | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | + RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_27 | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | + RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR, + 10, 31, 26, 18}, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER +}; diff --git a/src/ride/track.c b/src/ride/track.c index 8ddd3789bc..73f18b3993 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -622,7 +622,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in enabledTrackPieces |= rideEntry->enabledTrackPiecesB & gResearchedTrackTypesB[ride->type]; enabledTrackPieces <<= 32; enabledTrackPieces |= rideEntry->enabledTrackPiecesA & gResearchedTrackTypesA[ride->type]; - uint32 rideTypeFlags = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32); + uint32 rideTypeFlags = RideProperties[ride->type].flags; RCT2_GLOBAL(0x00F44068, uint32) = rideTypeFlags; if ((ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && type == 1) { diff --git a/src/ride/track_design.c b/src/ride/track_design.c index b8ef17a695..7b604be643 100644 --- a/src/ride/track_design.c +++ b/src/ride/track_design.c @@ -260,7 +260,7 @@ static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength td6->var_50 = min( td6->var_50, - RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 5 + (td6->type * 8), uint8) + RideProperties[td6->type].max_value ); // Set the element helper pointers diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index e218442651..17b98fd62f 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -702,7 +702,7 @@ void vehicle_sounds_update() vehicle_sound++; i++; if (i >= countof(gVehicleSoundList)) { - vehicle_sound_params = (rct_vehicle_sound_params*)((int)vehicle_sound_params + 10); + vehicle_sound_params = (rct_vehicle_sound_params*)((uintptr_t)vehicle_sound_params + 10); goto label28; } } @@ -2079,11 +2079,12 @@ typedef struct rct_synchronised_vehicle { assert_struct_size(rct_synchronised_vehicle, 4); #pragma pack(pop) -// 8 synchronised vehicle info -rct_synchronised_vehicle *_synchronisedVehicles = (rct_synchronised_vehicle*)0x00F64E4C; +#define SYNCHRONISED_VEHICLE_COUNT 8 -#define _lastSynchronisedVehicle RCT2_GLOBAL(0x00F64E48, rct_synchronised_vehicle*) -#define MaxSynchronisedVehicle ((rct_synchronised_vehicle*)0x00F64E6C) +// 8 synchronised vehicle info +rct_synchronised_vehicle _synchronisedVehicles[SYNCHRONISED_VEHICLE_COUNT] = { 0 }; + +static rct_synchronised_vehicle* _lastSynchronisedVehicle = NULL; /** * Checks if a map position contains a synchronised ride station and adds the vehicle @@ -2168,7 +2169,7 @@ static bool vehicle_can_depart_synchronised(rct_vehicle *vehicle) int direction = (mapElement->type + 1) & 3; _lastSynchronisedVehicle = _synchronisedVehicles; - while (_lastSynchronisedVehicle < MaxSynchronisedVehicle) { + while (_lastSynchronisedVehicle < &_synchronisedVehicles[SYNCHRONISED_VEHICLE_COUNT - 1]) { x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; if (!try_add_synchronised_station(x, y, z)) { @@ -2176,7 +2177,7 @@ static bool vehicle_can_depart_synchronised(rct_vehicle *vehicle) } } - while (_lastSynchronisedVehicle < MaxSynchronisedVehicle) { + while (_lastSynchronisedVehicle < &_synchronisedVehicles[SYNCHRONISED_VEHICLE_COUNT - 1]) { x += TileDirectionDelta[direction].x; y += TileDirectionDelta[direction].y; if (!try_add_synchronised_station(x, y, z)) { @@ -7201,7 +7202,7 @@ loc_6DAEB9: if ((trackType == TRACK_ELEM_FLAT && ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER) || (trackType == TRACK_ELEM_POWERED_LIFT) ) { - vehicle->acceleration = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8) + 7, uint8) << 16; + vehicle->acceleration = RideProperties[ride->type].acceleration << 16; } if (trackType == TRACK_ELEM_BRAKE_FOR_DROP) { if (!vehicle->is_child) { diff --git a/src/scenario.c b/src/scenario.c index 450868f1c9..c45a44bdd9 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -218,7 +218,7 @@ void scenario_begin() } } else { rct_stex_entry* stex = g_stexEntries[0]; - if ((int)stex != -1) { + if ((intptr_t)stex != -1) { char *buffer = (char*)RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER; // Set localised park name @@ -453,7 +453,7 @@ static void scenario_week_update() rct_water_type* water_type = (rct_water_type*)object_entry_groups[OBJECT_TYPE_WATER].chunks[0]; - if (month <= MONTH_APRIL && (sint32)water_type != -1 && water_type->var_0E & 1) { + if (month <= MONTH_APRIL && (intptr_t)water_type != -1 && water_type->var_0E & 1) { // 100 attempts at finding some water to create a few ducks at for (int i = 0; i < 100; i++) { if (scenario_create_ducks()) @@ -666,7 +666,7 @@ int scenario_prepare_for_save() s6Info->entry.flags = 255; rct_stex_entry* stex = g_stexEntries[0]; - if ((int)stex != 0xFFFFFFFF) { + if ((intptr_t)stex != -1) { format_string(buffer, stex->scenario_name, NULL); safe_strcpy(s6Info->name, buffer, sizeof(s6Info->name)); diff --git a/src/windows/editor_inventions_list.c b/src/windows/editor_inventions_list.c index 542cc9cfa5..66119e0de9 100644 --- a/src/windows/editor_inventions_list.c +++ b/src/windows/editor_inventions_list.c @@ -211,7 +211,7 @@ static void research_rides_setup(){ for (uint8 rideType = 0; rideType < object_entry_group_counts[OBJECT_TYPE_RIDE]; rideType++){ rct_ride_entry* master_ride = get_ride_entry(rideType); - if (master_ride == NULL || (uint32)master_ride == 0xFFFFFFFF) + if (master_ride == NULL || (intptr_t)master_ride == -1) continue; if (master_ride->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index ef6a0833a2..6fa508b452 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -846,7 +846,7 @@ static void window_editor_object_selection_mouseup(rct_window *w, int widgetInde break; case WIDX_FILTER_STRING_BUTTON: //window_text_input_open(w, widgetIndex, STR_OBJECT_SEARCH, STR_OBJECT_SEARCH_DESC, STR_STRING, (uint32)_filter_string, 40); - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)_filter_string, 40); + window_start_textbox(w, widgetIndex, STR_STRING, _filter_string, 40); break; case WIDX_FILTER_CLEAR_BUTTON: memset(_filter_string, 0, sizeof(_filter_string)); @@ -1694,7 +1694,7 @@ static void window_editor_object_selection_manage_tracks() gS6Info->editor_step = EDITOR_STEP_TRACK_DESIGNS_MANAGER; int entry_index = 0; - for (; ((int)object_entry_groups[0].chunks[entry_index]) == -1; ++entry_index); + for (; ((intptr_t)object_entry_groups[0].chunks[entry_index]) == -1; ++entry_index); rct_ride_entry* ride_entry = get_ride_entry(entry_index); uint8* ride_type_array = &ride_entry->ride_type[0]; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index bff202fb51..f6ebb3d2f6 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -289,7 +289,7 @@ static void window_loadsave_mouseup(rct_window *w, int widgetIndex) w->no_list_items = _listItemsCount; break; case WIDX_NEW: - window_text_input_open(w, WIDX_NEW, STR_NONE, STR_FILEBROWSER_NAME_PROMPT, STR_STRING, (uint32)&_defaultName, 64); + window_text_input_open(w, WIDX_NEW, STR_NONE, STR_FILEBROWSER_NAME_PROMPT, STR_STRING, (uintptr_t)&_defaultName, 64); break; case WIDX_BROWSE: if (browse(isSave, path)) @@ -477,12 +477,10 @@ static void window_loadsave_paint(rct_window *w, rct_drawpixelinfo *dpi) static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int i, y; - rct_string_id stringId, templateStringId = STR_PLACEHOLDER; - char *templateString; + rct_string_id stringId; gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); - templateString = (char*)language_get_string(templateStringId); for (i = 0; i < w->no_list_items; i++) { y = i * 10; if (y > dpi->y + dpi->height) @@ -497,8 +495,9 @@ static void window_loadsave_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, i gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x2000031); } - strcpy(templateString, _listItems[i].name); - gfx_draw_string_left(dpi, stringId, &templateStringId, 0, 0, y - 1); + set_format_arg(0, rct_string_id, STR_STRING); + set_format_arg(2, char*, _listItems[i].name); + gfx_draw_string_left(dpi, stringId, gCommonFormatArgs, 0, 0, y - 1); } } @@ -682,8 +681,8 @@ static void window_loadsave_select(rct_window *w, const char *path) if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newName, ".sv6"); if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { - set_format_arg(0, uint32, (uint32)&_listItems[w->selected_list_item].name); - window_text_input_open(w, WIDX_SCROLL, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uint32)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); + set_format_arg(0, uint32, (intptr_t)&_listItems[w->selected_list_item].name); + window_text_input_open(w, WIDX_SCROLL, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uintptr_t)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); } else { title_sequence_add_save(gCurrentTitleSequence, path, newName); diff --git a/src/windows/ride.c b/src/windows/ride.c index d0346e78ba..f6e40f242c 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3136,8 +3136,8 @@ static void window_ride_mode_tweak_increase(rct_window *w) { rct_ride *ride = get_ride(w->number); - uint8 maxValue = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8) + 5, uint8); - uint8 minValue = gCheatsFastLiftHill ? 0 : RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8) + 4, uint8); + uint8 maxValue = RideProperties[ride->type].max_value; + uint8 minValue = gCheatsFastLiftHill ? 0 : RideProperties[ride->type].min_value; if (ride->mode == RIDE_MODE_MAZE) { // Allow 64 people in mazes under non-cheat settings. The old maximum of 16 was too little for even moderately big mazes. maxValue = 64; @@ -3159,8 +3159,8 @@ static void window_ride_mode_tweak_decrease(rct_window *w) { rct_ride *ride = get_ride(w->number); - uint8 maxValue = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8) + 5, uint8); - uint8 minValue = gCheatsFastLiftHill ? 0 : RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8) + 4, uint8); + uint8 maxValue = RideProperties[ride->type].max_value; + uint8 minValue = gCheatsFastLiftHill ? 0 : RideProperties[ride->type].min_value; if (ride->mode == RIDE_MODE_MAZE) { // Allow 64 people in mazes under non-cheat settings. The old maximum of 16 was too little for even moderately big mazes. maxValue = 64; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 279361f211..1bb962555b 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1511,7 +1511,7 @@ static void window_ride_construction_mousedown(int widgetIndex, rct_window *w, r uint8 maxBrakesSpeed = 30; if (RCT2_GLOBAL(0x00F440D3, uint8) != 1) { brakesSpeedPtr = (uint8*)0x00F440CE; - maxBrakesSpeed = RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + 6 + (ride->type * 8), uint8); + maxBrakesSpeed = RideProperties[ride->type].max_brakes_speed; } uint8 brakesSpeed = *brakesSpeedPtr + 2; if (brakesSpeed <= maxBrakesSpeed) { diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 69dc1c8c09..fb16c361ac 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -210,7 +210,7 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_PLAYER_NAME_INPUT: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)_playerName, 63); + window_start_textbox(w, widgetIndex, STR_STRING, _playerName, 63); break; case WIDX_LIST:{ int serverIndex = w->selected_list_item; diff --git a/src/windows/server_start.c b/src/windows/server_start.c index 4b0f230d11..a72a453d9f 100644 --- a/src/windows/server_start.c +++ b/src/windows/server_start.c @@ -173,13 +173,13 @@ static void window_server_start_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_PORT_INPUT: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)_port, 6); + window_start_textbox(w, widgetIndex, STR_STRING, _port, 6); break; case WIDX_NAME_INPUT: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)_name, 64); + window_start_textbox(w, widgetIndex, STR_STRING, _name, 64); break; case WIDX_PASSWORD_INPUT: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)_password, 32); + window_start_textbox(w, widgetIndex, STR_STRING, _password, 32); break; case WIDX_MAXPLAYERS_INCREASE: if (gConfigNetwork.maxplayers < 255) { diff --git a/src/windows/text_input.c b/src/windows/text_input.c index 2ba90d2882..8c0c7d1897 100644 --- a/src/windows/text_input.c +++ b/src/windows/text_input.c @@ -96,7 +96,7 @@ rct_windownumber calling_number = 0; int calling_widget = 0; int _maxInputLength; -void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uint32 existing_args, int maxLength) +void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uintptr_t existing_args, int maxLength) { _maxInputLength = maxLength; diff --git a/src/windows/title_command_editor.c b/src/windows/title_command_editor.c index 1044279f19..bb93b9b15f 100644 --- a/src/windows/title_command_editor.c +++ b/src/windows/title_command_editor.c @@ -258,13 +258,13 @@ static void window_title_command_editor_mouseup(rct_window *w, int widgetIndex) window_close(w); break; case WIDX_TEXTBOX_FULL: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)textbox1Buffer, 4); + window_start_textbox(w, widgetIndex, STR_STRING, textbox1Buffer, 4); break; case WIDX_TEXTBOX_X: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)textbox1Buffer, 4); + window_start_textbox(w, widgetIndex, STR_STRING, textbox1Buffer, 4); break; case WIDX_TEXTBOX_Y: - window_start_textbox(w, widgetIndex, STR_STRING, (uint32)textbox2Buffer, 4); + window_start_textbox(w, widgetIndex, STR_STRING, textbox2Buffer, 4); break; case WIDX_GET: if (command.command == TITLE_SCRIPT_LOCATION) {