diff --git a/contributors.md b/contributors.md index 59f4d1006f..358ba95111 100644 --- a/contributors.md +++ b/contributors.md @@ -55,6 +55,7 @@ Includes all git commit authors. Aliases are GitHub user names. * (nean) * Ed Foley (e-foley) * Michael Pham (nightroan) +* Hielke Morsink (Broxzier) ## Toolchain * (Balletie) - OSX diff --git a/data/language/chinese_traditional.txt b/data/language/chinese_traditional.txt index 183ea7e5c1..f7c6349065 100644 --- a/data/language/chinese_traditional.txt +++ b/data/language/chinese_traditional.txt @@ -2294,7 +2294,7 @@ STR_2286 :設計中 STR_2287 :完成設計中 STR_2288 :未知 STR_2289 :{STRINGID} {STRINGID} -STR_2290 :{SMALLFONT}{BLACK}{STRINGID} {STRINGID} +STR_2290 : STR_2291 :選擇新遊戲的劇情 STR_2292 :{WINDOW_COLOUR_2}乘坐過的遊樂設施: STR_2293 :{BLACK}無 @@ -3900,7 +3900,7 @@ STR_5557 :多人遊戲不同步時依然保持連線 STR_5558 :此設定會於重啟遊戲後生效 STR_5559 :檢查時距為10分鐘 STR_5560 :將所有遊樂設施的檢查時距設定為'每10分鐘' -STR_5561 :載入語言檔案失敗 +STR_5561 :載入語言失敗 STR_5562 :警告! STR_5563 :此功能暫未穩定地使用, 請多加留意. STR_5564 :插入已損壞元素 @@ -3919,6 +3919,7 @@ STR_5576 :連接埠: STR_5577 :南韓園 (₩) STR_5578 :俄羅斯盧布 (R) STR_5579 :顥示縮放因子: +STR_5580 :捷克克朗 (Kc) ##################### diff --git a/data/language/dutch.txt b/data/language/dutch.txt index f2410ff207..cf42a3debb 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -3171,20 +3171,20 @@ STR_3166 :{BLACK}(ID: STR_3167 :{WINDOW_COLOUR_2}Bevat {BLACK}{COMMA16} objecten STR_3168 :{WINDOW_COLOUR_2}Tekst: {BLACK}{STRINGID} STR_3169 :Data voor de volgende objecten niet gevonden: -STR_3170 :Niet genoeg ruimte voor graphics -STR_3171 :Te veel objecten van dit type geselecteerd +STR_3170 :Niet genoeg ruimte voor graphics. +STR_3171 :er zijn teveel objecten van dit type geselecteerd. STR_3172 :De volgende objecten moeten eerst geselecteerd worden: -STR_3173 :Dit object is momenteel in gebruik -STR_3174 :Een ander object is afhankelijk van dit object -STR_3175 :Dit object is altijd benodigd -STR_3176 :Kan object niet selecteren -STR_3177 :Kan object niet deselecteren -STR_3178 :Er moet minstens één voetpad worden geselecteerd -STR_3179 :Er moet minstens één attractie worden geselecteerd -STR_3180 :Ongeldige selectie van objecten +STR_3173 :dit object is momenteel in gebruik. +STR_3174 :een ander object is afhankelijk van dit object. +STR_3175 :dit object is altijd benodigd. +STR_3176 :Kan object niet selecteren: +STR_3177 :Kan object niet deselecteren: +STR_3178 :er moet minstens één voetpad worden geselecteerd. +STR_3179 :er moet minstens één attractie worden geselecteerd. +STR_3180 :Ongeldige selectie van objecten: STR_3181 :Objectselectie - {STRINGID} -STR_3182 :Er moet een parkingang worden geselecteerd -STR_3183 :Er moet een watertype worden geselecteerd +STR_3182 :er moet een parkingang worden geselecteerd. +STR_3183 :er moet een watertype worden geselecteerd. STR_3184 :Attracties/voertuigen STR_3185 :Klein decor STR_3186 :Groot decor @@ -5588,7 +5588,7 @@ STR_DESC :Een waar de nieuwste soorten frisdrank worden verkocht. # Shops [BALLN] -STR_NAME :Balloon Stall +STR_NAME :Ballonnenkraam STR_DESC :Een souvenirkraam waar met helium gevulde ballonnen worden verkocht. [HATST] diff --git a/data/title/openrct2/alexfablelake.SV6 b/data/title/openrct2/alexfablelake.SV6 new file mode 100644 index 0000000000..b48dbf132e Binary files /dev/null and b/data/title/openrct2/alexfablelake.SV6 differ diff --git a/data/title/openrct2/bigfoot.sv6 b/data/title/openrct2/bigfoot.sv6 new file mode 100644 index 0000000000..662a7b28ac Binary files /dev/null and b/data/title/openrct2/bigfoot.sv6 differ diff --git a/data/title/openrct2/faas.sv6 b/data/title/openrct2/faas.sv6 deleted file mode 100644 index bb7ce80cb7..0000000000 Binary files a/data/title/openrct2/faas.sv6 and /dev/null differ diff --git a/data/title/openrct2/gymnasiast1.sv6 b/data/title/openrct2/gymnasiast1.sv6 new file mode 100644 index 0000000000..916823ef7a Binary files /dev/null and b/data/title/openrct2/gymnasiast1.sv6 differ diff --git a/data/title/openrct2/gymnasiast2.sv6 b/data/title/openrct2/gymnasiast2.sv6 new file mode 100644 index 0000000000..a678752eb4 Binary files /dev/null and b/data/title/openrct2/gymnasiast2.sv6 differ diff --git a/data/title/openrct2/netgrouppark.sv6 b/data/title/openrct2/netgrouppark.sv6 new file mode 100644 index 0000000000..4d8554ce80 Binary files /dev/null and b/data/title/openrct2/netgrouppark.sv6 differ diff --git a/data/title/openrct2/pfckrutonium1.sv6 b/data/title/openrct2/pfckrutonium1.sv6 index 25ba708455..907da0bde0 100644 Binary files a/data/title/openrct2/pfckrutonium1.sv6 and b/data/title/openrct2/pfckrutonium1.sv6 differ diff --git a/data/title/openrct2/pfckrutonium2.sv6 b/data/title/openrct2/pfckrutonium2.sv6 deleted file mode 100644 index 59de4c0c38..0000000000 Binary files a/data/title/openrct2/pfckrutonium2.sv6 and /dev/null differ diff --git a/data/title/openrct2/phann.sv6 b/data/title/openrct2/phann.sv6 new file mode 100644 index 0000000000..ca3846acb5 Binary files /dev/null and b/data/title/openrct2/phann.sv6 differ diff --git a/data/title/openrct2/script.txt b/data/title/openrct2/script.txt index aa50e18dd7..0943a1bd72 100644 --- a/data/title/openrct2/script.txt +++ b/data/title/openrct2/script.txt @@ -1,108 +1,81 @@ -# OpenRCT2 0.0.2 Title Sequence Script -# Arranged by IntelOrca +# OpenRCT2 0.0.3 Title Sequence Script +# Arranged by Gymnasiast (Michael Steenbeek). +# Based on the 0.0.2 script, which was arranged by IntelOrca. + -# PFCKrutonium LOAD pfckrutonium1.sv6 LOCATION 7 41 -WAIT 15 -LOCATION 49 15 -ROTATE 1 WAIT 10 -# Achilleshiel +LOAD netgrouppark.sv6 +LOCATION 91 10 +WAIT 9 + +LOCATION 25 15 +WAIT 9 + +LOAD bigfoot.sv6 +LOCATION 58 29 +WAIT 10 + +ROTATE 1 +LOCATION 29 63 +WAIT 10 + +LOAD gymnasiast2.sv6 +LOCATION 39 79 +WAIT 11 + LOAD achilleshiel.sv6 LOCATION 25 77 WAIT 10 LOCATION 36 58 ROTATE 3 -WAIT 12 - -LOCATION 64 40 -ROTATE 1 WAIT 8 -# DUSTY GREENS -LOAD triggerdeath.sv6 -LOCATION 63 68 -WAIT 14 - -ROTATE 1 -WAIT 16 - -LOCATION 28 26 -ROTATE 2 -WAIT 10 - -LOCATION 61 33 -ROTATE 2 -WAIT 8 - -# PFCKrutonium -LOAD pfckrutonium2.sv6 -LOCATION 116 58 -WAIT 14 - -ROTATE 1 -WAIT 12 - -# Shotguns (http://www.nedesigns.com/park/3107/rougarou/) -LOAD shotguns.sv6 -LOCATION 20 13 -WAIT 16 - -# Faas (http://www.nedesigns.com/park/2996/lucky-lake-amusement-park/) -LOAD faas.sv6 -LOCATION 42 11 -WAIT 10 - -LOCATION 30 18 -ROTATE 1 -WAIT 16 - -LOCATION 17 71 -ROTATE 2 -WAIT 12 - -LOCATION 88 68 -WAIT 12 - -# MCI (http://www.nedesigns.com/park/2973/maerchen-paradies/) LOAD mci.sv6 LOCATION 46 60 -WAIT 16 - -LOCATION 78 43 -ROTATE 2 -WAIT 12 +WAIT 6 LOCATION 76 32 ROTATE 1 +WAIT 11 + +LOAD phann.sv6 +LOCATION 96 73 WAIT 8 -# Ride6 (http://www.nedesigns.com/park/2545/banana-valley/) LOAD rid6.sv6 LOCATION 56 34 -WAIT 10 - -LOCATION 48 4 -WAIT 4 +WAIT 8 LOCATION 10 29 ROTATE 1 -WAIT 12 +WAIT 8 + +LOAD gymnasiast1.sv6 +LOCATION 51 46 +WAIT 11 + +LOAD alexfablelake.SV6 +LOCATION 50 25 +WAIT 9 + +ROTATE 1 +LOCATION 35 74 +WAIT 9 -# Poke (http://www.nedesigns.com/park/2967/mystic-mountain/) LOAD poke.sv6 LOCATION 43 83 -WAIT 16 +WAIT 9 LOCATION 63 35 ROTATE 3 -WAIT 12 +WAIT 9 LOCATION 12 47 ROTATE 3 -WAIT 20 +WAIT 6 -RESTART \ No newline at end of file +RESTART diff --git a/data/title/openrct2/shotguns.sv6 b/data/title/openrct2/shotguns.sv6 deleted file mode 100644 index a40b6425a4..0000000000 Binary files a/data/title/openrct2/shotguns.sv6 and /dev/null differ diff --git a/data/title/openrct2/triggerdeath.sv6 b/data/title/openrct2/triggerdeath.sv6 deleted file mode 100644 index ff00a979bb..0000000000 Binary files a/data/title/openrct2/triggerdeath.sv6 and /dev/null differ diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 1c935a1d3f..9a56b27bae 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,4 +1,4 @@ -0.0.3-beta (not yet released) +0.0.3-beta (2015-11-30) ------------------------------------------------------------------------ - Feature: Adding extra title sequences. - Feature: Title sequences can be edited in-game. diff --git a/distribution/known_issues.txt b/distribution/known_issues.txt index 082aa54cc5..9e0a74180f 100644 --- a/distribution/known_issues.txt +++ b/distribution/known_issues.txt @@ -1,11 +1,6 @@ -Release version: 0.0.2-beta +Release version: 0.0.3-beta ------------------------------------------------------------------------ * Some sounds play at their maximum volume irrespective of the sound volume control. -* Sandbox mode does not support all map modifications. -* Zero clearance cheat results in drawing glitches. -* Build while paused mode does not support all game commands. -* Some text shown in the map is not translated to selected language. * Scenario editor object selection window will show object names in the selected language at the time of building the object cache. (Deleting plugin.dat in Documents/OpenRCT2 will fix this) -* The game will run slower at high resolutions, particularly if there are many moving objects visible. -Most bugs or limitations present in the original game have not yet been fixed or lifted. \ No newline at end of file +Some bugs or limitations present in the original game have not yet been fixed or lifted. \ No newline at end of file diff --git a/distribution/readme.txt b/distribution/readme.txt index b08d4d7da7..0ba70659e4 100644 --- a/distribution/readme.txt +++ b/distribution/readme.txt @@ -1,5 +1,5 @@ -Last updated: 2015-06-21 -Release version: 0.0.2-beta +Last updated: 2015-30-11 +Release version: 0.0.3-beta ------------------------------------------------------------------------ diff --git a/distribution/windows/win32.txt b/distribution/windows/win32.txt index ddf41a88ec..55988ec058 100644 --- a/distribution/windows/win32.txt +++ b/distribution/windows/win32.txt @@ -1,5 +1,5 @@ !define APPBITS 32 ; Define number of bits for the architecture -!define EXTRA_VERSION "XP SP3, Vista, 7 and 8.1" +!define EXTRA_VERSION "Vista, 7, 8.1 and 10" !define APPARCH "win32" ; Define the application architecture !define BINARY_DIR "${PATH_ROOT}build\Release" InstallDir "$PROGRAMFILES32\OpenRCT2\" \ No newline at end of file diff --git a/src/game.c b/src/game.c index a53f67f12b..65802ea818 100644 --- a/src/game.c +++ b/src/game.c @@ -1042,11 +1042,14 @@ void save_game() scenario_save(rw, 0x80000000); log_verbose("Saved to %s", gScenarioSavePath); SDL_RWclose(rw); + + // Setting screen age to zero, so no prompt will pop up when closing the + // game shortly after saving. + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) = 0; } } else { save_game_as(); } - } void save_game_as() { diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 78b9c5ad12..87a52f7c07 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1201,7 +1201,7 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){ * dx : height * edi : unknown */ -int sub_6629BC(int height, uint16 ax, uint32 image_id, int edi){ +bool sub_6629BC(int height, uint16 ax, uint32 image_id, int edi){ int eax = ax, ebx = 0, ecx = 0, edx = height, esi = 0, _edi = edi, ebp = image_id; RCT2_CALLFUNC_X(0x006629BC, &eax, &ebx, &ecx, &edx, &esi, &_edi, &ebp); diff --git a/src/interface/viewport.h b/src/interface/viewport.h index d475b00481..b8e4df70fa 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -133,7 +133,7 @@ void sub_688217(); int sub_98197C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_y, sint16 length_x, uint32 rotation); int sub_98199C(sint8 al, sint8 ah, int image_id, sint8 cl, int height, sint16 length_y, sint16 length_x, uint32 rotation); -int sub_6629BC(int height, uint16 ax, uint32 image_id, int edi); +bool sub_6629BC(int height, uint16 ax, uint32 image_id, int edi); void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); diff --git a/src/peep/peep.c b/src/peep/peep.c index e2ec99bc05..a147e5415c 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -3161,7 +3161,10 @@ static void peep_update_ride_sub_state_20(rct_peep* peep){ return; } - audio_play_sound_at_location(SOUND_TOILET_FLUSH, peep->x, peep->y, peep->z); + // Do not play toilet flush sound on title screen as its considered loud and annoying + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TITLE_DEMO)) { + audio_play_sound_at_location(SOUND_TOILET_FLUSH, peep->x, peep->y, peep->z); + } peep->sub_state++; diff --git a/src/rct2.h b/src/rct2.h index 4910528dbc..67f0beaeb2 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -84,7 +84,7 @@ typedef utf16* utf16string; #endif #define OPENRCT2_NAME "OpenRCT2" -#define OPENRCT2_VERSION "0.0.3" +#define OPENRCT2_VERSION "0.0.4" #define OPENRCT2_ARCHITECTURE "x86" #ifdef _WIN32 #define OPENRCT2_PLATFORM "Windows" @@ -103,7 +103,7 @@ typedef utf16* utf16string; // The following constants are for automated build servers #define OPENRCT2_BUILD_NUMBER "" #define OPENRCT2_BUILD_SERVER "" -#define OPENRCT2_BRANCH "pre-release-0.0.3" +#define OPENRCT2_BRANCH "develop" #define OPENRCT2_COMMIT_SHA1 "" #define OPENRCT2_COMMIT_SHA1_SHORT "" #define OPENRCT2_MASTER_SERVER_URL "https://servers.openrct2.website" diff --git a/src/ride/ride.c b/src/ride/ride.c index fd31be73d6..7340a3e298 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -152,7 +152,7 @@ static void ride_shop_connected(rct_ride* ride, int ride_idx); static void ride_spiral_slide_update(rct_ride *ride); static void ride_update(int rideIndex); static void ride_update_vehicle_colours(int rideIndex); -static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride); +static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride, uint8 preset_index); static void maze_entrance_hedge_removal(int x, int y, rct_map_element *mapElement); rct_ride_type *ride_get_entry(rct_ride *ride) @@ -2904,27 +2904,31 @@ vehicle_colour ride_get_vehicle_colour(rct_ride *ride, int vehicleIndex) return result; } -static bool ride_does_vehicle_colour_exist(rct_ride *ride, vehicle_colour *vehicleColour) +static bool ride_does_vehicle_colour_exist(uint8 ride_sub_type, vehicle_colour *vehicleColour) { int i; rct_ride *ride2; FOR_ALL_RIDES(i, ride2) { - if (ride2 == ride) continue; - if (ride2->subtype != ride->subtype) continue; + if (ride2->subtype != ride_sub_type) continue; if (ride2->vehicle_colours[0].body_colour != vehicleColour->main) continue; return false; } return true; } -static int ride_get_unused_preset_vehicle_colour(rct_ride *ride, vehicle_colour_preset_list *presetList) +static int ride_get_unused_preset_vehicle_colour(uint8 ride_type, uint8 ride_sub_type) { + rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride_sub_type); + vehicle_colour_preset_list *presetList = rideEntry->vehicle_preset_list; + if (presetList->count == 255) + return 255; + for (int attempt = 0; attempt < 200; attempt++) { uint8 numColourConfigurations = presetList->count; - int randomConfigIndex = scenario_rand() % numColourConfigurations; + int randomConfigIndex = util_rand() % numColourConfigurations; vehicle_colour *preset = &presetList->list[randomConfigIndex]; - if (ride_does_vehicle_colour_exist(ride, preset)) { + if (ride_does_vehicle_colour_exist(ride_sub_type, preset)) { return randomConfigIndex; } } @@ -2935,14 +2939,13 @@ static int ride_get_unused_preset_vehicle_colour(rct_ride *ride, vehicle_colour_ * * rct2: 0x006DE52C */ -static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride) +static void ride_set_vehicle_colours_to_random_preset(rct_ride *ride, uint8 preset_index) { rct_ride_type *rideEntry = GET_RIDE_ENTRY(ride->subtype); vehicle_colour_preset_list *presetList = rideEntry->vehicle_preset_list; if (presetList->count != 255) { ride->colour_scheme_type = RIDE_COLOUR_SCHEME_ALL_SAME; - int presetIndex = ride_get_unused_preset_vehicle_colour(ride, presetList); - vehicle_colour *preset = &presetList->list[presetIndex]; + vehicle_colour *preset = &presetList->list[preset_index]; ride->vehicle_colours[0].body_colour = preset->main; ride->vehicle_colours[0].trim_colour = preset->additional_1; ride->vehicle_colours_extended[0] = preset->additional_2; @@ -5111,14 +5114,13 @@ static int ride_get_default_mode(rct_ride *ride) return availableModes[0]; } -static bool ride_with_colour_config_exists(rct_ride *srcRide, const track_colour *colours) +static bool ride_with_colour_config_exists(uint8 ride_type, const track_colour *colours) { rct_ride *ride; int i; FOR_ALL_RIDES(i, ride) { - if (ride != srcRide) continue; - if (ride->type != srcRide->type) continue; + if (ride->type != ride_type) continue; if (ride->track_colour_main[0] != colours->main) continue; if (ride->track_colour_additional[0] != colours->additional) continue; if (ride->track_colour_supports[0] != colours->supports) continue; @@ -5146,25 +5148,37 @@ static bool ride_name_exists(char *name) /** * - * rct2: 0x006B4776 + * Based on rct2: 0x006B4776 */ -static void ride_set_to_random_colour_preset(rct_ride *ride) +static int ride_get_random_colour_preset_index(uint8 ride_type) { const track_colour_preset_list *colourPresets; const track_colour *colours; - colourPresets = RCT2_ADDRESS(0x0097D934, track_colour_preset_list*)[ride->type]; + colourPresets = RCT2_ADDRESS(0x0097D934, track_colour_preset_list*)[ride_type]; // 200 attempts to find a colour preset that hasn't already been used in the park for this ride type for (int i = 0; i < 200; i++) { - int listIndex = scenario_rand() % colourPresets->count; + int listIndex = util_rand() % colourPresets->count; colours = &colourPresets->list[listIndex]; - if (!ride_with_colour_config_exists(ride, colours)) { - break; + if (!ride_with_colour_config_exists(ride_type, colours)) { + return listIndex; } } + return 0; +} +/** + * + * Based on rct2: 0x006B4776 + */ +static void ride_set_colour_preset(rct_ride *ride, uint8 index) { + const track_colour_preset_list *colourPresets; + const track_colour *colours; + + colourPresets = RCT2_ADDRESS(0x0097D934, track_colour_preset_list*)[ride->type]; + colours = &colourPresets->list[index]; for (int i = 0; i < 4; i++) { ride->track_colour_main[i] = colours->main; ride->track_colour_additional[i] = colours->additional; @@ -5221,7 +5235,7 @@ static bool shop_item_has_common_price(int shopItem) * * rct2: 0x006B3F0F */ -money32 ride_create(int type, int subType, int flags, int *outRideIndex) +money32 ride_create(int type, int subType, int flags, int *outRideIndex, int *outRideColour) { char rideNameBuffer[256]; rct_ride *ride; @@ -5249,6 +5263,14 @@ foundRideEntry: } *outRideIndex = rideIndex; + // Ride/vehicle colour is calcualted before applying to ensure + // correct colour is passed over the network. + if (!(flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_NETWORKED)) { + *outRideColour = + ride_get_random_colour_preset_index(type) | + (ride_get_unused_preset_vehicle_colour(type, subType) << 8); + } + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = 0x8000; @@ -5259,7 +5281,7 @@ foundRideEntry: rideEntry = GET_RIDE_ENTRY(rideEntryIndex); ride->type = type; ride->subtype = rideEntryIndex; - ride_set_to_random_colour_preset(ride); + ride_set_colour_preset(ride, *outRideColour & 0xFF); ride->overall_view = 0xFFFF; // Ride name @@ -5448,7 +5470,7 @@ foundRideEntry: ride->num_circuits = 1; ride->mode = ride_get_default_mode(ride); ride->min_max_cars_per_train = (rideEntry->min_cars_in_train << 4) | rideEntry->max_cars_in_train; - ride_set_vehicle_colours_to_random_preset(ride); + ride_set_vehicle_colours_to_random_preset(ride, 0xFF & (*outRideColour >> 8)); window_invalidate_by_class(WC_RIDE_LIST); RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; @@ -5462,7 +5484,7 @@ foundRideEntry: */ void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) { - *ebx = ride_create(*edx & 0xFF, (*edx >> 8) & 0xFF, *ebx & 0xFF, edi); + *ebx = ride_create(*edx & 0xFF, (*edx >> 8) & 0xFF, *ebx, edi, eax); } void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) @@ -6743,6 +6765,11 @@ void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int return; } + if (!(*ebx & GAME_COMMAND_FLAG_APPLY) && !(*ebx & GAME_COMMAND_FLAG_NETWORKED)) { + *eax = + ride_get_unused_preset_vehicle_colour(ride->type, ride->subtype); + } + if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { *ebx = 0; return; @@ -6770,7 +6797,7 @@ void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int break; case RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY: ride->subtype = value; - ride_set_vehicle_colours_to_random_preset(ride); + ride_set_vehicle_colours_to_random_preset(ride, *eax & 0xFF); break; } diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index bf4ade6109..44d14d0a8d 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -1211,7 +1211,7 @@ TRACK_PAINT_FUNCTION* shop_track_paint_functions[] = { */ void shop_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { - int al = sub_6629BC(height, 0, RCT2_GLOBAL(0x00F441A4, uint32), direction & 1); + bool hasSupports = sub_6629BC(height, 0, RCT2_GLOBAL(0x00F441A4, uint32), direction & 1); RCT2_GLOBAL(0x0141E9D0, sint16) = -1; RCT2_GLOBAL(0x0141E9C4, sint16) = -1; @@ -1236,12 +1236,7 @@ void shop_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int sint16 height16 = (sint16)height; int rotation = get_current_rotation(); - if (al) { - RCT2_GLOBAL(0x009DEA52, uint16) = 2; - RCT2_GLOBAL(0x009DEA54, uint16) = 2; - RCT2_GLOBAL(0x009DEA56, sint16) = height16; - sub_98197C(0, 45, imageId, 0, height, 28, 28, rotation); - } else { + if (hasSupports) { uint32 foundationImageId = RCT2_GLOBAL(0x00F441A4, uint32); foundationImageId |= 3395; @@ -1253,7 +1248,12 @@ void shop_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int RCT2_GLOBAL(0x009DEA52, uint16) = 2; RCT2_GLOBAL(0x009DEA54, uint16) = 2; RCT2_GLOBAL(0x009DEA56, sint16) = height16; - sub_98199C(0, 45, imageId, 0, height, 28, 28, rotation); + sub_98199C(0, 45, imageId, 0, height, 28, 28, rotation); + } else { + RCT2_GLOBAL(0x009DEA52, uint16) = 2; + RCT2_GLOBAL(0x009DEA54, uint16) = 2; + RCT2_GLOBAL(0x009DEA56, sint16) = height16; + sub_98197C(0, 45, imageId, 0, height, 28, 28, rotation); } height16 += 48; diff --git a/src/windows/ride.c b/src/windows/ride.c index 88086e816a..b222be3b2a 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -1597,8 +1597,11 @@ static void window_ride_init_viewport(rct_window *w) */ void window_ride_construct(rct_window *w) { + // Window may be closed by close by class so + // make backup before calling. + uint8 rideIndex = w->number; window_close_by_class(WC_RIDE_CONSTRUCTION); - ride_construct(w->number); + ride_construct(rideIndex); } /** @@ -3457,6 +3460,21 @@ static void window_ride_maintenance_dropdown(rct_window *w, int widgetIndex, int case WIDX_FORCE_BREAKDOWN: if (dropdownIndex == 0) { switch (ride->breakdown_reason_pending) { + case BREAKDOWN_SAFETY_CUT_OUT: + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) + break; + for (int i = 0; i < ride->num_vehicles; ++i) { + uint16 spriteId = ride->vehicles[i]; + do { + vehicle = GET_VEHICLE(spriteId); + vehicle->update_flags &= ~( + VEHICLE_UPDATE_FLAG_BROKEN_CAR | + VEHICLE_UPDATE_FLAG_7 | + VEHICLE_UPDATE_FLAG_BROKEN_TRAIN + ); + } while ((spriteId = vehicle->next_vehicle_on_train) != 0xFFFF); + } + break; case BREAKDOWN_RESTRAINTS_STUCK_CLOSED: case BREAKDOWN_RESTRAINTS_STUCK_OPEN: case BREAKDOWN_DOORS_STUCK_CLOSED: diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 092fd3e6cc..fedc79a3e7 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -30,6 +30,7 @@ #include "error.h" #include "../interface/themes.h" #include "../rct1.h" +#include "../network/network.h" enum { WIDX_BACKGROUND, @@ -145,6 +146,13 @@ void window_track_list_open(ride_list_item item) RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 0; window_push_others_right(w); RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 2; + +#ifndef NETWORK_DISABLE + // TODO: FIX NETWORK TRACKS + // Until tracks work with the network this will disable them + if (network_get_mode() != NETWORK_MODE_NONE) + RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8)[0] = 0; +#endif } /**