mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Resolve merge conflict
This commit is contained in:
18
changelog.txt
Normal file
18
changelog.txt
Normal file
@@ -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.
|
||||||
@@ -3488,4 +3488,6 @@ STR_5151 :,
|
|||||||
STR_5152 :.
|
STR_5152 :.
|
||||||
STR_5153 :RCT1 colour scheme
|
STR_5153 :RCT1 colour scheme
|
||||||
STR_5154 :Hardware display
|
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
|
||||||
|
|||||||
@@ -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: Toggle between window and fullscreen.
|
||||||
- Feature: Resizable window mode.
|
- Feature: Resizable window mode.
|
||||||
- Feature: Mountain tool available in play mode.
|
- Feature: Mountain tool available in play mode.
|
||||||
@@ -9,7 +22,7 @@
|
|||||||
- Feature: Extra viewport windows.
|
- Feature: Extra viewport windows.
|
||||||
- Feature: Windows now snap to the borders of other windows when dragging (snap radius configurable).
|
- 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: 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: Improved settings window with tab interface.
|
||||||
- Feature: Ability to change language while in game.
|
- Feature: Ability to change language while in game.
|
||||||
- Feature: Game configuration, cache, scores and screenshots now saved in user documents directory under OpenRCT2.
|
- Feature: Game configuration, cache, scores and screenshots now saved in user documents directory under OpenRCT2.
|
||||||
|
|||||||
@@ -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_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, 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, 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[] = {
|
config_property_definition _interfaceDefinitions[] = {
|
||||||
|
|||||||
@@ -131,6 +131,8 @@ typedef struct {
|
|||||||
uint8 window_snap_proximity;
|
uint8 window_snap_proximity;
|
||||||
uint8 autosave_frequency;
|
uint8 autosave_frequency;
|
||||||
uint8 hardware_display;
|
uint8 hardware_display;
|
||||||
|
uint8 test_unfinished_tracks;
|
||||||
|
uint8 no_test_crashes;
|
||||||
} general_configuration;
|
} general_configuration;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -489,6 +489,12 @@ static int cc_get(const char **argv, int argc)
|
|||||||
else if (strcmp(argv[0], "console_small_font") == 0) {
|
else if (strcmp(argv[0], "console_small_font") == 0) {
|
||||||
console_printf("console_small_font %d", gConfigInterface.console_small_font);
|
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 {
|
else {
|
||||||
console_writeline_warning("Invalid variable.");
|
console_writeline_warning("Invalid variable.");
|
||||||
}
|
}
|
||||||
@@ -607,6 +613,16 @@ static int cc_set(const char **argv, int argc)
|
|||||||
config_save_default();
|
config_save_default();
|
||||||
console_execute_silent("get console_small_font");
|
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 {
|
else {
|
||||||
console_writeline_error("Invalid variable or value.");
|
console_writeline_error("Invalid variable or value.");
|
||||||
}
|
}
|
||||||
@@ -648,7 +664,9 @@ char* console_variable_table[] = {
|
|||||||
"park_open",
|
"park_open",
|
||||||
"climate",
|
"climate",
|
||||||
"game_speed",
|
"game_speed",
|
||||||
"console_small_font"
|
"console_small_font",
|
||||||
|
"test_unfinished_tracks",
|
||||||
|
"no_test_crashes"
|
||||||
};
|
};
|
||||||
|
|
||||||
console_command console_command_table[] = {
|
console_command console_command_table[] = {
|
||||||
|
|||||||
@@ -52,9 +52,13 @@ SDL_Color gPalette[256];
|
|||||||
|
|
||||||
static SDL_Surface *_surface;
|
static SDL_Surface *_surface;
|
||||||
static SDL_Palette *_palette;
|
static SDL_Palette *_palette;
|
||||||
static int _screenBufferSize;
|
|
||||||
static void *_screenBuffer;
|
static void *_screenBuffer;
|
||||||
|
static int _screenBufferSize;
|
||||||
|
static int _screenBufferWidth;
|
||||||
|
static int _screenBufferHeight;
|
||||||
static int _screenBufferPitch;
|
static int _screenBufferPitch;
|
||||||
|
|
||||||
static SDL_Cursor* _cursors[CURSOR_COUNT];
|
static SDL_Cursor* _cursors[CURSOR_COUNT];
|
||||||
static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP };
|
static const int _fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP };
|
||||||
static unsigned int _lastGestureTimestamp;
|
static unsigned int _lastGestureTimestamp;
|
||||||
@@ -64,6 +68,8 @@ static void platform_create_window();
|
|||||||
static void platform_load_cursors();
|
static void platform_load_cursors();
|
||||||
static void platform_unload_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)
|
int resolution_sort_func(const void *pa, const void *pb)
|
||||||
{
|
{
|
||||||
const resolution *a = (resolution*)pa;
|
const resolution *a = (resolution*)pa;
|
||||||
@@ -228,9 +234,6 @@ void platform_draw()
|
|||||||
|
|
||||||
static void platform_resize(int width, int height)
|
static void platform_resize(int width, int height)
|
||||||
{
|
{
|
||||||
rct_drawpixelinfo *screenDPI;
|
|
||||||
int newScreenBufferSize;
|
|
||||||
void *newScreenBuffer;
|
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
|
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width;
|
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) = width;
|
||||||
@@ -238,36 +241,6 @@ static void platform_resize(int width, int height)
|
|||||||
|
|
||||||
platform_refresh_video();
|
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);
|
flags = SDL_GetWindowFlags(gWindow);
|
||||||
|
|
||||||
if ((flags & SDL_WINDOW_MINIMIZED) == 0) {
|
if ((flags & SDL_WINDOW_MINIMIZED) == 0) {
|
||||||
@@ -752,7 +725,7 @@ void platform_refresh_video()
|
|||||||
SDL_DestroyTexture(gBufferTexture);
|
SDL_DestroyTexture(gBufferTexture);
|
||||||
|
|
||||||
gBufferTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBX8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
gBufferTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBX8888, SDL_TEXTUREACCESS_STREAMING, width, height);
|
||||||
_screenBufferPitch = width;
|
platform_refresh_screenbuffer(width, height, width);
|
||||||
} else {
|
} else {
|
||||||
if (_surface != NULL)
|
if (_surface != NULL)
|
||||||
SDL_FreeSurface(_surface);
|
SDL_FreeSurface(_surface);
|
||||||
@@ -772,6 +745,59 @@ void platform_refresh_video()
|
|||||||
exit(-1);
|
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;
|
||||||
}
|
}
|
||||||
157
src/ride/ride.c
157
src/ride/ride.c
@@ -1325,6 +1325,30 @@ static void ride_update(int rideIndex)
|
|||||||
ride_breakdown_status_update(rideIndex);
|
ride_breakdown_status_update(rideIndex);
|
||||||
|
|
||||||
ride_inspection_update(ride);
|
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;
|
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
|
* rct2: 0x006B4EEA
|
||||||
@@ -3777,7 +3926,13 @@ void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *e
|
|||||||
return;
|
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;
|
*ebx = MONEY32_UNDEFINED;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -362,7 +362,10 @@ enum {
|
|||||||
RIDE_LIFECYCLE_16 = 1 << 16,
|
RIDE_LIFECYCLE_16 = 1 << 16,
|
||||||
RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17,
|
RIDE_LIFECYCLE_CABLE_LIFT = 1 << 17,
|
||||||
RIDE_LIFECYCLE_18 = 1 << 18,
|
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 {
|
enum {
|
||||||
|
|||||||
@@ -101,11 +101,12 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
|
|||||||
WIDX_AUTOSAVE_DROPDOWN,
|
WIDX_AUTOSAVE_DROPDOWN,
|
||||||
WIDX_ALLOW_SUBTYPE_SWITCHING,
|
WIDX_ALLOW_SUBTYPE_SWITCHING,
|
||||||
WIDX_DEBUGGING_TOOLS,
|
WIDX_DEBUGGING_TOOLS,
|
||||||
|
WIDX_TEST_UNFINISHED_TRACKS,
|
||||||
WINDOW_OPTIONS_WIDGETS_SIZE // Marks the end of the widget list, leave as last item
|
WINDOW_OPTIONS_WIDGETS_SIZE // Marks the end of the widget list, leave as last item
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WW 310
|
#define WW 310
|
||||||
#define WH 153
|
#define WH 183
|
||||||
|
|
||||||
static rct_widget window_options_widgets[] = {
|
static rct_widget window_options_widgets[] = {
|
||||||
{ WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE },
|
{ 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_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, 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, 113, 124, 5150, STR_NONE }, // enabled debugging tools
|
||||||
|
{ WWT_CHECKBOX, 2, 10, 299, 128, 139, 5155, 5156 }, // test unfinished tracks
|
||||||
{ WIDGETS_END },
|
{ WIDGETS_END },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -274,6 +276,7 @@ void window_options_open()
|
|||||||
(1ULL << WIDX_AUTOSAVE_DROPDOWN) |
|
(1ULL << WIDX_AUTOSAVE_DROPDOWN) |
|
||||||
(1ULL << WIDX_ALLOW_SUBTYPE_SWITCHING) |
|
(1ULL << WIDX_ALLOW_SUBTYPE_SWITCHING) |
|
||||||
(1ULL << WIDX_DEBUGGING_TOOLS) |
|
(1ULL << WIDX_DEBUGGING_TOOLS) |
|
||||||
|
(1ULL << WIDX_TEST_UNFINISHED_TRACKS) |
|
||||||
(1ULL << WIDX_RCT1_COLOUR_SCHEME);
|
(1ULL << WIDX_RCT1_COLOUR_SCHEME);
|
||||||
|
|
||||||
w->page = WINDOW_OPTIONS_PAGE_DISPLAY;
|
w->page = WINDOW_OPTIONS_PAGE_DISPLAY;
|
||||||
@@ -347,6 +350,11 @@ static void window_options_mouseup()
|
|||||||
config_save_default();
|
config_save_default();
|
||||||
window_invalidate(w);
|
window_invalidate(w);
|
||||||
break;
|
break;
|
||||||
|
case WIDX_TEST_UNFINISHED_TRACKS:
|
||||||
|
gConfigGeneral.test_unfinished_tracks ^= 1;
|
||||||
|
config_save_default();
|
||||||
|
window_invalidate(w);
|
||||||
|
break;
|
||||||
case WIDX_REAL_NAME_CHECKBOX:
|
case WIDX_REAL_NAME_CHECKBOX:
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_SHOW_REAL_GUEST_NAMES;
|
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);
|
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;
|
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_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_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX;
|
||||||
window_options_widgets[WIDX_SAVE_PLUGIN_DATA_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_AUTOSAVE_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
|
||||||
window_options_widgets[WIDX_ALLOW_SUBTYPE_SWITCHING].type = WWT_CHECKBOX;
|
window_options_widgets[WIDX_ALLOW_SUBTYPE_SWITCHING].type = WWT_CHECKBOX;
|
||||||
window_options_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX;
|
window_options_widgets[WIDX_DEBUGGING_TOOLS].type = WWT_CHECKBOX;
|
||||||
|
window_options_widgets[WIDX_TEST_UNFINISHED_TRACKS].type = WWT_CHECKBOX;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user