diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000000..078f79c085 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,18 @@ +Please keep this file sorted by date for easier checking. + +2015-05-21: Allow both types of powered launch (with and without passing the station) for every roller coaster that supported one type in RCT2. +2015-05-21: Allow switching between the RCT2 and RCT1 colour schemes via the in-game options. Added the necessary invalidation methods, as well as a way to invalidate all windows. +2015-05-20: Allow localisation of decimal and thousands separators. +2015-05-19: Allow a maximum of 20 circuits per roller coaster and 64 people on mazes (up from the old limits of 7 and 16, respectively). +2015-05-19: Add a button for game speed. +2015-05-19: Add in-game console. +2015-05-19: Change title logo. +2015-05-19: Add an option to show a Open Cheat Window button. +2015-05-17: Add a cheat to disable all breakdowns. +2015-05-17: Extended 410 km/h lift hill cheat to allow maxing out many other settings on the operating tab as well, like launch speeds. +2015-05-17: Add a cheat to disable brakes failure. +2015-05-17: Also apply the RCT1 colour scheme to the new campaign and scenario selection windows. +2015-05-16: Add a cheat to allow maxing out lift hill speeds (410 km/h). +2015-05-15: Add a new tool for buying land and construction rights. Only in-park. +2015-05-15: Add a cheat to fix all rides. +2015-05-12: Add a config-file only option for a RCT1 colour scheme. diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index e93f6c0e20..e6243d7e33 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3488,4 +3488,6 @@ STR_5151 :, STR_5152 :. STR_5153 :RCT1 colour scheme STR_5154 :Hardware display -STR_5155 :Unlock all prices +STR_5155 :Allow testing of unfinished tracks +STR_5156 :{SMALLFONT}{BLACK}Allows testing of most ride types even when the track is unfinished, does not apply to block sectioned modes +STR_5157 :Unlock all prices diff --git a/distribution/changelog.txt b/distribution/changelog.txt index a07ee2b4d2..f8557af5ca 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,5 +1,18 @@ -0.2.0-beta (2015-02-06) +0.0.2-beta (2015-05-22) ------------------------------------------------------------------------ +- Feature: Allow both types of powered launch (with and without passing the station) for every roller coaster that supported one type in RCT2. +- Feature: Localisation of decimal and thousands separators. +- Feature: Increase limits for maximum of circuits per roller coaster (20) and people on mazes (64) (up from the old limits of 7 and 16, respectively). +- Feature: Game speed button on toolbar. +- Feature: In-game console. +- Feature: New title screen logo. +- Feature: Cheat to disable all breakdowns. +- Feature: Cheat to disable brakes failure. +- Feature: Cheat to allow maximum operating settings and lift hill speeds (410 km/h). +- Feature: Buy land and construction rights land tool window. (Currently only in-game). +- Feature: Cheat to fix all rides. +- Feature: Toggle RCT1 / RCT2 colour scheme. +- Feature: Toggle between software and hardware video mode. - Feature: Toggle between window and fullscreen. - Feature: Resizable window mode. - Feature: Mountain tool available in play mode. @@ -9,7 +22,7 @@ - Feature: Extra viewport windows. - Feature: Windows now snap to the borders of other windows when dragging (snap radius configurable). - Feature: Text input is now an in game window. -- Feature: Cheats window (CTRL-ALT-C). +- Feature: Cheats window (CTRL-ALT-C) or by toolbar button (configurable). - Feature: Improved settings window with tab interface. - Feature: Ability to change language while in game. - Feature: Game configuration, cache, scores and screenshots now saved in user documents directory under OpenRCT2. diff --git a/src/config.c b/src/config.c index 7d722a2979..7a6727e7c1 100644 --- a/src/config.c +++ b/src/config.c @@ -162,6 +162,8 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, window_snap_proximity), "window_snap_proximity", CONFIG_VALUE_TYPE_UINT8, 5, NULL }, { offsetof(general_configuration, window_width), "window_width", CONFIG_VALUE_TYPE_SINT32, -1, NULL }, { offsetof(general_configuration, hardware_display), "hardware_display", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, test_unfinished_tracks), "test_unfinished_tracks", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, no_test_crashes), "no_test_crashes", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index e1f8b9b893..29b3d5bf4a 100644 --- a/src/config.h +++ b/src/config.h @@ -131,6 +131,8 @@ typedef struct { uint8 window_snap_proximity; uint8 autosave_frequency; uint8 hardware_display; + uint8 test_unfinished_tracks; + uint8 no_test_crashes; } general_configuration; typedef struct { diff --git a/src/interface/console.c b/src/interface/console.c index 3ae8a6fd7a..023857e7d4 100644 --- a/src/interface/console.c +++ b/src/interface/console.c @@ -489,6 +489,12 @@ static int cc_get(const char **argv, int argc) else if (strcmp(argv[0], "console_small_font") == 0) { console_printf("console_small_font %d", gConfigInterface.console_small_font); } + else if (strcmp(argv[0], "test_unfinished_tracks") == 0) { + console_printf("test_unfinished_tracks %d", gConfigGeneral.test_unfinished_tracks); + } + else if (strcmp(argv[0], "no_test_crashes") == 0) { + console_printf("no_test_crashes %d", gConfigGeneral.no_test_crashes); + } else { console_writeline_warning("Invalid variable."); } @@ -607,6 +613,16 @@ static int cc_set(const char **argv, int argc) config_save_default(); console_execute_silent("get console_small_font"); } + else if (strcmp(argv[0], "test_unfinished_tracks") == 0 && int_valid) { + gConfigGeneral.test_unfinished_tracks = (int_val != 0); + config_save_default(); + console_execute_silent("get test_unfinished_tracks"); + } + else if (strcmp(argv[0], "no_test_crashes") == 0 && int_valid) { + gConfigGeneral.no_test_crashes = (int_val != 0); + config_save_default(); + console_execute_silent("get no_test_crashes"); + } else { console_writeline_error("Invalid variable or value."); } @@ -648,7 +664,9 @@ char* console_variable_table[] = { "park_open", "climate", "game_speed", - "console_small_font" + "console_small_font", + "test_unfinished_tracks", + "no_test_crashes" }; console_command console_command_table[] = { diff --git a/src/platform/shared.c b/src/platform/shared.c index 407042dc45..574dfa531e 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -52,9 +52,13 @@ SDL_Color gPalette[256]; static SDL_Surface *_surface; static SDL_Palette *_palette; -static int _screenBufferSize; + static void *_screenBuffer; +static int _screenBufferSize; +static int _screenBufferWidth; +static int _screenBufferHeight; static int _screenBufferPitch; + static SDL_Cursor* _cursors[CURSOR_COUNT]; static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; static unsigned int _lastGestureTimestamp; @@ -64,6 +68,8 @@ static void platform_create_window(); static void platform_load_cursors(); static void platform_unload_cursors(); +static void platform_refresh_screenbuffer(int width, int height, int pitch); + int resolution_sort_func(const void *pa, const void *pb) { const resolution *a = (resolution*)pa; @@ -228,9 +234,6 @@ void platform_draw() static void platform_resize(int width, int height) { - rct_drawpixelinfo *screenDPI; - int newScreenBufferSize; - void *newScreenBuffer; uint32 flags; RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width; @@ -238,36 +241,6 @@ static void platform_resize(int width, int height) platform_refresh_video(); - newScreenBufferSize = _screenBufferPitch * height; - newScreenBuffer = malloc(newScreenBufferSize); - if (_screenBuffer == NULL) { - memset(newScreenBuffer, 0, newScreenBufferSize); - } else { - memcpy(newScreenBuffer, _screenBuffer, min(_screenBufferSize, newScreenBufferSize)); - if (newScreenBufferSize - _screenBufferSize > 0) - memset((uint8*)newScreenBuffer + _screenBufferSize, 0, newScreenBufferSize - _screenBufferSize); - free(_screenBuffer); - } - - _screenBuffer = newScreenBuffer; - _screenBufferSize = newScreenBufferSize; - - screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); - screenDPI->bits = _screenBuffer; - screenDPI->x = 0; - screenDPI->y = 0; - screenDPI->width = width; - screenDPI->height = height; - screenDPI->pitch = _screenBufferPitch - width; - - RCT2_GLOBAL(0x009ABDF0, uint8) = 6; - RCT2_GLOBAL(0x009ABDF1, uint8) = 3; - RCT2_GLOBAL(0x009ABDF2, uint8) = 1; - RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16) = 64; - RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16) = 8; - RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) = (width >> 6) + 1; - RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32) = (height >> 3) + 1; - flags = SDL_GetWindowFlags(gWindow); if ((flags & SDL_WINDOW_MINIMIZED) == 0) { @@ -752,7 +725,7 @@ void platform_refresh_video() SDL_DestroyTexture(gBufferTexture); gBufferTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBX8888, SDL_TEXTUREACCESS_STREAMING, width, height); - _screenBufferPitch = width; + platform_refresh_screenbuffer(width, height, width); } else { if (_surface != NULL) SDL_FreeSurface(_surface); @@ -772,6 +745,59 @@ void platform_refresh_video() exit(-1); } - _screenBufferPitch = _surface->pitch; + platform_refresh_screenbuffer(width, height, _surface->pitch); } +} + +static void platform_refresh_screenbuffer(int width, int height, int pitch) +{ + int newScreenBufferSize = pitch * height; + char *newScreenBuffer = (char*)malloc(newScreenBufferSize); + if (_screenBuffer == NULL) { + memset(newScreenBuffer, 0, newScreenBufferSize); + } else { + if (_screenBufferPitch == pitch) { + memcpy(newScreenBuffer, _screenBuffer, min(_screenBufferSize, newScreenBufferSize)); + } else { + char *src = _screenBuffer; + char *dst = newScreenBuffer; + + int minWidth = min(_screenBufferWidth, width); + int minHeight = min(_screenBufferHeight, height); + for (int y = 0; y < minHeight; y++) { + memcpy(dst, src, minWidth); + if (pitch - minWidth > 0) + memset(dst + minWidth, 0, pitch - minWidth); + + src += _screenBufferPitch; + dst += pitch; + } + } + if (newScreenBufferSize - _screenBufferSize > 0) + memset((uint8*)newScreenBuffer + _screenBufferSize, 0, newScreenBufferSize - _screenBufferSize); + free(_screenBuffer); + } + + _screenBuffer = newScreenBuffer; + _screenBufferSize = newScreenBufferSize; + _screenBufferWidth = width; + _screenBufferHeight = height; + _screenBufferPitch = pitch; + + rct_drawpixelinfo *screenDPI; + screenDPI = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo); + screenDPI->bits = _screenBuffer; + screenDPI->x = 0; + screenDPI->y = 0; + screenDPI->width = width; + screenDPI->height = height; + screenDPI->pitch = _screenBufferPitch - width; + + RCT2_GLOBAL(0x009ABDF0, uint8) = 6; + RCT2_GLOBAL(0x009ABDF1, uint8) = 3; + RCT2_GLOBAL(0x009ABDF2, uint8) = 1; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_WIDTH, sint16) = 64; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_HEIGHT, sint16) = 8; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_COLUMNS, sint32) = (width >> 6) + 1; + RCT2_GLOBAL(RCT2_ADDRESS_DIRTY_BLOCK_ROWS, sint32) = (height >> 3) + 1; } \ No newline at end of file diff --git a/src/ride/ride.c b/src/ride/ride.c index 68dca21526..0adbe3e50f 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -1325,6 +1325,30 @@ static void ride_update(int rideIndex) ride_breakdown_status_update(rideIndex); ride_inspection_update(ride); + + // Used to bring up the "real" ride window after a crash. Can be removed once vehicle_update is decompiled + if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) { + if ((ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED_WINDOW_OPENED) == 0) { + ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED_WINDOW_OPENED; + window_ride_main_open(rideIndex); + } + } + else if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED_WINDOW_OPENED) { + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CRASHED_WINDOW_OPENED; + } + + if (ride->status == RIDE_STATUS_TESTING && gConfigGeneral.no_test_crashes) { + for (int i = 0; i < ride->num_vehicles; i++) { + rct_vehicle *vehicle = &(g_sprite_list[ride->vehicles[i]].vehicle); + + if (vehicle->status == VEHICLE_STATUS_CRASHED || vehicle->status == VEHICLE_STATUS_CRASHING) { + ride_set_status(rideIndex, RIDE_STATUS_CLOSED); + ride_set_status(rideIndex, RIDE_STATUS_CLOSED); + ride_set_status(rideIndex, RIDE_STATUS_TESTING); + break; + } + } + } } /** @@ -3599,6 +3623,131 @@ rct_map_element *loc_6B4F6B(int rideIndex, int x, int y) return NULL; } +int ride_is_valid_for_test(int rideIndex, int goingToBeOpen, int isApplying) +{ + int stationIndex; + rct_ride *ride; + rct_xy_element trackElement, problematicTrackElement; + + ride = GET_RIDE(rideIndex); + + window_close_by_class(WC_RIDE_CONSTRUCTION); + + stationIndex = ride_mode_check_station_present(ride); + if (stationIndex == -1)return 0; + + if (!ride_mode_check_valid_station_numbers(ride)) + return 0; + + if (!ride_check_for_entrance_exit(rideIndex)) { + loc_6B51C0(rideIndex); + return 0; + } + + if (goingToBeOpen && isApplying) { + sub_6B5952(rideIndex); + ride->lifecycle_flags |= RIDE_LIFECYCLE_EVER_BEEN_OPENED; + } + + // z = ride->station_heights[i] * 8; + trackElement.x = (ride->station_starts[stationIndex] & 0xFF) * 32; + trackElement.y = (ride->station_starts[stationIndex] >> 8) * 32; + trackElement.element = loc_6B4F6B(rideIndex, trackElement.x, trackElement.y); + if (trackElement.element == NULL) { + // Maze is strange, station start is 0... investigation required + if (ride->type != RIDE_TYPE_MAZE) + return 0; + } + + if ( + ride->type == RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER || + ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT || + ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || + ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED + ) { + if (ride_find_track_gap(&trackElement, &problematicTrackElement) && (!gConfigGeneral.test_unfinished_tracks || + ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_IS_NOT_A_COMPLETE_CIRCUIT; + loc_6B528A(&problematicTrackElement); + return 0; + } + } + + if ( + ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || + ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED + ) { + if (!ride_check_block_brakes(&trackElement, &problematicTrackElement)) { + loc_6B528A(&problematicTrackElement); + return 0; + } + } + + if (ride->subtype != 255) { + rct_ride_type *rideType = GET_RIDE_ENTRY(ride->subtype); + if (rideType->var_008 & 2) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; + if (ride_check_track_suitability_a(&trackElement, &problematicTrackElement)) { + loc_6B528A(&problematicTrackElement); + return 0; + } + } + if (rideType->var_008 & 4) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_TRACK_UNSUITABLE_FOR_TYPE_OF_TRAIN; + if (ride_check_track_suitability_b(&trackElement, &problematicTrackElement)) { + loc_6B528A(&problematicTrackElement); + return 0; + } + } + } + + if (ride->mode == RIDE_MODE_STATION_TO_STATION) { + if (!ride_find_track_gap(&trackElement, &problematicTrackElement)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_RIDE_MUST_START_AND_END_WITH_STATIONS; + return 0; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_STATION_NOT_LONG_ENOUGH; + if (ride_check_station_length(&trackElement, &problematicTrackElement)) { + + // This is to prevent a bug in the check_station_length function + // remove when check_station_length is reveresed and fixed. Prevents + // null dereference. Does not prevent moving screen to top left corner. + if (map_element_get_type(problematicTrackElement.element) != MAP_ELEMENT_TYPE_TRACK) + loc_6B528A(&trackElement); + else loc_6B528A(&problematicTrackElement); + return 0; + } + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_RIDE_MUST_START_AND_END_WITH_STATIONS; + if (ride_check_start_and_end_is_station(&trackElement, &problematicTrackElement)) { + loc_6B528A(&problematicTrackElement); + return 0; + } + } + + if (isApplying) + sub_6B4D26(rideIndex, &trackElement); + + if ( + !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_13) && + !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK) + ) { + if (sub_6DD84C(ride, rideIndex, &trackElement, isApplying)) + return 0; + } + + if ( + (RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint32) & 0x400) && + (ride->lifecycle_flags & RIDE_LIFECYCLE_16) && + !(ride->lifecycle_flags & RIDE_LIFECYCLE_CABLE_LIFT) + ) { + if (sub_6DF4D4(ride, &trackElement, isApplying)) + return 0; + } + + return 1; +} /** * * rct2: 0x006B4EEA @@ -3777,7 +3926,13 @@ void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *e return; } - if (!ride_is_valid_for_open(rideIndex, targetStatus == RIDE_STATUS_OPEN, *ebx & GAME_COMMAND_FLAG_APPLY)) { + if (targetStatus == RIDE_STATUS_TESTING) { + if (!ride_is_valid_for_test(rideIndex, targetStatus == RIDE_STATUS_OPEN, *ebx & GAME_COMMAND_FLAG_APPLY)) { + *ebx = MONEY32_UNDEFINED; + return; + } + } + else if (!ride_is_valid_for_open(rideIndex, targetStatus == RIDE_STATUS_OPEN, *ebx & GAME_COMMAND_FLAG_APPLY)) { *ebx = MONEY32_UNDEFINED; return; } diff --git a/src/ride/ride.h b/src/ride/ride.h index 765de365dd..25db0cf30e 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -362,7 +362,10 @@ enum { RIDE_LIFECYCLE_16 = 1 << 16, RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17, RIDE_LIFECYCLE_18 = 1 << 18, - RIDE_LIFECYCLE_SIX_FLAGS = 1 << 19 + RIDE_LIFECYCLE_SIX_FLAGS = 1 << 19, + + // Used to bring up the "real" ride window after a crash. Can be removed once vehicle_update is decompiled + RIDE_LIFECYCLE_CRASHED_WINDOW_OPENED = 1 << 20 }; enum { diff --git a/src/windows/options.c b/src/windows/options.c index 9bf276aae8..dcb971320d 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -101,11 +101,12 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_AUTOSAVE_DROPDOWN, WIDX_ALLOW_SUBTYPE_SWITCHING, WIDX_DEBUGGING_TOOLS, + WIDX_TEST_UNFINISHED_TRACKS, WINDOW_OPTIONS_WIDGETS_SIZE // Marks the end of the widget list, leave as last item }; #define WW 310 -#define WH 153 +#define WH 183 static rct_widget window_options_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, @@ -164,6 +165,7 @@ static rct_widget window_options_widgets[] = { { WWT_DROPDOWN_BUTTON, 0, 288, 298, 84, 93, 876, STR_NONE }, { WWT_CHECKBOX, 2, 10, 299, 98, 109, 5122, STR_NONE }, // allow subtype { WWT_CHECKBOX, 2, 10, 299, 113, 124, 5150, STR_NONE }, // enabled debugging tools + { WWT_CHECKBOX, 2, 10, 299, 128, 139, 5155, 5156 }, // test unfinished tracks { WIDGETS_END }, }; @@ -274,6 +276,7 @@ void window_options_open() (1ULL << WIDX_AUTOSAVE_DROPDOWN) | (1ULL << WIDX_ALLOW_SUBTYPE_SWITCHING) | (1ULL << WIDX_DEBUGGING_TOOLS) | + (1ULL << WIDX_TEST_UNFINISHED_TRACKS) | (1ULL << WIDX_RCT1_COLOUR_SCHEME); w->page = WINDOW_OPTIONS_PAGE_DISPLAY; @@ -347,6 +350,11 @@ static void window_options_mouseup() config_save_default(); window_invalidate(w); break; + case WIDX_TEST_UNFINISHED_TRACKS: + gConfigGeneral.test_unfinished_tracks ^= 1; + config_save_default(); + window_invalidate(w); + break; case WIDX_REAL_NAME_CHECKBOX: RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; RCT2_CALLPROC_X(0x0069C52F, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES ? 0 : 1, 0, 0, 0, 0, 0, 0); @@ -827,6 +835,7 @@ static void window_options_invalidate() window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; widget_set_checkbox_value(w, WIDX_DEBUGGING_TOOLS, gConfigGeneral.debugging_tools); + widget_set_checkbox_value(w, WIDX_TEST_UNFINISHED_TRACKS, gConfigGeneral.test_unfinished_tracks); window_options_widgets[WIDX_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX; window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; @@ -834,6 +843,7 @@ static void window_options_invalidate() window_options_widgets[WIDX_AUTOSAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_widgets[WIDX_ALLOW_SUBTYPE_SWITCHING].type = WWT_CHECKBOX; window_options_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX; + window_options_widgets[WIDX_TEST_UNFINISHED_TRACKS].type = WWT_CHECKBOX; break; } }