Merge pull request #1134 from trigger-death/testing_improvements

Testing Improvements
This commit is contained in:
Ted John 2015-05-22 22:51:58 +01:00
commit 6f3e389c2f
7 changed files with 196 additions and 4 deletions

View File

@ -3488,3 +3488,5 @@ STR_5151 :,
STR_5152 :.
STR_5153 :RCT1 colour scheme
STR_5154 :Hardware display
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

View File

@ -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[] = {

View File

@ -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 {

View File

@ -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[] = {

View File

@ -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;
}

View File

@ -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 {

View File

@ -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;
}
}