Merge pull request #4176 from janisozaur/ride-types

Fix #4172: Expose ride-type changing capability in UI
This commit is contained in:
Ted John 2016-08-01 21:40:46 +01:00 committed by GitHub
commit 86d5447709
22 changed files with 151 additions and 59 deletions

View File

@ -4216,6 +4216,9 @@ STR_5904 :Reset date
STR_5905 :{SMALLFONT}{BLACK}A map generation tool that automatically creates a custom landscape
STR_5906 :Zoom to cursor position
STR_5907 :{SMALLFONT}{BLACK}When enabled, zooming in will centre around the cursor, as opposed to the screen centre.
STR_5908 :Allow arbitrary ride type changes
STR_5909 :{SMALLFONT}{BLACK}Allows changing ride type freely. May cause crashes.
STR_5910 :Apply
#############
# Scenarios #

View File

@ -43,6 +43,7 @@ bool gCheatsFreezeClimate = false;
bool gCheatsDisableTrainLengthLimit = false;
bool gCheatsDisablePlantAging = false;
bool gCheatsEnableChainLiftOnAllTrack = false;
bool gCheatsAllowArbitraryRideTypeChanges = false;
int park_rating_spinner_value;
@ -416,6 +417,7 @@ void game_command_cheat(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* e
case CHEAT_HAVEFUN: gScenarioObjectiveType = OBJECTIVE_HAVE_FUN; break;
case CHEAT_SETFORCEDPARKRATING: if(*edx > -1) { park_rating_spinner_value = *edx; } set_forced_park_rating(*edx); break;
case CHEAT_RESETDATE: date_reset(); window_invalidate_by_class(WC_BOTTOM_TOOLBAR); break;
case CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES: gCheatsAllowArbitraryRideTypeChanges = !gCheatsAllowArbitraryRideTypeChanges; window_invalidate_by_class(WC_RIDE); break;
}
if (network_get_mode() == NETWORK_MODE_NONE) {
config_save_default();
@ -445,4 +447,5 @@ void cheats_reset()
gCheatsNeverendingMarketing = false;
gCheatsFreezeClimate = false;
gCheatsDisablePlantAging = false;
gCheatsAllowArbitraryRideTypeChanges = false;
}

View File

@ -37,6 +37,7 @@ extern bool gCheatsFreezeClimate;
extern bool gCheatsDisableTrainLengthLimit;
extern bool gCheatsDisablePlantAging;
extern bool gCheatsEnableChainLiftOnAllTrack;
extern bool gCheatsAllowArbitraryRideTypeChanges;
enum {
@ -81,6 +82,7 @@ enum {
CHEAT_SETFORCEDPARKRATING,
CHEAT_NEVERENDINGMARKETING,
CHEAT_RESETDATE,
CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES,
};
enum {

View File

@ -1142,5 +1142,4 @@ GAME_COMMAND_POINTER* new_game_command_table[68] = {
game_command_modify_groups,
game_command_kick_player,
game_command_cheat,
game_command_reset_sprites,
};

View File

@ -89,7 +89,6 @@ enum GAME_COMMAND {
GAME_COMMAND_MODIFY_GROUPS,
GAME_COMMAND_KICK_PLAYER,
GAME_COMMAND_CHEAT,
GAME_COMMAND_RESET_SPRITES,
};
enum {

View File

@ -451,11 +451,11 @@ static int cc_rides(const utf8 **argv, int argc)
FOR_ALL_RIDES(i, ride) {
char name[128];
format_string(name, ride->name, &ride->name_arguments);
console_printf("ride %03d type: %02u subtype %03u name %s", i, ride->type, ride->subtype, name);
console_printf("rides %03d type: %02u subtype %03u name %s", i, ride->type, ride->subtype, name);
}
} else if (strcmp(argv[0], "set") == 0) {
if (argc < 4) {
console_printf("ride set type <ride id> <ride type> [ride subtype]");
console_printf("rides set type <ride id> <ride type>");
return 0;
}
if (strcmp(argv[1], "type") == 0) {
@ -470,18 +470,12 @@ static int cc_rides(const utf8 **argv, int argc)
console_printf("This command expects integer arguments");
} else if (ride_index < 0) {
console_printf("Ride index must not be negative");
} else if (argc > 4 && (!int_valid[2] || (subtype < 0 || subtype >= object_entry_group_counts[OBJECT_TYPE_RIDE])))
{
console_printf("No ride entry found for given subtype");
} else {
gGameCommandErrorTitle = STR_CANT_CHANGE_OPERATING_MODE;
int res = game_do_command(0, (type << 8) | 1, 0, (RIDE_SETTING_RIDE_TYPE << 8) | ride_index, GAME_COMMAND_SET_RIDE_SETTING, 0, 0);
rct_ride *ride = get_ride(ride_index);
if (ride->type != RIDE_TYPE_NULL) {
ride->type = type;
if (int_valid[2]) {
ride->subtype = subtype;
}
} else {
console_printf("No ride found with index %d", ride_index);
if (res == MONEY32_UNDEFINED) {
console_printf("That didn't work");
}
}
} else if (strcmp(argv[1], "friction") == 0) {

View File

@ -3339,7 +3339,10 @@ enum {
STR_MAP_GENERATOR_TIP = 5905,
STR_ZOOM_TO_CURSOR = 5906,
STR_ZOOM_TO_CURSOR_TIP = 5907,
STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES = 5908,
STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP = 5909,
STR_APPLY = 5910,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768
};

View File

@ -1520,9 +1520,6 @@ void Network::Server_Client_Joined(const char* name, const std::string &keyhash,
format_string(text, STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, &player_name);
chat_history_add(text);
Server_Send_MAP(&connection);
// This is needed to synchronise calls to reset sprite order across clients,
// otherwise connected clients will fall out of sync in simulation.
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_RESET_SPRITES, 0, 0);
gNetwork.Server_Send_EVENT_PLAYER_JOINED(player_name);
Server_Send_GROUPLIST(connection);
Server_Send_PLAYERLIST();

View File

@ -55,7 +55,7 @@ extern "C" {
// This define specifies which version of network stream current build uses.
// It is used for making sure only compatible builds get connected, even within
// single OpenRCT2 version.
#define NETWORK_STREAM_VERSION "11"
#define NETWORK_STREAM_VERSION "12"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
#ifdef __cplusplus

View File

@ -6295,7 +6295,7 @@ rct_peep *peep_generate(int x, int y, int z)
move_sprite_to_list((rct_sprite*)peep, SPRITE_LIST_PEEP * 2);
peep->sprite_identifier = 1;
peep->sprite_identifier = SPRITE_IDENTIFIER_PEEP;
peep->sprite_type = PEEP_SPRITE_TYPE_NORMAL;
peep->outside_of_park = 1;
peep->state = PEEP_STATE_FALLING;

View File

@ -483,7 +483,6 @@ extern "C"
}
map_reorganise_elements();
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_RESET_SPRITES, 0, 0);
sprite_clear_all_unused();
viewport_set_saved_view();
@ -544,6 +543,7 @@ extern "C"
}
// Write other data not in normal save files
SDL_RWwrite(rw, gSpriteSpatialIndex, 0x10001 * sizeof(uint16), 1);
SDL_WriteLE32(rw, gGamePaused);
SDL_WriteLE32(rw, _guestGenerationProbability);
SDL_WriteLE32(rw, _suggestedGuestMaximum);
@ -565,6 +565,7 @@ extern "C"
SDL_WriteU8(rw, gCheatsNeverendingMarketing);
SDL_WriteU8(rw, gCheatsFreezeClimate);
SDL_WriteU8(rw, gCheatsDisablePlantAging);
SDL_WriteU8(rw, gCheatsAllowArbitraryRideTypeChanges);
gfx_invalidate_screen();
return 1;

View File

@ -367,10 +367,9 @@ void S6Importer::Import()
}
map_update_tile_pointers();
reset_all_sprite_quadrant_placements();
reset_sprite_spatial_index();
if (network_get_mode() == NETWORK_MODE_CLIENT)
if (network_get_mode() != NETWORK_MODE_CLIENT)
{
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_RESET_SPRITES, 0, 0);
reset_sprite_spatial_index();
}
game_convert_strings_to_utf8();
if (FixIssues)
@ -491,6 +490,7 @@ extern "C"
SDL_RWread(rw, &checksum, sizeof(uint32), 1);
// Read other data not in normal save files
SDL_RWread(rw, gSpriteSpatialIndex, 0x10001 * sizeof(uint16), 1);
gGamePaused = SDL_ReadLE32(rw);
_guestGenerationProbability = SDL_ReadLE32(rw);
_suggestedGuestMaximum = SDL_ReadLE32(rw);
@ -512,6 +512,7 @@ extern "C"
gCheatsNeverendingMarketing = SDL_ReadU8(rw) != 0;
gCheatsFreezeClimate = SDL_ReadU8(rw) != 0;
gCheatsDisablePlantAging = SDL_ReadU8(rw) != 0;
gCheatsAllowArbitraryRideTypeChanges = SDL_ReadU8(rw) != 0;
gLastAutoSaveTick = SDL_GetTicks();
return 1;

View File

@ -3916,6 +3916,14 @@ static money32 ride_set_setting(uint8 rideIndex, uint8 setting, uint8 value, uin
}
}
break;
case RIDE_SETTING_RIDE_TYPE:
if (!gCheatsAllowArbitraryRideTypeChanges) {
return MONEY32_UNDEFINED;
}
if (flags & GAME_COMMAND_FLAG_APPLY) {
ride->type = value;
}
break;
}
if (flags & GAME_COMMAND_FLAG_APPLY) {

View File

@ -880,6 +880,7 @@ enum {
RIDE_SETTING_MUSIC_TYPE,
RIDE_SETTING_LIFT_HILL_SPEED,
RIDE_SETTING_NUM_CIRCUITS,
RIDE_SETTING_RIDE_TYPE,
};
#define MAX_RIDES 255

View File

@ -106,6 +106,9 @@ void title_load()
gScreenFlags = SCREEN_FLAGS_TITLE_DEMO;
#ifndef DISABLE_NETWORK
network_close();
#endif
reset_park_entrances();
user_string_clear_all();
reset_sprite_list();
@ -131,9 +134,6 @@ void title_load()
title_init_showcase();
gfx_invalidate_screen();
gScreenAge = 0;
#ifndef DISABLE_NETWORK
network_close();
#endif
if (gOpenRCT2ShowChangelog) {
gOpenRCT2ShowChangelog = false;

View File

@ -130,7 +130,8 @@ enum WINDOW_CHEATS_WIDGET_IDX {
WIDX_SHOW_ALL_OPERATING_MODES,
WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES,
WIDX_DISABLE_TRAIN_LENGTH_LIMITS,
WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK
WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK,
WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES,
};
#pragma region MEASUREMENTS
@ -259,6 +260,7 @@ static rct_widget window_cheats_rides_widgets[] = {
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(6), OHPL(6), STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, STR_NONE }, // Show vehicles from other track types
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(12), OHPL(12), STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP }, // Disable train length limits
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(13), OHPL(13), STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK_TIP }, // Enable chain lift on all track
{ WWT_CHECKBOX, 2, XPL(0), OWPL, YPL(14), OHPL(14), STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP }, // Allow arbitrary ride type changes
{ WIDGETS_END },
};
@ -430,7 +432,8 @@ static uint64 window_cheats_page_enabled_widgets[] = {
(1ULL << WIDX_CLOSE) | (1ULL << WIDX_TAB_1) | (1ULL << WIDX_TAB_2) | (1ULL << WIDX_TAB_3) | (1ULL << WIDX_TAB_4) | (1ULL << WIDX_RENEW_RIDES) |
(1ULL << WIDX_MAKE_DESTRUCTIBLE) | (1ULL << WIDX_FIX_ALL) | (1ULL << WIDX_FAST_LIFT_HILL) | (1ULL << WIDX_DISABLE_BRAKES_FAILURE) |
(1ULL << WIDX_DISABLE_ALL_BREAKDOWNS) | (1ULL << WIDX_BUILD_IN_PAUSE_MODE) | (1ULL << WIDX_RESET_CRASH_STATUS) | (1ULL << WIDX_10_MINUTE_INSPECTIONS) |
(1ULL << WIDX_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) | (1ULL << WIDX_DISABLE_TRAIN_LENGTH_LIMITS) | (1ULL << WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK)
(1ULL << WIDX_SHOW_ALL_OPERATING_MODES) | (1ULL << WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES) | (1ULL << WIDX_DISABLE_TRAIN_LENGTH_LIMITS) |
(1ULL << WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK) | (1ULL << WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES)
};
static rct_string_id window_cheats_page_titles[] = {
@ -758,6 +761,12 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex)
case WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_ENABLECHAINLIFTONALLTRACK, 0, GAME_COMMAND_CHEAT, 0, 0);
break;
case WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, 0, GAME_COMMAND_CHEAT, 0, 0);
if (gCheatsAllowArbitraryRideTypeChanges) {
window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE);
}
break;
}
}
@ -830,6 +839,7 @@ static void window_cheats_invalidate(rct_window *w)
widget_set_checkbox_value(w, WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gCheatsShowVehiclesFromOtherTrackTypes);
widget_set_checkbox_value(w, WIDX_DISABLE_TRAIN_LENGTH_LIMITS, gCheatsDisableTrainLengthLimit);
widget_set_checkbox_value(w, WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, gCheatsEnableChainLiftOnAllTrack);
widget_set_checkbox_value(w, WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, gCheatsAllowArbitraryRideTypeChanges);
break;
}

View File

@ -86,6 +86,10 @@ enum {
WIDX_CLOSE_LIGHT,
WIDX_TEST_LIGHT,
WIDX_OPEN_LIGHT,
WIDX_RIDE_TYPE,
WIDX_RIDE_TYPE_INCREASE,
WIDX_RIDE_TYPE_DECREASE,
WIDX_RIDE_TYPE_APPLY,
WIDX_VEHICLE_TYPE = 14,
WIDX_VEHICLE_TYPE_DROPDOWN,
@ -214,6 +218,13 @@ static rct_widget window_ride_main_widgets[] = {
{ WWT_IMGBTN, 1, 296, 309, 48, 61, SPR_G2_RCT1_CLOSE_BUTTON_0, STR_CLOSE_RIDE_TIP },
{ WWT_IMGBTN, 1, 296, 309, 62, 75, SPR_G2_RCT1_TEST_BUTTON_0, STR_TEST_RIDE_TIP },
{ WWT_IMGBTN, 1, 296, 309, 76, 89, SPR_G2_RCT1_OPEN_BUTTON_0, STR_OPEN_RIDE_TIP },
// Ride type spinner + apply button
{ WWT_SPINNER, 1, 3, 253, 180, 191, STR_ARG_6_STRINGID, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 242, 252, 181, 185, STR_NUMERIC_UP, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 242, 252, 186, 190, STR_NUMERIC_DOWN, STR_NONE },
{ WWT_CLOSEBOX, 1, 260, 307, 180, 191, STR_APPLY, STR_NONE },
{ WIDGETS_END },
};
@ -243,6 +254,7 @@ static rct_widget window_ride_vehicle_widgets[] = {
{ WWT_SPINNER, 1, 164, 308, 190, 201, STR_1_CAR_PER_TRAIN, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 297, 307, 191, 195, STR_NUMERIC_UP, STR_NONE },
{ WWT_DROPDOWN_BUTTON, 1, 297, 307, 196, 200, STR_NUMERIC_DOWN, STR_NONE },
{ WIDGETS_END },
};
@ -497,7 +509,7 @@ static rct_widget *window_ride_page_widgets[] = {
};
const uint64 window_ride_page_enabled_widgets[] = {
0x0000000003FDBFF4,
0x000000003FFDBFF4,
0x00000000007EFFF4,
0x0000019E777DBFF4,
0x000000000003FFF4,
@ -955,6 +967,10 @@ static rct_window_event_list *window_ride_page_events[] = {
#pragma endregion
static uint8 _rideType;
static void set_operating_setting(int rideNumber, uint8 setting, uint8 value);
// Cached overall view for each ride
// (Re)calculated when the ride window is opened
typedef struct ride_overall_view_t {
@ -1528,9 +1544,8 @@ static rct_window *window_ride_open(int rideIndex)
w->max_width = 500;
w->max_height = 450;
window_ride_update_overall_view((uint8) rideIndex);
ride = get_ride(rideIndex);
_rideType = ride->type;
numSubTypes = 0;
rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(ride->type);
for (; *rideEntryIndexPtr != 0xFF; rideEntryIndexPtr++) {
@ -1539,6 +1554,9 @@ static rct_window *window_ride_open(int rideIndex)
}
}
var_496(w) = numSubTypes;
window_ride_update_overall_view((uint8) rideIndex);
return w;
}
@ -1609,6 +1627,7 @@ rct_window *window_ride_open_station(int rideIndex, int stationIndex)
) {
tool_cancel();
}
_rideType = ride->type;
w->page = WINDOW_RIDE_PAGE_MAIN;
w->width = 316;
@ -1719,6 +1738,7 @@ rct_window *window_ride_open_vehicle(rct_vehicle *vehicle)
w->ride.var_482 = -1;
}
_rideType = ride->type;
w->page = WINDOW_RIDE_PAGE_MAIN;
w->width = 316;
w->height = 180;
@ -2024,16 +2044,17 @@ static void window_ride_main_resize(rct_window *w)
rct_viewport *viewport;
int width, height;
const int offset = gCheatsAllowArbitraryRideTypeChanges ? 15 : 0;
w->flags |= WF_RESIZABLE;
int minHeight = 180;
int minHeight = 180 + offset;
if (theme_get_flags() & UITHEME_FLAG_USE_LIGHTS_RIDE)
minHeight = 200 + RCT1_LIGHT_OFFSET - (ride_type_has_flag(get_ride(w->number)->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
minHeight = 200 + offset + RCT1_LIGHT_OFFSET - (ride_type_has_flag(get_ride(w->number)->type, RIDE_TYPE_FLAG_NO_TEST_MODE) ? 14 : 0);
window_set_resize(w, 316, minHeight, 500, 450);
viewport = w->viewport;
if (viewport != NULL) {
width = w->width - 30;
height = w->height - 75;
height = w->height - (75 + offset);
if (viewport->width != width || viewport->height != height) {
viewport->width = width;
viewport->height = height;
@ -2190,6 +2211,7 @@ static void window_ride_show_open_dropdown(rct_window *w, rct_widget *widget)
*/
static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widget *widget)
{
rct_ride *ride = get_ride(w->number);
switch (widgetIndex) {
case WIDX_VIEW_DROPDOWN:
window_ride_show_view_dropdown(w, widget);
@ -2197,6 +2219,28 @@ static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widge
case WIDX_OPEN:
window_ride_show_open_dropdown(w, widget);
break;
case WIDX_RIDE_TYPE_INCREASE:
if (_rideType >= 90) {
_rideType = 90;
} else {
_rideType++;
}
widget_invalidate(w, WIDX_RIDE_TYPE);
break;
case WIDX_RIDE_TYPE_DECREASE:
if (_rideType == 0) {
_rideType = 0;
} else {
_rideType--;
}
widget_invalidate(w, WIDX_RIDE_TYPE);
break;
case WIDX_RIDE_TYPE_APPLY:
if (_rideType >= 0 && _rideType <= 90) {
set_operating_setting(w->number, RIDE_SETTING_RIDE_TYPE, _rideType);
}
window_invalidate_all();
break;
}
}
@ -2347,6 +2391,7 @@ static void window_ride_main_invalidate(rct_window *w)
set_format_arg(0, uint16, ride->name);
set_format_arg(2, uint32, ride->name_arguments);
set_format_arg(6, uint16, _rideType + STR_RIDE_NAME_SPIRAL_ROLLER_COASTER);
uint32 spriteIds[] = {
SPR_CLOSED,
SPR_OPEN,
@ -2360,15 +2405,46 @@ static void window_ride_main_invalidate(rct_window *w)
window_ride_anchor_border_widgets(w);
const int offset = gCheatsAllowArbitraryRideTypeChanges ? 15 : 0;
// Anchor main page specific widgets
window_ride_main_widgets[WIDX_VIEWPORT].right = w->width - 26;
window_ride_main_widgets[WIDX_VIEWPORT].bottom = w->height - 14;
window_ride_main_widgets[WIDX_VIEWPORT].bottom = w->height - (14 + offset);
window_ride_main_widgets[WIDX_STATUS].right = w->width - 26;
window_ride_main_widgets[WIDX_STATUS].top = w->height - 13;
window_ride_main_widgets[WIDX_STATUS].bottom = w->height - 3;
window_ride_main_widgets[WIDX_STATUS].top = w->height - (13 + offset);
window_ride_main_widgets[WIDX_STATUS].bottom = w->height - (3 + offset);
window_ride_main_widgets[WIDX_VIEW].right = w->width - 60;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].right = w->width - 61;
window_ride_main_widgets[WIDX_VIEW_DROPDOWN].left = w->width - 71;
window_ride_main_widgets[WIDX_RIDE_TYPE].right = w->width - 87;
window_ride_main_widgets[WIDX_RIDE_TYPE].top = w->height - 17;
window_ride_main_widgets[WIDX_RIDE_TYPE].bottom = w->height - 4;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].right = w->width - 88;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].left = w->width - 98;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].top = w->height - 16;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].bottom = w->height - 11;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].right = w->width - 88;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].left = w->width - 98;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].top = w->height - 10;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].bottom = w->height - 5;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].left = w->width - 83;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].right = w->width - 26;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].top = w->height - 17;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].bottom = w->height - 4;
widget_invalidate(w, WIDX_VIEWPORT);
widget_invalidate(w, WIDX_VIEW);
if (!gCheatsAllowArbitraryRideTypeChanges) {
window_ride_main_widgets[WIDX_RIDE_TYPE].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].type = WWT_EMPTY;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].type = WWT_EMPTY;
} else {
window_ride_main_widgets[WIDX_RIDE_TYPE].type = WWT_SPINNER;
window_ride_main_widgets[WIDX_RIDE_TYPE_INCREASE].type = WWT_DROPDOWN_BUTTON;
window_ride_main_widgets[WIDX_RIDE_TYPE_DECREASE].type = WWT_DROPDOWN_BUTTON;
window_ride_main_widgets[WIDX_RIDE_TYPE_APPLY].type = WWT_CLOSEBOX;
}
window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10);

View File

@ -15,6 +15,7 @@
#pragma endregion
#include "../audio/audio.h"
#include "../network/network.h"
#include "../scenario.h"
#include "../util/util.h"
#include "sprite.h"
@ -82,6 +83,9 @@ void balloon_update(rct_balloon *balloon)
*/
void balloon_press(rct_balloon *balloon)
{
if (network_get_mode() != NETWORK_MODE_NONE) {
return;
}
if (balloon->popped == 1)
return;

View File

@ -93,7 +93,7 @@ void climate_reset(int climate)
_rainVolume = 1;
}
climate_determine_future_weather(util_rand());
climate_determine_future_weather(scenario_rand());
}
static sint8 step_weather_level(sint8 cur_weather_level, sint8 next_weather_level) {

View File

@ -16,6 +16,7 @@
#include "../audio/audio.h"
#include "../util/util.h"
#include "../scenario.h"
#include "sprite.h"
/**
@ -35,12 +36,12 @@ void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, i
sprite_move(x, y, z, (rct_sprite*)sprite);
sprite->misc_identifier = SPRITE_MISC_CRASHED_VEHICLE_PARTICLE;
sprite->frame = (util_rand() & 0xFF) * 12;
sprite->var_24 = (util_rand() & 0x7F) + 140;
sprite->var_2E = ((util_rand() & 0xFF) * 5) >> 8;
sprite->acceleration_x = ((sint16)(util_rand() & 0xFFFF)) * 4;
sprite->acceleration_y = ((sint16)(util_rand() & 0xFFFF)) * 4;
sprite->acceleration_z = (util_rand() & 0xFFFF) * 4 + 0x10000;
sprite->frame = (scenario_rand() & 0xFF) * 12;
sprite->var_24 = (scenario_rand() & 0x7F) + 140;
sprite->var_2E = ((scenario_rand() & 0xFF) * 5) >> 8;
sprite->acceleration_x = ((sint16)(scenario_rand() & 0xFFFF)) * 4;
sprite->acceleration_y = ((sint16)(scenario_rand() & 0xFFFF)) * 4;
sprite->acceleration_z = (scenario_rand() & 0xFFFF) * 4 + 0x10000;
sprite->velocity_x = 0;
sprite->velocity_y = 0;
sprite->velocity_z = 0;

View File

@ -128,8 +128,6 @@ void reset_sprite_list()
}
gSpriteListCount[SPRITE_LIST_NULL] = MAX_SPRITES;
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_RESET_SPRITES, 0, 0);
}
/**
@ -159,15 +157,6 @@ void reset_sprite_spatial_index()
}
}
void game_command_reset_sprites(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp)
{
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
reset_all_sprite_quadrant_placements();
reset_sprite_spatial_index();
}
*ebx = 0;
}
#ifndef DISABLE_NETWORK
static unsigned char _spriteChecksum[EVP_MAX_MD_SIZE + 1];
@ -181,9 +170,11 @@ const char * sprite_checksum()
for (size_t i = 0; i < MAX_SPRITES; i++)
{
rct_sprite *sprite = get_sprite(i);
if (sprite->unknown.sprite_identifier != SPRITE_IDENTIFIER_NULL)
if (sprite->unknown.sprite_identifier != SPRITE_IDENTIFIER_NULL && sprite->unknown.sprite_identifier != SPRITE_IDENTIFIER_MISC)
{
if (EVP_DigestUpdate(gHashCTX, sprite, sizeof(rct_sprite)) <= 0)
rct_sprite copy = *sprite;
copy.unknown.sprite_left = copy.unknown.sprite_right = copy.unknown.sprite_top = copy.unknown.sprite_bottom = 0;
if (EVP_DigestUpdate(gHashCTX, &copy, sizeof(rct_sprite)) <= 0)
{
openrct2_assert(false, "Failed to update digest");
}

View File

@ -395,7 +395,6 @@ extern uint16 *gSpriteSpatialIndex;
rct_sprite *create_sprite(uint8 bl);
void reset_sprite_list();
void game_command_reset_sprites(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
void reset_sprite_spatial_index();
void sprite_clear_all_unused();
void move_sprite_to_list(rct_sprite *sprite, uint8 cl);